olki (15.03.2011 13:53, просмотров: 7507)
SD-карта, FAT16, длина файла, его дозапись и грабли... Здравствуйте ув. софорумяне.
Понимаю, что - "многабукаФФ", но иначе проблему не описать.
Тут вот возникла такая ситуация. Я делаю нечто, вроде логгера. Т.е. - прибор с PIC18F452 и SD-картой (1 Гиг). Смысл: вставил в прибор карту, на которой создан компом ЕДИНСТВЕННЫЙ пустой файл с фиксированным именем "LOGGER.TXT". (Карта, есс-но отформатирована под FAT16). Прибор нашел в Root_Directory имя файла, номер первого кластера файла и длину файла в БАЙТАХ. Пробежался по FAT-у, нашел последний кластер и последний байт в файле, прицепил к нему очередную порцию дописываемых байтов, пересчитал новую длину файла, проверил, помещается ли это дописывание в последний кластер (если нет- добавил еще один), записал в этот кластер и, соответственно - внес изменения в FAT. Это так задумывается и вроде бы логично.
Теперь о граблях.
Я решил "пройтись по SD-карточке" WinHex-ом, чтобы проверить как правильность своего понимания, так и вышеописанную логику дозаписи в файл.
Для этого - отформатиовал карту (и даже дефрагментировал ее на всяк случай), создал один-единственный файл "LOGGER.TXT" в FAR-е. В начале файла записал слово "НАЧАЛО" , далее - кучу "*" и в конце - слово "KONEC" (для ориентирования при просмотре WinHex-ом). Файл создал специально длиной 65867 байт (что подтверждается как в его свойствах на компе, так и проверочным вычислением из соотв. байтов в Root_Directory). Смотрю WinHex-ом в FAT - да, там цепочка кластеров с номерами 03 -> 04 -> 05 -> 06 -> FF, (естественно - в Root_Directory номер начального кластера равен 02). Т.е. - 06 - это номер ПОСЛЕДНЕГО кластера с данными файла.
ИТОГО - получается, что файл занимает 5 кластеров (с номерами от 02 до 06 включительно).
И тут начинается САМОЕ интересное: я решил проверить сколько ЦЕЛЫХ кластеров занимает файл, и в каком месте последнего кластера находится его (файла) остаток.
Знаем, что в секторе помещается 512 байт, а в кластере - 32 таких сектора (и это подтверждается просмотром PBR-а карты!), и значит длина кластера в байтах равна 32 * 512 = 16384 байта. Исходя из этого - файл ДОЛЖЕН занимать 4 полных кластера и в 5-м кластере - его остаток, равный 331 байт ( 65867 - (4 * 16384) = 331 ).
Проверяю WinHex-ом:
1. Выч.физич. адрес начала первого кластера (с номером 02) : 0х00060200, захожу по этому адресу - все ОК, там слово "НАЧАЛО" и далее - куча " * ", так и надо.
2. Выч.физич. адрес начала след. кластера (с номером 03) : 0х00064200, захожу по этому адресу - все ОК, там куча " * ", так и надо.
3. Выч.физич. адрес след. кластера (с номером 04) : 0х00068200, захожу по этому адресу - все ОК, куча " * ", так и надо.
4. Выч.физич. адрес след. кластера (с номером 05) : 0х0006С200, захожу по этому адресу - И ТУТ !! Должна быть " * " до самого конца кластера, а слово " KONEC " - в кластере номер 06 (физич. адрес 0х0007020).
В реале же - слово " KONEC" находится в кластере с номером 05 !! и по физич. адресу 0x0006D568!, т.е. между началом 5-го и началом 6-го кластеров (т.е. в 5-м кластере!)
Что за фигня?! Я несколько раз пересчитал и перепроверил, карта нормальная, файл - нормально воспринимается компом, битых кластеров - нет!
Где я и что не так делаю? Подскажите, плиз, уже крыша начинает съезжать. Если можно - киньте формулу, как рассчитать правильно (видимо я чего-то недопонимаю).
Спасибо!