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

Не сложный вопрос по FatFS

Результаты вызовов функций - 0, т.е. все в порядке...

Ваша последовательность ничем в общем-то особо и не отличается от примеров от Chan'а...

Естественно:) Просто про мою последовательность я точно знаю, что она рабочая.

Есть одна мысль. Попробуйте (в файле ff.h) объявить FIL.fsize volatile:

typedef struct _FIL {
...
    volatile DWORD    fsize;        /* File size */

Если заработает, значит вы нашли баг в FatFS.

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


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

Замените атрибут FA_OPEN_ALWAYS на FA_OPEN_EXISTING.

Сделайте объект dataFile статическим - static FIL dataFile;

 

Проверьте результат, fsize всё так же после открытия файла будет равен нулю?

Результат fsize стал правильный.

Но оказалось что "затык" то не совсем в том, в чем я предполагал.

По логике, если правильно понял описание f_lseek, указатель ставим в конец файла, потом проводим процедуру f_write, то в случае удачного ее исполнения файл должен увеличиться на длину строки. Что же выходит у меня:

1. Ставлю указатель в конец файла (функция возвращает 0, т.е. good)

2. Проверяю на всякий случай fsize и fptr, они равны и имеют корректное значение.

3. Провожу запись строки.

4. Проверяю количество записанных байт, они равны длине строки.

5. Проверяю fsize и fptr, они равны и корректны.

6. Вставляю карточку в ПК и вижу - файл не увеличился и не дописался.

 

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

 

Файл любого размера FatFS создает только в момент создания файла с нуля, но никак не модифицирует размер...

 

Если заработает, значит вы нашли баг в FatFS.

Не нашел :)

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


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

Файл любого размера FatFS создает только в момент создания файла с нуля, но никак не модифицирует размер...

Да нет же! Всё замечательно увеличивается.

Судя по тому, что static изменил поведение FatFs, могу предположить, что у вас проблемы с памятью либо стеком.

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


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

Да нет же! Всё замечательно увеличивается.

Судя по тому, что static изменил поведение FatFs, могу предположить, что у вас проблемы с памятью либо стеком.

Можно уточнить?

А то что-то не совсем понял Вас.

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


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

Можно уточнить?

А то что-то не совсем понял Вас.

Насколько я понял, у вас частично починилось после того, как вы по совету sonycman-а сделали объект dataFile статическим? Если так, то это свидетельствует о проблемах с памятью/стеком.

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


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

В принципе логично рассуждаете...Посмотрю.

 

Еще возник вопрос - при записи данных нужно их как-то форматировать под размер сегмента 512 байт?

Почему возник вопрос:

1. Создал файл размером 2кБ.

2. Записал 10 строк по 100 байт.

3. Проверил на ПК, записалось только 512 первых байт.

4. В следующий раз указал начало записи с 513 байта и снова записалось только 512 байт...

 

UPD. Сначала писалось 512 байт, файл удалил, создал заново, теперь пишется по 2048 байт, но уже если указать положение дальше 2кБ - дописывать не хочет его...

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


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

Еще возник вопрос - при записи данных нужно их как-то форматировать под размер сегмента 512 байт?

Ничего такого не нужно.

У вас очередной косяк.

 

Обратите пристальное внимание на размер стека.

К примеру, в вашем исходном коде на стеке формируется структура dataFile, которая включает в себя 512 байтный массив.

Соответственно, стек по размеру должен быть задан таким, чтобы вместить этот массив, все остальные размещаемые на стеке переменные и адреса возвратов из подпрограмм.

 

 

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


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

Адрес стека указан верно. Массив помешается туда с большим запасом.

 

FIL dataFile;

 

Device: atmega128

Program: 30496 bytes (23.3% Full)

Data: 956 bytes (23.3% Full)

 

static FIL dataFile;

 

Device: atmega128

Program: 30490 bytes (23.3% Full)

Data: 1500 bytes (36.6% Full)

 

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


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

Адрес стека указан верно. Массив помешается туда с большим запасом.

Причем тут адрес?

Размер стека какой?

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


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

Размер порядка 2500 байт.

Читая Chan'а не увидел каких-то ограничений по размерам памяти, mega128 на 1/4 только забита, ресурсов еще вагончик.

 

Вообще сильно удивлен таким проблемам с прицепкой FatFS к своему проекту, у всех вроде получается и не так много тем по проблемам.

 

На сегодняшний день ситуация складывается так:

 

Диск пуст, запускаю программу - файл создается стабильно.

Запись в файл не происходит по факту, хотя все функции возвращают "ок" и корректные цифры количества записанных байт.

 

Если вручную создать файл определенного размера (больше 2кБ) на ПК, программа этот файл записывает с 0 до 2047 байта, а потом пустоту оставляет. Даже принудительный перевод указателя в область >2кБ не дает результата - файл дальше не пишется.

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


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

Размер порядка 2500 байт.

Откуда там 2,5к?

Вот ваши же слова:

Data: 956 bytes (23.3% Full)

В эти 956 байт поместились все глобальные\статические переменные и стек.

А вы ещё размещаете на стеке массивы, которые в него просто не влазят.

 

Вам же Антоха выше уже говорил, что проблема разнообразных глюков в маленьком стеке, это прекрасно стало видно после того, как вы сделали dataFile статическим.

 

Разберитесь наконец со стеком и сделайте его размером хотя бы 1,5-2 килобайта, для проверки.

Затем разместите все ваши большие массивы статически и посмотрите на результат.

 

Иначе так и будете плавать с разнообразными глюками.

Вообще сильно удивлен таким проблемам с прицепкой FatFS к своему проекту, у всех вроде получается и не так много тем по проблемам.

Это совсем не удивительно, вы же не можете разобраться с элементарными вещами, уж извините.

Удивительно скорее то, что оно хоть как то у вас работает :)

 

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


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

Откуда там 2,5к?

Честно сказать, WinAVR я не особо использую, потому трактовал касательно 2,5к как разницу между всем объемом RAM и размером Data.

Через

nm.exe -S main.elf
у меня показывает __stack=0х10FF...Куда же тогда оставшаяся часть девалась?

В эти 956 байт поместились все глобальные\статические переменные и стек.

А вы ещё размещаете на стеке массивы, которые в него просто не влазят.

 

Вам же Антоха выше уже говорил, что проблема разнообразных глюков в маленьком стеке, это прекрасно стало видно после того, как вы сделали dataFile статическим.

 

Разберитесь наконец со стеком и сделайте его размером хотя бы 1,5-2 килобайта, для проверки.

Затем разместите все ваши большие массивы статически и посмотрите на результат.

 

Иначе так и будете плавать с разнообразными глюками.

Суть ясна, только что-то я "подвис", мои знания насчет определения размера стека в WinAVR оказались ложными... :wacko:

 

Это совсем не удивительно, вы же не можете разобраться с элементарными вещами, уж извините.

Удивительно скорее то, что оно хоть как то у вас работает :)

Первый раз использую полностью чужую библиотеку, обычно все сам с нуля пишу. Ну и особенности WinAVR мне не очень ясны, что ж поделать. Перевести свои исходники в WinAVR смог и все заработало, дальше прицепил FatFS и почти заставил все это работать в сумме :) Осталось немного.

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


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

у меня показывает __stack=0х10FF...Куда же тогда оставшаяся часть девалась?

С WinAVR я, к сожалению, не знаком.

Если действительно стек установлен на последний байт ОЗУ (а похоже, что это так), и оперативки задействовано всего лишь 953 байта, то не должно быть никаких проблем с выделением 512 байт на стеке...

Непонятненько... :(

 

Можете привести карту памяти после компиляции?

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


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

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

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

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

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

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

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

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

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

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