| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. |
| Автор: 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 | ||
А банальный format вас не устроит? Или у вас какой то весь в конец нестандартный FAT? |
| Автор: BenGan 2.11.2011, 21:24 | ||
Нет, форматировать не надо. Файл формируется на предварительно отформатированной флешке. С абсолютно стандартной FAT32. Сейчас я могу забить любой сектор флеш карты, например кодом 0xEE. Ноэто же не файл. Файл должен кто-то сделать. Это и есть моя задача. |
| Автор: xvr 3.11.2011, 16:28 |
Вам нужен сделать обычный файл на флэшке, вставленной в 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 | ||
что то я в этом сомневаюсь, для такого варианта нужно использовать именно платформонезависимое (fopen/fwrite). |
| Автор: math64 4.11.2011, 15:40 | ||||
Насколько я понял, в API контроллера не файловой системы - поэтому нет fopen/fwrite. А есть что-то типа
Эти функции нужно реализовать с помощью WinAPI, отладиться и после этого всё перенести в контроллер. |
| Автор: 500mhz 4.11.2011, 17:42 |
| а может ТС не стоит изобретать велосипед? есть прожка rawwrite с ней идет diskio.dll и сорцы тоже http://www.chrysocome.net/rawwrite как бы само проситься быть использованым |
| Автор: BenGan 4.11.2011, 21:59 | ||||||
Совершенно верно! У контроллера Atmel Atmega64 нет никакой API. А компилятор С есть. Функцию чтения записи сектора я уже написал, для этого приходится разбудит флешку, посылать импульсы на одну ножку, затем иницилизировать через итерфейс SPI внутренние регистры флешки и потом можно обращаться к сектору паямяти 512 байт. Естественно, компилятор знать не может, что к контроллеру припаяна флеш карта. Работать с контроллером неудобно, поэтому хочется отладить логику создания файла на обычном компьютере. В отлаженном коде создания файла только и надо будет, подменить функции обращения к диску на мои функции записи/чтения сектора. Только вот копризничает Windows не хочет CreateFile() работаь.
hDevice возвращает 0xFFFFFF а текстовоя строка, соответствующая коду ошибки - "Ёль". Мож кто-то сталкивался с чем-то похожим?
Качнул, разбираюсь... |
| Автор: tzirechnoy 6.11.2011, 09:49 | ||
[QUOTE=BenGan,4.11.2011, 21:59]
Обратных слэшэй в имени файла маловато. Компилятор C в строковых константах использует обратный слэш как экранирующий символ для вызова спец.возможностей (напр. \n переводится в перевод строки (0x13)), соответственно, каждый настоящий обратный слэш должэн удваиваться: "\\\\.\\G:" |
| Автор: BenGan 6.11.2011, 11:32 | ||||
Спасибо! Заработало!
Здесь код на паскале, часть кода спрятана в DLL. Я пользуюсь : http://www.dharmanitech.com/ Там, в самом низу страницы, исходники процедур создания файла под FAT32 и хорошие ссылки по описанию самой FAT. Может кому полезно будет. |