День добрый уважаемые радиолюбители и радиопрофессионалы)
Поделитесь пожалуйста опытом кто сталкивался с похожими проблемами:
Допиливаю ЛЕГАСИ проект под атмегой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)даже банальный копипаст какого-то рабочего набора стейтментов из данного же проекта в другом участке программы давал описанный выше сбой.
Буду рад любым мнениям или предложениям.
Добрый день! Если чисто на внешние признаки ориентироваться, то выглядит как будто стек/куча переполняются.