Побудова системи зберігання інформації на MMCSDFLASH-картах пам‘яті з підтримкою файлової системи FAT16

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
ЗІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Системи запису та відтворення інформації
Група:
ЗІ-31

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА кафедра ЗІ З В І Т до лабораторної роботи №5 з курсу: «Системи запису та відтворення інформації» на тему: «Побудова системи зберігання інформації на MMC\SDFLASH-картах пам‘яті з підтримкою файлової системи FAT16» МЕТА РОБОТИ Набути вміння організовувати файловий ввід-вивід даних на Flash-носіях інформації в портативних аудіо- та відеопристроях. ЗАВДАННЯ Ознайомитись з теоретичним матеріалом.. Відкрити файл образу MMC/SD-карти SD_512.bin в програмі WinHex і визначити основні параметри файлової системи FAT16. Визначити основні параметри файлової системи в середовищі MatLab з допомогою розглянутих функцій і програм для образу MMC/SD-карти SD_512.bin. Написати функцію в середовищі MatLab, яка б зчитувала з двійкового образу SD_512.bin файл з заданим ім’ям ( як це робиться в FAT16) і виводила його вміст в робочу область. Ім’я файлу задано в таблиці 7. Порівняти вміст зчитаного файлу в середовищі MatLab і WinHex. Варіант Назва файлу  13 FILE13.C   ТЕКСТ ПРОГРАМИ % Кількість байт в секторі BytesPerSec = 512; % Буфер для читання/запису даних Buffer = zeros(BytesPerSec, 1); % 1. Переводимо карту в активний режим s = MMC_SD_Init('D:\SD_512.bin'); % 2. Прочитати 0 сектор - VBR % Номер сектора з якого починається VBR VBR_Addr = 0; LBA = 0; [Buffer, c1] = MMC_SD_Read_Sector(s, LBA); % Перевіряємо сигнатуру VBR if (Buffer(511) ~= hex2dec('55') & Buffer(512) ~= hex2dec('AA')) disp('VBR FAT Error'); return; end; % Визначаємо кількість байт в секторі BytesPerSec = Buffer(hex2dec('b') + 1) + 2^8 * Buffer(hex2dec('b') + 2); z = sprintf('Кількість байт в секторі: %d', BytesPerSec); disp(z); % Визначаємо кількість секторів в кластері SecPerClus = Buffer(hex2dec('d') + 1); z = sprintf('Кількість секторів в кластері: %d', SecPerClus); disp(z); % Кількість зарезервованих секторів від початку карти RsvdSecCnt = Buffer(hex2dec('e') + 1) + 256 * Buffer(hex2dec('f') + 1); z = sprintf('Кількість зарезервованих секторів від початку карти: %d', RsvdSecCnt); disp(z); % Кількість таблиць FAT NumFATs = Buffer(hex2dec('10') + 1); z = sprintf('Кількість таблиць FAT: %d' , NumFATs); disp(z); % Кількість записів в Root Directory RootEntCnt = Buffer(hex2dec('11') + 1) + 256 * Buffer(hex2dec('12') + 1); z = sprintf('Кількість записів в кореневому каталозі Root Directory: %d', RootEntCnt); disp(z); % Кількість секторів MMC/SD-карти (до 32 MB) TotSec = Buffer(hex2dec('13') + 1) + 256 * Buffer(hex2dec('14') + 1); if TotSec == 0 % MMC/SD-карта > 32 MB TotSec = Buffer(hex2dec('20') + 1) + 256 * Buffer(hex2dec('21') + 1) + 2^16 * Buffer(hex2dec('22') + 1) + 2^24 * Buffer(hex2dec('23') + 1); end; z = sprintf('Загальна кількість секторів MMC/SD-карти: %d', TotSec); disp(z); % Розмір таблиці FAT у секторах SecPerFAT = Buffer(hex2dec('16') + 1) + 256 * Buffer(hex2dec('17') + 1) ; z = sprintf('Розмір таблиці FAT усекторах: %d', SecPerFAT); disp(z); if (Buffer(hex2dec('36') + 1) ~= 'F'& Buffer(hex2dec('37') + 1) ~= 'A'& Buffer(hex2dec('38') + 1) ~= 'T'& Buffer(hex2dec('39') + 1) ~= '1'& Buffer(hex2dec('ЗА') + 1) ~= '6') disp('FAT16 Error'); end; temp = Buffer((hex2dec('36') + 1):(hex2dec('3A') + 1)); z = sprintf('Тип файлової системи: %s', char(temp)); disp(z); % Обчислюємо номер сектору з якого починається таблиця FAT1 та FAT2 FAT_Sect1 = VBR_Addr + RsvdSecCnt; z = sprintf('Перший сектор FAT1: %d', FAT_Sect1); disp(z); if (NumFATs > 1) FAT_Sect2 = FAT_Sect1 + SecPerFAT; z = sprintf('Перший сектор FAT2: %d', FAT_Sect2); disp(z) ; end; % Обчислюємо номер сектору з якого починається кореневий каталог Root Directory RootDir_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs; z = sprintf('Перший сектор Root Directory: %d', RootDir_Sect); disp(z); % Обчислюємо кількість секторів в Root Directory RootDir_SectCnt = RootEntCnt * 32 / BytesPerSec; z = sprintf('Кількість секторів в Root Directory: %d', RootDir_SectCnt); disp(z) ; % Обчислюємо номер сектора початку області даних Data_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs + RootDir_SectCnt; z = sprintf('Номер сектора початку області даних: %d', Data_Sect); disp(z); FileName = zeros(1, 11); FileName(1) = 'F'; FileName(2) = 'I'; FileName(3) = 'L'; FileName(4) = 'E'; FileName(5) = '1'; FileName(6) = '3'; FileName(7) = 32; % Пробіл FileName(8) = 32; FileName(9) = 'C'; FileName(10) = 32; FileName(11) = 32; ByteCnt = 1; Flag_File = 0; % Прапорець знаходження файлу for jj = 1 : RootDir_SectCnt % Від 1-го до останнього сектору RootDirectory Buffer = MMC_SD_Read_Sector(s, RootDir_Sect + jj - 1); % Читає поточний сектор for ii = 1 : RootDir_SectCnt temp = Buffer(ByteCnt : ByteCnt + 10); % Читає перші 11 байт (1-ші байти запису - імя та розширення файлу) ByteCnt = ByteCnt + 32; % Наступний запис (1 запис--32байти) if ByteCnt > RootEntCnt-1 ByteCnt = 1; break; end if sum((temp' == FileName)) == 11 % По символьно порівнюємо, співпадає 1-ий елем. -- 1,сума одиничок = 11 z = sprintf('Файл знайдено'); Flag_File = 1; disp(z); break; end; end; if (Flag_File == 1) break; end; end; if(Flag_File == 0) z = sprintf('Файл не знайдено'); disp(z); return; % Вихід з програми end; Entry = Buffer(32*(ii-1) + 1 : 32*(ii-1) + 1 +31); % Саме той запис в Root Directory , де наш файл DIR_F = Entry(27) + 256 * Entry(28); %DIR_F - перший кластер з даними файлу 26:27 - позиція байту його розмір = 2 z = sprintf('Номер першого кластеру файла: %d', DIR_F); disp(z); File_size = Entry(29) + 256 * Entry(30)+256*256 * Entry(31)+ 256*256*256 * Entry(32); z = sprintf('Розмір даного файлу: %d', File_size); disp(z); Sec_file = DIR_F * SecPerClus + RootDir_Sect; z = sprintf('Перший сектор файлу: %d', Sec_file); disp(z); Sectors_file = ceil(File_size/(BytesPerSec)); z = sprintf('Кількість секторів файлу: %d', Sectors_file); disp(z); Claster_file = ceil(Sectors_file/SecPerClus); z = sprintf('Кількість кластерів файлу: %d', Claster_file); disp(z); if Claster_file ~= 1 Fat16 = zeros(Claster_file,1); Fat16(1,1) = DIR_F; t=DIR_F; for i = 1:Claster_file-1 Buffer = MMC_SD_Read_Sector(s,FAT_Sect1); t = Buffer(t*2+1)+ 256 * Buffer(t*2+2); Fat16(i+1,1) = t; end else for ii = 1 : SecPerClus Buffer = MMC_SD_Read_Sector(s,Sec_file+ii-1); z = sprintf('%c',Buffer); disp(z); end return; end Pr_sector=0; for i = 1:Claster_file Read_claster = Fat16(i,1); for ii = 1 : SecPerClus if Pr_sector == Sectors_file break; else Buffer= MMC_SD_Read_Sector(s,Read_claster*SecPerClus+RootDir_Sect+ii-1); z = sprintf('%c',Buffer); disp(z); Pr_sector = Pr_sector + 1; end; end end fclose(s); РЕЗУЛЬТАТ ВИКОНАННЯ РОБОТИ MMC/SD-CARD INIT КІЛЬКІСТЬ БАЙТ В СЕКТОРІ: 512 КІЛЬКІСТЬ СЕКТОРІВ В КЛАСТЕРІ: 16 КІЛЬКІСТЬ ЗАРЕЗЕРВОВАНИХ СЕКТОРІВ ВІД ПОЧАТКУ КАРТИ: 4 КІЛЬКІСТЬ ТАБЛИЦЬ FAT: 2 КІЛЬКІСТЬ ЗАПИСІВ В КОРЕНЕВОМУ КАТАЛОЗІ ROOT DIRECTORY: 512 ЗАГАЛЬНА КІЛЬКІСТЬ СЕКТОРІВ MMC/SD-КАРТИ: 1006359 РОЗМІР ТАБЛИЦІ FAT УСЕКТОРАХ: 246 ТИП ФАЙЛОВОЇ СИСТЕМИ: FAT16 ПЕРШИЙ СЕКТОР FAT1: 4 ПЕРШИЙ СЕКТОР FAT2: 250 ПЕРШИЙ СЕКТОР ROOT DIRECTORY: 496 КІЛЬКІСТЬ СЕКТОРІВ В ROOT DIRECTORY: 32 НОМЕР СЕКТОРА ПОЧАТКУ ОБЛАСТІ ДАНИХ: 528 ФАЙЛ ЗНАЙДЕНО НОМЕР ПЕРШОГО КЛАСТЕРУ ФАЙЛА: 34 РОЗМІР ДАНОГО ФАЙЛУ: 15752 ПЕРШИЙ СЕКТОР ФАЙЛУ: 1040 КІЛЬКІСТЬ СЕКТОРІВ ФАЙЛУ: 31 КІЛЬКІСТЬ КЛАСТЕРІВ ФАЙЛУ: 2  РЕЗУЛЬТАТ ВИКОНАННЯ ПРОГРАМИ WINHEX  ВИСНОВОК Для виконання даної лабораторної роботи я навчився організовувати файловий ввід-вивід даних на Flash-носіях інформації у портативних аудіо- та відео пристроях. Написав програму у середовищі MATLAB, яка дає змогу зчитувати з двійкового образу SD_512.bin файл з заданим ім’ям ( як це робиться в FAT16) і виводить його вміст в робочу область. Відкрив файл образу SD-карти SD_512.bin в програмі WinHex і визначив основні параметри файлової системи FAT16. Порівняв отримані результати у середовищах WinHex та MATLAB.
Антиботан аватар за замовчуванням

11.03.2014 02:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!