Top.Mail.Ru
Уведомления
Очистить все

Atmega128, сбои в работе с памятью.

(@zenprog)
New member

День добрый уважаемые радиолюбители и радиопрофессионалы)
Поделитесь пожалуйста опытом кто сталкивался с похожими проблемами:
Допиливаю ЛЕГАСИ проект под атмегой128. В распоряжении ~62-64кб ПЗУ(такой же остаток зарезервирован для бута и загрузки обновлений) и 4кб ОЗУ (eeprom в учет не беру его супер за глаза в запасе). Память ПЗУ/ОЗУ забита практически под завязку, однако при решении описанной ниже проблемы
а)урезал большой буфер высвобождая ОЗУ
б)наращивал оба стека
...оба действия не помогли

Симптоматика следующая - после определенного количества нового кода практически любой новый стейтмент сложнее "int a=0;" приводит к проблемам с памятью. Как проявляется: добавляю НАПРИМЕР в самом начале main вызов функции с содержимым тестовым
void test()
{
   int a[4];
   for (u8 ccc = 0; ccc<4;ccc++)
   a[ccc]=1;
  //если вручную присвоить без цикла, ещё будет работать прога
}
P.S. Данная функция служит маркером того, что дело не в каком-то неграмотном прерывании или ошибке работы с контрольными регистрами.

Далее, вызов подобной функции или просто перезапись какого-то из существующих флагов приводит к тому, что у меня где-то часть данных изменяется и при перезагрузке во время считывания из ПЗУ в ОЗУ конфига checksum не совпадает, затем идет перезапись в значения по умолчанию.

Также бывает при данной проблеме такой симптом, что просто при смене настроек например "громкости звука" из цифры 1 в 2 идет её сброс в значение по умолчанию.(как будто происходит или запись в ПЗУ значения из другого места с нарушением условия ограничения значений (видим цифру 3 на пульте управления, вписало под капотом 23 при ограничении 0..10 со сбросом в 0)).

Далее обнаружилась ещё одна история: при работе с нашим конфигуратором не удалось считать HW & SW версию устройства, которые прописаны дефайнами, однако даже жесткая замена на абсолютные значения в местах формирования пакета для общения с ПК через программу конфигуратора не помогла. Контрольная сумма пакета скорее всего совпадает, т.к. коннект с указанаием некоторой информации всё же происходит.

Из того, что пробовал, существующих домыслов и ограничений:
1)Нет программатора подходящего, задебажить не выйдет. В лучшем случае вывод на дисплейчик каких-то данных. (Все интерфейсы заняты, нахожу целесообразным отыскивать ошибку не отключая и не переназначая ничего)
2)скорее всего речи о переполнении стека или нехватки ОЗУ пока не стоит, хотя ресурсы и ограничены
3)был сделан переход компилятора с IAR 7.30.xx на 8.10. Уровень оптимизации по памяти стоит максимальный. К сожалению откатить в таком виде проект на старую версию компилятора не могу, новая версия оптимизует расход памяти лучше, чем старая и со старой версией я выбиваюсь за ограничения по памяти.
4)из домыслов мб есть что-то в ошибке из разряда "нововведения в коде что-то немного смещают в памяти программы (не в памяти для данных)"
5)сейчас уперся в стену с данной ошибкой, но ранее уже исправлял в этой же программе подобное. Например приходилось заменять проблемные "flag?(a=1):(a=2)" на if(flag)a=1;
else a=2;
и снова начинало все работать, хотя казалось бы...
6)даже банальный копипаст какого-то рабочего набора стейтментов из данного же проекта в другом участке программы давал описанный выше сбой.

Буду рад любым мнениям или предложениям.


Цитата
Создатель темы Размещено : 07.11.2025 11:26
Aveal
(@aveal)
Top level Admin

Добрый день! Если чисто на внешние признаки ориентироваться, то выглядит как будто стек/куча переполняются.


ОтветитьЦитата
Размещено : 07.11.2025 12:30
Поделиться:
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.