Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Работа с диском нанизком уровне


Автор: BenGan 31.10.2011, 19:35
Всем привет!

Подскажите, есть возможность из Builder обращаться к диску на уровне сектора?

Нужно работаь с флеш картой. Обкатать алгоритм создания и удаления файла под
FAT32, с тем, чтобы потом перенести этот алгоритм на контроллер.


Автор: tzirechnoy 31.10.2011, 23:12
\\.\C: 
букву по вкусу.
Есть ещё \Devices\Harddisk0\Partition0 для полного диска (включая таблицу разделов). Ну, или не Harddisk.

Автор: BenGan 1.11.2011, 12:31
\\.\C: 
букву по вкусу.
Есть ещё \Devices\Harddisk0\Partition0 для полного диска (включая таблицу разделов). Ну, или не Harddisk.

Вы что, издеваетесь? Это форум по С/С++ Builder, и вопрос был  - как из Builder обращаться к диску на уровне сектора?

Мне нужна функция C/C++ Builder, которая позволяет обращаться к диску на уровне сектора. Или непосредственно функция API Windows.
В DOS'овские времена это были т.н. короткое и длинное чтение, вызываемые через int 13. 

Автор: xvr 1.11.2011, 14:03
Цитата(BenGan @  1.11.2011,  12:31 Найти цитируемый пост)
Это форум по С/С++ Builder, и вопрос был  - как из Builder обращаться к диску на уровне сектора?

Вам и ответили. 
Цитата(BenGan @  1.11.2011,  12:31 Найти цитируемый пост)
Или непосредственно функция API Windows.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspxс именем файла, на который вы так буйно отреагировали  smile 
(См. раздел Physical Disks and Volumes по вышеприведенной ссылке)

Автор: BenGan 1.11.2011, 19:58
Тогда, извиняюсь, плохо объяснил.

Мне нужен физический доступ к диску на уровне сектора. 

Нужно читать Boot Sector BPB Structure, из прочитанных данных вычислять смещение по которому сидит дирректорий и FAT1, FAT2.
Дальше, заполнять поля  дирректории именем файла, его атрибутами и ссылкой на первый элемент цепочки FAT,
искать свободные кластеры, заполнять их данными и  формировать цепочку списка FAT. 

В общем, то, что делала DOS, и что делает Windows при создании файла. 
Потом, этот алгоритм будет перенесен на контроллер, на котором нет никакой 
операционной системы. Есть только физический доступ к произвольному сектору флеш карты, который я уже отладил.

То есть, тебуется самому формировать файловую структуру на флеш карте.
Ваша ссылка (См. раздел Physical Disks and Volumes по вышеприведенной ссылке) очень в тему, спасибо!

Наверное, я тупой, но можно-же было написать, что это путь Windows SDK "\Devices\Harddisk0\Partition0".
Я думал tzirechnoy отправил меня к какой-то программе, типа WinHex.
 

Автор: xvr 1.11.2011, 23:07
Цитата(BenGan @  1.11.2011,  19:58 Найти цитируемый пост)
То есть, тебуется самому формировать файловую структуру на флеш карте.

А банальный format вас не устроит? Или у вас какой то весь в конец нестандартный FAT?

Автор: BenGan 2.11.2011, 21:24
Цитата

А банальный format вас не устроит? Или у вас какой то весь в конец нестандартный FAT?


Нет, форматировать не надо.
Файл формируется на предварительно отформатированной флешке. С абсолютно стандартной FAT32.
Сейчас я могу забить любой сектор флеш карты, например кодом 0xEE. Ноэто же не файл.
Файл должен кто-то сделать. Это и есть моя задача.

Автор: xvr 3.11.2011, 16:28
Цитата(BenGan @  2.11.2011,  21:24 Найти цитируемый пост)
Файл должен кто-то сделать.

Вам нужен сделать обычный файл на флэшке, вставленной в PC? Тогда это делается обычными методами ОС (fopen/fwrite) и прямой доступ к секторам не нужен. Или у вас какие то особые требования к файлу?

Автор: math64 3.11.2011, 21:24
Ну, как я понял, ТС записать файл на флешку из микроконтоллера, в котором нет ОС, но для которого есть кросскомпилятор C или C++.
А для начала он хочет отладить программу на PC, где есть удобный отладчик (используется C++Builder).
При переносе на микроконтроллер функции Windows API будут заменены на API контроллера.
А в C++Builder специальных функций для этого нет - нужно использовать CreateFile.

Автор: 500mhz 4.11.2011, 13:14
Цитата

При переносе на микроконтроллер функции Windows API будут заменены на API контроллера.

что то я в этом сомневаюсь, для такого варианта нужно использовать именно платформонезависимое (fopen/fwrite).

Автор: math64 4.11.2011, 15:40
Цитата(500mhz @  4.11.2011,  13:14 Найти цитируемый пост)
что то я в этом сомневаюсь, для такого варианта нужно использовать именно платформонезависимое (fopen/fwrite).

Насколько я понял, в API контроллера не файловой системы - поэтому нет fopen/fwrite. А есть что-то типа
Код

void ReadSector(int sector, char* data, int size);
void WriteSector(int sector, char* data, int size);

Эти функции нужно реализовать с помощью WinAPI, отладиться и после этого всё перенести в контроллер.

Автор: 500mhz 4.11.2011, 17:42
а может ТС не стоит изобретать велосипед?
есть прожка rawwrite с ней идет diskio.dll и сорцы тоже http://www.chrysocome.net/rawwrite

как бы само проситься быть использованым

Автор: BenGan 4.11.2011, 21:59
Цитата

Насколько я понял, в API контроллера не файловой системы - поэтому нет fopen/fwrite. А есть что-то типа


Совершенно верно! У контроллера Atmel Atmega64 нет никакой API. А компилятор С есть. 

Функцию чтения записи сектора я уже написал, для этого приходится разбудит флешку, посылать импульсы на одну ножку, затем иницилизировать через итерфейс SPI внутренние регистры флешки и потом можно обращаться к сектору паямяти 512 байт. Естественно, компилятор знать не может, что к контроллеру припаяна флеш карта.

Работать с контроллером неудобно, поэтому хочется отладить логику создания файла на обычном компьютере. В отлаженном коде создания файла только и надо будет, подменить функции обращения к диску на мои функции записи/чтения сектора.

Только вот копризничает Windows не хочет CreateFile() работаь.

Код

HANDLE hDevice;
 BOOL fResult;
 DWORD cb,ErroCode;
 char InBuffer[512];
 char OutBuffer[512];
 char TextBuffer[512];

 hDevice =CreateFile("\\.\G:", GENERIC_READ, FILE_SHARE_WRITE,0,
                     OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

 if (hDevice == (HANDLE) INVALID_HANDLE_VALUE){

     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,
               GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &TextBuffer[0], 0,NULL);

     MessageBox( NULL, &TextBuffer[0], "GetLastError", MB_OK|MB_ICONINFORMATION );


hDevice возвращает 0xFFFFFF
а текстовоя строка, соответствующая коду ошибки - "Ёль". 

Мож кто-то сталкивался с чем-то похожим?

Цитата

есть прожка rawwrite с ней идет diskio.dll и сорцы тоже http://www.chrysocome.net/rawwrite

Качнул, разбираюсь...

Автор: tzirechnoy 6.11.2011, 09:49
[QUOTE=BenGan,4.11.2011,  21:59]
Цитата


 hDevice =CreateFile("\\.\G:", GENERIC_READ, FILE_SHARE_WRITE,0,


Обратных слэшэй в имени файла маловато. Компилятор C в строковых константах использует обратный слэш как экранирующий символ для вызова спец.возможностей (напр. \n переводится в перевод строки (0x13)), соответственно, каждый настоящий обратный слэш должэн удваиваться:
 "\\\\.\\G:"

Автор: BenGan 6.11.2011, 11:32
Цитата

 "\\\\.\\G:"


Спасибо! Заработало!

Цитата

есть прожка rawwrite с ней идет diskio.dll и сорцы тоже http://www.chrysocome.net/rawwrite

Здесь код на паскале, часть кода спрятана в DLL.

Я пользуюсь : http://www.dharmanitech.com/
Там, в самом низу страницы, исходники процедур создания файла под FAT32 и хорошие ссылки по описанию самой FAT.
Может кому полезно будет.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)