МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
З В І Т
до лабораторної роботи №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.
Варіант
Назва файлу
19
FILE19.C
ТЕКСТ ПРОГРАМИ
clear all;
% Кількістьбайт в секторі
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);
ifTotSec == 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);
File_Name = zeros(11, 1);
File_Name(1) = 'F';
File_Name(2) = 'I';
File_Name(3) = 'L';
File_Name(4) = 'E';
File_Name(5) = '1';
File_Name(6) = '9';
File_Name(7) = 32;
File_Name(8) = 32;
File_Name(9) = 'C';
File_Name(10) = 32;
File_Name(11) = 32;
ByteCnt = 1;
Flag_File = 0; %прапорецьзнаходженняфайлу
forjj = 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байти)
ifByteCnt> 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);
ifClaster_file ~= 1
Fat16 = zeros(Claster_file,1);
Fat16(1,1) = DIR_F;
t=DIR_F;
fori = 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;
fori = 1:Claster_file
Read_claster = Fat16(i,1);
for ii = 1 : SecPerClus
ifPr_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
Read Sector Number 0
Кількість байт в секторі: 512
Кількість секторів в кластері: 16
Кількість зарезервованих секторів від початку карти: 4
Кількість таблиць FAT: 2
Кількість записів в кореневому каталозі Root Directory: 512
Загальна кількість секторів MMC/SD-карти: 1006359
Розмір таблиці FAT y ceктоpax: 246
Тип файлової системи: FAT16 3{
Перший сектор FAT1: 4
Перший сектор FAT2 : 250
Перший сектор Root Directory: 496
Кількість секторів в Root Directory: 32
Номер сектора початку області даних: 528
Read Sector Number 496
Read Sector Number 497
File знайдено
Перший кластер файлу: 47
Розмір файлу: 13449 байт
Кількість секторів у файлі: 27
Кількість кластерів у файлі: 2
Перший сектор файлу: 1248
РЕЗУЛЬТАТ ВИКОНАННЯ РОБОТИ WINHEX
ВИСНОВОК
Для виконання даної лабораторної роботи я навчилась організовувати файловий ввід-вивід даних на Flash-носіях інформації у портативних аудіо- та відео пристроях.
Написала програму у середовищі MATLAB, яка дає змогу зчитувати з двійкового образу SD_512.bin файл з заданим ім’ям ( як це робиться в FAT16) і виводить його вміст в робочу область.
Відкрила файл образу SD-карти SD_512.bin в програмі WinHex і визначила основні параметри файлової системи FAT16. Порівняла отримані результатиу середовищах WinHexта MATLAB.