AHTOXA 15 19 февраля, 2011 Опубликовано 19 февраля, 2011 · Жалоба Результаты вызовов функций - 0, т.е. все в порядке... Ваша последовательность ничем в общем-то особо и не отличается от примеров от Chan'а... Естественно:) Просто про мою последовательность я точно знаю, что она рабочая. Есть одна мысль. Попробуйте (в файле ff.h) объявить FIL.fsize volatile: typedef struct _FIL { ... volatile DWORD fsize; /* File size */ Если заработает, значит вы нашли баг в FatFS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Замените атрибут 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. Не нашел :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Файл любого размера FatFS создает только в момент создания файла с нуля, но никак не модифицирует размер... Да нет же! Всё замечательно увеличивается. Судя по тому, что static изменил поведение FatFs, могу предположить, что у вас проблемы с памятью либо стеком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Да нет же! Всё замечательно увеличивается. Судя по тому, что static изменил поведение FatFs, могу предположить, что у вас проблемы с памятью либо стеком. Можно уточнить? А то что-то не совсем понял Вас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба А вы f_close(...); в конце делаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Разумеется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Можно уточнить? А то что-то не совсем понял Вас. Насколько я понял, у вас частично починилось после того, как вы по совету sonycman-а сделали объект dataFile статическим? Если так, то это свидетельствует о проблемах с памятью/стеком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба В принципе логично рассуждаете...Посмотрю. Еще возник вопрос - при записи данных нужно их как-то форматировать под размер сегмента 512 байт? Почему возник вопрос: 1. Создал файл размером 2кБ. 2. Записал 10 строк по 100 байт. 3. Проверил на ПК, записалось только 512 первых байт. 4. В следующий раз указал начало записи с 513 байта и снова записалось только 512 байт... UPD. Сначала писалось 512 байт, файл удалил, создал заново, теперь пишется по 2048 байт, но уже если указать положение дальше 2кБ - дописывать не хочет его... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Еще возник вопрос - при записи данных нужно их как-то форматировать под размер сегмента 512 байт? Ничего такого не нужно. У вас очередной косяк. Обратите пристальное внимание на размер стека. К примеру, в вашем исходном коде на стеке формируется структура dataFile, которая включает в себя 512 байтный массив. Соответственно, стек по размеру должен быть задан таким, чтобы вместить этот массив, все остальные размещаемые на стеке переменные и адреса возвратов из подпрограмм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 22 февраля, 2011 Опубликовано 22 февраля, 2011 · Жалоба Адрес стека указан верно. Массив помешается туда с большим запасом. 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 22 февраля, 2011 Опубликовано 22 февраля, 2011 · Жалоба Адрес стека указан верно. Массив помешается туда с большим запасом. Причем тут адрес? Размер стека какой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба Размер порядка 2500 байт. Читая Chan'а не увидел каких-то ограничений по размерам памяти, mega128 на 1/4 только забита, ресурсов еще вагончик. Вообще сильно удивлен таким проблемам с прицепкой FatFS к своему проекту, у всех вроде получается и не так много тем по проблемам. На сегодняшний день ситуация складывается так: Диск пуст, запускаю программу - файл создается стабильно. Запись в файл не происходит по факту, хотя все функции возвращают "ок" и корректные цифры количества записанных байт. Если вручную создать файл определенного размера (больше 2кБ) на ПК, программа этот файл записывает с 0 до 2047 байта, а потом пустоту оставляет. Даже принудительный перевод указателя в область >2кБ не дает результата - файл дальше не пишется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба Размер порядка 2500 байт. Откуда там 2,5к? Вот ваши же слова: Data: 956 bytes (23.3% Full) В эти 956 байт поместились все глобальные\статические переменные и стек. А вы ещё размещаете на стеке массивы, которые в него просто не влазят. Вам же Антоха выше уже говорил, что проблема разнообразных глюков в маленьком стеке, это прекрасно стало видно после того, как вы сделали dataFile статическим. Разберитесь наконец со стеком и сделайте его размером хотя бы 1,5-2 килобайта, для проверки. Затем разместите все ваши большие массивы статически и посмотрите на результат. Иначе так и будете плавать с разнообразными глюками. Вообще сильно удивлен таким проблемам с прицепкой FatFS к своему проекту, у всех вроде получается и не так много тем по проблемам. Это совсем не удивительно, вы же не можете разобраться с элементарными вещами, уж извините. Удивительно скорее то, что оно хоть как то у вас работает :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба Откуда там 2,5к? Честно сказать, WinAVR я не особо использую, потому трактовал касательно 2,5к как разницу между всем объемом RAM и размером Data. Через nm.exe -S main.elfу меня показывает __stack=0х10FF...Куда же тогда оставшаяся часть девалась? В эти 956 байт поместились все глобальные\статические переменные и стек. А вы ещё размещаете на стеке массивы, которые в него просто не влазят. Вам же Антоха выше уже говорил, что проблема разнообразных глюков в маленьком стеке, это прекрасно стало видно после того, как вы сделали dataFile статическим. Разберитесь наконец со стеком и сделайте его размером хотя бы 1,5-2 килобайта, для проверки. Затем разместите все ваши большие массивы статически и посмотрите на результат. Иначе так и будете плавать с разнообразными глюками. Суть ясна, только что-то я "подвис", мои знания насчет определения размера стека в WinAVR оказались ложными... Это совсем не удивительно, вы же не можете разобраться с элементарными вещами, уж извините. Удивительно скорее то, что оно хоть как то у вас работает :) Первый раз использую полностью чужую библиотеку, обычно все сам с нуля пишу. Ну и особенности WinAVR мне не очень ясны, что ж поделать. Перевести свои исходники в WinAVR смог и все заработало, дальше прицепил FatFS и почти заставил все это работать в сумме :) Осталось немного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 23 февраля, 2011 Опубликовано 23 февраля, 2011 · Жалоба у меня показывает __stack=0х10FF...Куда же тогда оставшаяся часть девалась? С WinAVR я, к сожалению, не знаком. Если действительно стек установлен на последний байт ОЗУ (а похоже, что это так), и оперативки задействовано всего лишь 953 байта, то не должно быть никаких проблем с выделением 512 байт на стеке... Непонятненько... :( Можете привести карту памяти после компиляции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться