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

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

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

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

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

Вот и у меня не складывается, про стек Вы мне с АНТОХ'ой как сказали - все что знал проверил, все вроде бы нормально и размеры верные и адреса указателей...В отличие от IAR, у WinAVR один стек, нужно лишь указать верхний адрес его в линковщике...Что я в общем и сделал.

 

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

 

Вас это интересует

008004b6 B __bss_end
00800206 B __bss_start
000001cc T __ctors_end
000001cc T __ctors_start
00800206 D __data_end
00800100 D __data_start
00000000 W __heap_end
000010ff W __stack

Или это?

Device: atmega128
Program:   25014 bytes (19.1% Full)
(.text + .data + .bootloader)
Data:        950 bytes (23.2% Full)
(.data + .bss + .noinit)
EEPROM:        6 bytes (0.1% Full)
(.eeprom)

 

А то чую терминология у нас разница немного :)

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


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

008004b6 B __bss_end

00800206 B __bss_start

00800206 D __data_end

00800100 D __data_start

00000000 W __heap_end

000010ff W __stack[/code]

Тут нужен комментарий тех, кто работает с AVR и WinAVR в частности.

Заметьте, адреса для областей BSS и данных начинаются с 0x00800000, а стек и куча с 0x0.

Не в этом ли проблема?

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


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

Насколько я могу сказать - эти цифры там верные, просматривал все значения, все сходилось.

Ведь кроме FATFS у меня вся система работает исправно и стабильно (обмен по RS485, куча периферии на i2c, spi, ногодрыганье, динамическая индикация, кое-какая математика не самая сложная).

Будь что-то не ладно в адресах - точно бы где-то всплыло.

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


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

Тогда остаётся одно предположение - в вашей программе слишком много массивов, и они все вместе не помещаются на стеке.

Получается, что один массив перезаписывает другой или затирает какие-то другие переменные.

 

Посмотрите внимательнее исходники, и постарайтесь все массивы\объёмные структуры (подобные FIL dataFile) объявить статическими\вынести как глобальные.

Так, чтобы память под них резервировалась ещё на этапе компиляции, а не в рантайме.

 

Тогда после компиляции в строке (.data + .bss + .noinit) будет виден реальный размер требуемой оперативной памяти.

 

Динамического выделения памяти (malloc() и т.п.), случайно, в программе нет?

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


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

Массивы есть, но в основном они статические глобальные...не мало локальных...Внимательнее просмотрю этот момент.

Динамического выделения точно нет.

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


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

Насколько я разбираюсь в WinAVR, стека действительно много. Но всё же для проверки наверное надо сделать всё статическим, как сказал sonycman.

Добавлю контрольных вопросов.

Чему равно _USE_LFN в ffconf.h?

Чему равны _MAX_LFN и _FS_REENTRANT?

 

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


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

Длинные имена мне не требуются, потому

#define _USE_LFN 0

При такой первой настройке этот пункт уже не актуален

#define _MAX_LFN 255

Касательно этой части, насколько понял, мне это тоже не требуется

#define _FS_REENTRANT 0

 

UPD. Проштудировал все массивы и прочее, изменений в работе FatFS нет.

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


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

Понятно... Всё вроде в порядка, всё должно работать. Но не работает...

А сами процедуры низкоуровневые вы откуда брали? Или может карточка дурит?

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


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

За основу взял примеры Chan'а, пример с MMC картой, сначала карта никак не отвечала, потом немного откорректировал и все заработало как следует.

 

А тут сейчас выходит 2 варианта: либо проблемы на верхнем уровне, либо на нижнем. Косвенно получается, что верхний уровень в порядке, остается низкий.

Что и как проверить на низком уровне? Ведь в общем-то верхние функции благодаря нижним работают, только не полноценно :)

Карточки несколько разных, объем только одинаковый, 2Гб.

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


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

Что и как проверить на низком уровне?

Проверьте чтение\запись секторов драйвером, что же ещё :)

Как по одному, так и сразу группу секторов.

В различных местах карты.

 

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

 

У вас есть отладчик? Типа J-Link?

Проще всего найти проблему - продебажить запись и чтение по шагам.

Это долго - зато вникнете во все нюансы и воочию увидите проблемы :)

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


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

 

Вот та-же проблема. Не дописывает в конец, а переписывает. Контроллер H743. Как и что проверять? Спасибо.

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


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

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

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

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

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

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

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

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

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

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