ZenProg

Ответы в темах

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • в ответ на: Программирование МК AVR #29347
    ZenProg
    Участник

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

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

Просмотр 1 сообщения - с 1 по 1 (всего 1)