Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Стек переходит в область переменных
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
LSerg
Помогите решить данную проблему.
Проект на мега128, компилятор winavr 20100110

Device: atmega128

Program: 64760 bytes (49.4% Full)
(.text + .data + .bootloader)

Data: 3966 bytes (96.8% Full)
(.data + .bss + .noinit)

В программе есть структура

Код
struct {
  unsigned char State_Code_Num; //
  
  unsigned char hours; //
  unsigned char minutes; //
  unsigned char seconds; //

  unsigned char years; //
  unsigned char mounses;
  unsigned char days;
} State_System;


Во время работы программы переменная State_System.days чюдесным образом изменяется. Пересмотрел программу, видимых наложений не нашел. Запусти внутрисхемную отладку в студии. Поставил точку останова на адрес 0х107С это адрес выше указанной переменной. Когда программа остановилась в не понятном месте гляжу Syack Pointer 0х107B и в переменной соответ. левые данные.
Почему winavr не ругается на этапе компиляции и как выловить после чего происходит переполнение?
Не хотелось бы верить в глючность winavr и просто изза этого переходить на ИАР.

Заранее спасибо!

MrYuran
Цитата(LSerg @ Apr 6 2011, 11:35) *
Почему winavr не ругается на этапе компиляции и как выловить после чего происходит переполнение?
Не хотелось бы верить в глючность winavr и просто изза этого переходить на ИАР.

А как вы предлагаете это отлавливать на этапе компиляции?
Стек в GCC двигается навстречу данным, так что если они встретились - всё, аллес, надо урезать осетра.
Уменьшать уровень вложенности, инлайнить, следить за локальными переменными итд.
Для таких случаев есть профайлер.
Цитата
Data: 3966 bytes (96.8% Full)

Может, что-нибудь выкинуть можно?
klen
ну допустим мы поймали момент что стек кончиля(в FreeRTOS это делается на уровне стека потока проверкой по маркру ) .... и что стого, если это произошдо то фисЁ, ложимся накрываемся белой простынкой и медленно чтоб не создавать паники вперед ногами ползем в сторну кладби.. ресета. если это произошло то лошадь пошла поперек еще до кода - причина то не вкоде а алгоритмах и входных данных - нада профилактика а не лечение.

система должна быть сдизайнена чтоб этого "небыло".
demiurg_spb
У Вас константные строки, массивы или структуры используются?
Они размещены во флеше?
hint:
PSTR
PROGMEM
SysRq
Цитата(LSerg @ Apr 6 2011, 11:35) *
Пересмотрел программу, видимых наложений не нашел.
Прологи\эпилоги функций и прерываний посмотрите. Зло именно там.
sergeeff
Цитата(klen @ Apr 6 2011, 11:59) *
система должна быть сдизайнена чтоб этого "небыло".


Встречался я как-то с программой статического анализатора исходного кода с оценкой необходимого стека и прочего. Цена под 18 тыс. долларов. Так может дешевле голову включить?
LSerg
Спасибо, откликнувшимся.
На данной стадии решил, стрелять из пушки по воробьям (поставил mega1281)

Главную идею понял буду заматься программной оптимизацией кода!!!
sergeeff
Цитата(LSerg @ Apr 8 2011, 18:22) *
Спасибо, откликнувшимся.
Главную идею понял буду заматься программной оптимизацией кода!!!


Главную идею не понял. Не оптимизацией кода надо заняться, а оптимизацией используемого стека (т.е. локальных переменнных).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.