|
|
  |
MSP430 и FatFs, есть глюки |
|
|
|
Aug 24 2008, 18:38
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Приветствую. Нужна поддержка файловой системы в проекте. Решил использовать Tiny FatFs последней 006 версии. Нашел в инете порт для sd-card  и вроде сразу заработало, чему я удивился. Но со временем начали вылезать проблемы. В итоге обнаружил пару мест в софте, которые пришлось править. Например функция get_cluster в коде имела такую строчку Код if (clust >= 2 && clust < fs->max_clust) { /* Valid cluster# */ что ИАРом V4.10A воспринялось неправильно без скобок  ну и т.д. А вопрос собственно про другое  . Это баг или фича, что я не могу записать файл размером более 2048 байт??? Кстати использую микроСД если это важно. Спасибо.
|
|
|
|
|
Aug 24 2008, 19:04
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(jorikdima @ Aug 24 2008, 20:38)  что ИАРом V4.10A воспринялось неправильно без скобок... Я Вас умоляю, не надо обвинять IAR в потрясении основ приорететов операций в языке "C". Цитата ну и т.д. ??? FatFs вполне аккуратно писанная система. Закос под 8bit слегка убрать и вообще хорошо становится. Ну разве только из мелочевочку с лишними переменными подправить, да умножения и деления поубирать не надеясь на оптимизацию. Цитата не могу записать файл размером более 2048 байт??? Файлы, естественно, пишутся любых размеров - это относится к FatFs, а к неведомым ее модификациям "из интернета".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 24 2008, 19:12
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(zltigo @ Aug 24 2008, 23:04)  Я Вас умоляю, не надо обвинять IAR в потрясении основ приорететов операций в языке "C". Файлы, естественно, пишутся любых размеров - это относится к FatFs а к неведомым ее модификациям "из интернета". тем не менее глюк в дебаггере я видел. Переменная clust была в нужном диапазоне, а условие не выполнялось. Я использую не Цитата неведомым ее модификациям "из интернета" , а скачаную с сайта автора. Из интернета реализация записи/чтения с карты. Сейчас в дебуггере выяснил что неработает как надо ветка streach cluster chain в функции f_write . Точнее пока сказать не могу, сам понимаю, что описание мной проблемы недостаточно. Буду копать, чтоб выяснить что не работает, тогда и спрошу конкретнее. Пока главное что я узнал от вас, что файлы все же пишуться любых размеров
|
|
|
|
|
Aug 24 2008, 20:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(jorikdima @ Aug 24 2008, 21:12)  тем не менее глюк в дебаггере я видел.... Ну нет такой проблемы и быть не может, ибо это практически "святое"  Цитата Сейчас в дебуггере выяснил.... Начните с простейших действий, которые требуются при портировании с 8-бит. Сразу не думая особо - паковка структур, размер int, байтовые переменные под int(опционально), а то сразу дебагер  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 2 2008, 06:44
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
в итоге проблема решилась заменой флешки  вместо 128 меговой микро взял 1 Гб. Насколько я увидел там другой размер кластера и как-то все заработало, хотя так толком и не понял в чем была проблема, ибо деталей файловой системы не знаю. Но появилась проблема №2. У меня ведется логирование на флешку с АЦП. Я поступаю следующим образом: создаю в памяти кольцевой буфер, внего в прерывании от АЦП кладу намерянные данные по 8 байт 512 раз в секунду. Затем в фоне когда данных в буфере, скажем, половина от размера буфера или более, я вычитываю их и делаю f_write() на флешку. При этом длительность функции записи не должна превышать время в течении которого весь мой кольцевой буфер заполнится данными в прерываниях. То есть я должен гарантировать длительность работы функции f_write() не более чем сколько то. Так вот я решил померить сколько занимает запись и получилось следующее: Пока мы запимали данных менее чем 512 байт запись почти мгновенна, ибо пишется в локальный массив ФС вОЗУ и флешь не используется. Если количество уже записанных данных переваливает за 512 байт, то это переписывается на флешь и занимает где-то 10 тиков ОС (я все в тиках меряю, а они равны почти 2 мс). Если количество уже записанных данных переваливает за 4к (размер кластера), то длительность около 45 тиков. Все это приемлемо и относительно стабильно (+- пара тиков). Но, если логировать около пары-тройки минут, то на графике видно, что случаются ситуации, причем совершенно не ожиданно, когда запись длится заметно больше, вплоть до 120 тиков. Случается это не с какой-то периодичностью, а случайно. Поэтому поставить брейкпоинт и пройти по шагам не представляется возможным, ибо узнаешь о длительной записи только постфактум. Писал я данные с постоянной длинной, один раз 110*8 байт, один раз 64*8 байт. В аттаче результаты, первая колонка длительность в тиках, вторая скалько данных писалось. Почему так? Флешка периодически тормозит?  Кстати тактируется она частотой около 800 кГц.
Прикрепленные файлы
fs.rar ( 109.91 килобайт )
Кол-во скачиваний: 131
|
|
|
|
|
Sep 2 2008, 07:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(jorikdima @ Sep 2 2008, 08:44)  в итоге проблема решилась заменой флешки  вместо 128 меговой микро взял 1 Гб. Насколько я увидел там другой размер кластера и как-то все заработало, хотя так толком и не понял в чем была проблема... Работает с любым размером флешки и кластеров на ней. Проверялось "электроникой" в диапазоне от 16M до 4G и разным форматированием. Сдается мне, что Вы небрежно с собственно железом работаете  Цитата совершенно не ожиданно, когда запись длится заметно больше, вплоть до 120 тиков. Случается это не с какой-то периодичностью, а случайно. Флешка немножко живет своей жизнью  . Просто поставьте контроль за заметным превышением времени ожидания готовности - увидите. Естественно и переходы другому кластеру за пределами фрагмента FAT таблицы загруженной в текущий 512B буфер, тоже задержку (записали текущий-загрузили новый фрагмент FAT) вызывают. При дефрагментации - может происходить при записи каждого кластера  Цитата Кстати тактируется она частотой около 800 кГц. Ну оооочень медленно, а зачем??? Это ведь не только скорость передачи по SPI - при ожидании готовности Вы на самом деле тактируете контролер флешки, а он получая вместо обычных (точнее спрашивайте у самой SD) 25MHz килогерцы еле шевелится...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 2 2008, 10:34
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(zltigo @ Sep 2 2008, 11:09)  Работает с любым размером флешки и кластеров на ней. Проверялось "электроникой" в диапазоне от 16M до 4G и разным форматированием. Сдается мне, что Вы небрежно с собственно железом работаете  C этим еще буду разбираться. Цитата(zltigo @ Sep 2 2008, 11:09)  Флешка немножко живет своей жизнью  . Просто поставьте контроль за заметным превышением времени ожидания готовности - увидите. Естественно и переходы другому кластеру за пределами фрагмента FAT таблицы загруженной в текущий 512B буфер, тоже задержку (записали текущий-загрузили новый фрагмент FAT) вызывают. При дефрагментации - может происходить при записи каждого кластера  Ясно. Жаль это не предсказать перед собственно записью. Цитата(zltigo @ Sep 2 2008, 11:09)  Ну оооочень медленно, а зачем??? Это ведь не только скорость передачи по SPI - при ожидании готовности Вы на самом деле тактируете контролер флешки, а он получая вместо обычных (точнее спрашивайте у самой SD) 25MHz килогерцы еле шевелится... Да у меня и микроконтроллер 3.2 МГц тактируется ибо больше не надо, ну а флешку решил тактировать от SMCLK, который у меня изначально был MCLK/4. Собственно я просто-напросто не подумал о том, что выделено жирным  Попробую флешь побыстрее тактировать, но предсказуемости я чувствую не получу.  Спасибо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|