МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
З В І Т
до лабораторної роботи №5
з курсу: «Системи запису та відтворення інформації»
на тему: «ПОБУДОВА СИСТЕМИ ЗБЕРІГАННЯ ІНФОРМАЦІЇ НА MMC\SD FLASH-КАРТАХ ПАМ‘ЯТІ З ПІДТРИМКОЮ ФАЙЛОВОЇ СИСТЕМИ FAT16»
Варіант №1
Мета роботи – набути вміння організовувати файловий ввід-вивід даних на Flash-носіях інформації в портативних аудіо- та відеопристроях.
ЗАВДАННЯ:
Ознайомитись з теоретичним матеріалом..
Відкрити файл образу MMC/SD-карти SD_512.bin в програмі WinHex і визначити основні параметри файлової системи FAT16.
Визначити основні параметри файлової системи в середовищі MatLab з допомогою розглянутих функцій і програм для образу MMC/SD-карти SD_512.bin.
Визначити основні параметри файлової системи в середовищі MatLab з допомогою розглянутих функцій і програм для образу MMC/SD-карти SD_512.bin.
Порівняти вміст зчитаного файлу в середовищі MatLab і WinHex.
Варіант
Назва файлу
1
FILE1.C
ЛІСТИНГ ПРОГРАМИ
clear all;
BytesPerSec = 512;
Buffer = zeros(BytesPerSec, 1);
s = MMC_SD_Init('D:\Student\Lab_5\SD_512.bin');
VBR_Addr = 0;
LBA = 0;
[Buffer, cl] = MMC_SD_Read_Sector(s, LBA);
if (Buffer(511) ~= hex2dec('55')| Buffer(512) ~= hex2dec('AA'))
disp ('VBR FAT Error1');
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);
NumFATs = Buffer(hex2dec('10') + 1);
z = sprintf ('Кількість таблиць FAT: %d', NumFATs);
disp (z);
RootEntCnt = Buffer(hex2dec('11') + 1) + 256 * Buffer(hex2dec('12') + 1);
z = sprintf ('Кількість записів в кореневому каталозі Root Directory: %d', RootEntCnt);
disp(z);
TotSec = Buffer(hex2dec('13') + 1) + 256 * Buffer(hex2dec('14') + 1);
if TotSec ==0
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);
SecPerFAT = Buffer(hex2dec('16') + 1) + 256 * Buffer(hex2dec('17') + 1);
z = sprintf ('Розмір таблиці FAT y ceктоpax: %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('3A')+ 1)~='6')
disp('FAT16 Error');
end;
temp = Buffer ((hex2dec('36') + 1):(hex2dec ('3A' + 1)));
z = sprintf ('Тип файлової системи: %s', char(temp));
disp (z) ;
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;
RootDir_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs;
z = sprintf ('Перший сектор Root Directory: %d', RootDir_Sect);
disp(z) ;
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) ;
temp = RootDir_Sect;
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) = 32;
File_Name(7) = 32;
File_Name(8) = 32;
File_Name(9) = 'C';
File_Name(10) = 32;
File_Name(11) = 32;
for jj = 1 : RootDir_SectCnt
[Buffer, cl] = MMC_SD_Read_Sector(s, temp);
temp = temp + 1;
Flag_S = 0;
count = 1;
for ii = 1 : 16
RTE = Buffer(count : count + 10);
count = count + 32;
if(sum(RTE == File_Name) == 11)
Flag_S = 1;
break;
end;
end;
if (Flag_S == 1)
disp('File знайдено');
break;
end;
end;
if (Flag_S ~= 1)
disp('File не знайдено');
fclose(s);
return;
end;
count = count - 32;
File_FirstCluster = Buffer(count + 26) + 256 * Buffer(count + 27);
z = sprintf('Перший кластер файлу: %d', File_FirstCluster);
disp(z);
File_Size = Buffer(count + 28) + 256 * Buffer(count + 29) + 16^3 * Buffer(count + 30) + 16^4 * Buffer(count + 31);
z = sprintf ('Розмір файлу: %d байт', File_Size) ;
disp (z) ;
Sectors_Per_File= ceil(File_Size/BytesPerSec);
z = sprintf ('Кількість секторів у файлі: %d', Sectors_Per_File) ;
disp (z) ;
Cluster_Per_File = ceil( Sectors_Per_File/SecPerClus);
z = sprintf ('Кількість кластерів у файлі: %d', Cluster_Per_File) ;
disp (z) ;
File_FirstSector = (File_FirstCluster -2)* SecPerClus + Data_Sect;
z = sprintf('Перший сектор файлу: %d', File_FirstSector);
disp(z);
Sector_Count=1;
Next_Cluster=File_FirstCluster;
Next_Sector= File_FirstSector;
while(File_Size >0)
%прочитати сектор даних
[Buffer,count]=MMC_SD_Read_Sector(s, Next_Sector);
Next_Sector=Next_Sector+1;
Sector_Count=Sector_Count+1;
% вивести вміст сектору файлу
z=sprintf('%c', Buffer);
disp(z);
File_Size=File_Size-512;
% якщо потрібно прочитати наступний кластер
if((File_Size>0) & (Sector_Count>SecPerClus))
%визначити номер сектора з FAT, який містить вказівник на наступний кластер
Address= FAT_Sect1 +fix((Next_Cluster*2)/512);
%прочитати сектор FAT
[Buffer,count] = MMC_SD_Read_Sector(s, Address);
% визначити номер наступного кластеру даних у файлі
Next_Cluster= Buffer(Next_Cluster*2+1)+2^8*Buffer(Next_Cluster*2+2);
% визначити номер першого сектора наступного кластеру даних
Next_Sector = (Next_Cluster-2)*SecPerClus+Data_Sect;
% продовжити з першого сектора нового кластеру
Sector_Count=1;
end;
end;
% завершення роботи з MMC/SD-картою
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
File знайдено
Перший кластер файлу: 17
Розмір файлу: 54266 байт
Кількість секторів у файлі: 106
Кількість кластерів у файлі: 7
Перший сектор файлу: 768
Read Sector Number 768
ВИСНОВОК
На цій лабораторній роботі я навчився розробляти алгоритми вводу-виводу даних на Flash-носіях аудіо та відео пристроях. Розглянув структуру файлової системи FAT-16 і змоделювали роботу карти пам’яті у системі Matlab.