Перейти к содержанию
    

Вопрос по FatFs от мистера ChaN'а

смотрели здесь?

http://elm-chan.org/fsw/ff/patches.txt

 

есть исправление в том числе к fprintf()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос снимается. Проблема была связана с нехваткой стека возвратов. :)

Вообще, нужно написать плакат большими буквами:

"Если программа ведет не так как задумано, первым делом проверь стеки..."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В симуляторе проверил fprintf , только убрал обращения к объекту file. Получилось следующее:

в пустой функции main() вызываю

  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 2, 3, 4, 5, 6);

так выводит все числа.

А вот если

  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 22, 333, 4444, 55555, 6666);

то на последнем аргументе (6666) va_arg() возвращает 0, и соответственно, выводит только 5 аргументов.

Видимо, это та проблема, которая описана в patches.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо, это та проблема, которая описана в patches.
Откуда "видимо"? Аргументируйте. В описании патчей написано:
will cause an incorrect behavior on the big-endian processor
С каких пор AVR под IARом стал big-endian?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда "видимо"? Аргументируйте. В описании патчей написано:С каких пор AVR под IARом стал big-endian?

Да, там действительно упоминается по то, что эта ошибка возникает для big-endian.

Но, я привык отвечать на вопросы в том объеме, в котором они заданы :)

В исходном вопросе я нигде не увидел упоминание о типе процессора. И хотя я понимаю, что "вероятностно" это проц. с маленькими индейцами, тем не менее формально рекомендация верна :). А дальше уже дело автора разбираться со своими индейцами (в данном конкртеном случае) или искать причину в другом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

согласен. Тогда почему 6-ой аргумент не выводит? Почему "маленькие" числа выводит, а чуть побольше - не все. Числа ведь в пределах unsigned int

И это уже не связано с нехваткой стека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

согласен. Тогда почему 6-ой аргумент не выводит?
У вас в руках есть симулятор. Даже два - родной ИАРовский и Студийный. Прогнать в нем программу, следя куда при вызове testfprintf были положены аргументы, откуда они достаются в va_arg() и кто их портит, если портит - дело минут, ну максимум часа-двух.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В симуляторе проверил fprintf , только убрал обращения к объекту file. Получилось следующее:

в пустой функции main() вызываю

  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 2, 3, 4, 5, 6);

так выводит все числа.

А вот если

  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 22, 333, 4444, 55555, 6666);

то на последнем аргументе (6666) va_arg() возвращает 0, и соответственно, выводит только 5 аргументов.

Видимо, это та проблема, которая описана в patches.

 

6666 это уже 32-битное число. Соответственно, надо

 

const char format[] = "%u/%u/%u %u:%u:%lu";

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6666 это уже 32-битное число. Соответственно, надо

 

const char format[] = "%u/%u/%u %u:%u:%lu";

Ничего подобного. До 32-битного еще добавлять и добавлять.

 

Проверьте саму fprintf. Если используется промежуточный буфер и vsnprintf, проверьте его размер, может банально не влезть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажите, если я пишу отак:

FATFS fs;

FIL fdst;

FRESULT res;

f_mount(0, &fs);

res = f_open(&fdst, "test.dat", FA_CREATE_ALWAYS | FA_WRITE);

fprintf(&fdst, "%s", "This is a test");

f_close(&fdst);

f_mount(0, NULL);

 

файловая система сама ищет свободные кластера и туда это всё дело записывает?? Нужно лишь беспокоиться о свободном месте на флешке??? или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

файловая система сама ищет свободные кластера и туда это всё дело записывает?? Нужно лишь беспокоиться о свободном месте на флешке??? или нет?

Ну да. А для чего тогда иначе была бы нужна файловая система?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как что? Не прочитали документацию. Хотя бы на f_mount:Можно было еще заглянуть в исходники, и увидеть, что f_mount только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.

Заинтересовался этим вопросом тоже. avr и flash. Можете, если у вас есть наработки поделиться ими. Буду очень благодарен.

 

здравствуйте. заинтересовался этим вопросом тоже. о пока я не очень представляю механизм написания программы чтения и записи данных в flash. если не трудно, могете поделиться исходниками по работе с fat32 для avr. буду очень благодарен. [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего подобного. До 32-битного еще добавлять и добавлять.

 

Проверьте саму fprintf. Если используется промежуточный буфер и vsnprintf, проверьте его размер, может банально не влезть.

Проглядел деталь... предпоследнее число было 55555 - мне показалось. что в неработающем примере было 66666. Может, человек по памяти писал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можете, если у вас есть наработки поделиться ими. Буду очень благодарен.
Наработки есть на сайте автора. Их там аж несколько штук. Что вас в них не устраивает и почему вы считаете, что чьи-то еще будут лучше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пока я не очень представляю механизм написания программы чтения и записи данных в flash.

Копайте уровень железа - diskio.*

Вам надо надуться на написание нескольких процедур (чтение/запись/статус/инициализация/контрол) и решить, что будете делать с таймстампом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...