AVR Studio + avr-gcc: программа ведет себя непредсказуемо |
![]() |
Добавил(а) microsin |
Возможная причина - переполнение памяти, неверная инициализация стека. Стек инициализируется в самом начале программы, для этого компилятор avr-gcc компилирует обычно такой код (можно посмотреть во время отладки, если выбрать в меню View -> Disassembler и перейти в самое начало листинга). Например, для микроконтроллера ATmega16:
+00000000: 940C002A JMP 0x0000002A прыжок на начало программы В этом примере в стек загружается значение 0x045F (адрес, равный макросу RAMEND из хедера, определяющего ресурсы процессора). Напомню, что стек у AVR должен начинаться от максимального адреса RAM, и по мере заполнения стека его граница смещается к младшим адресам (стек растет вверх, адрес в указателе стека уменьшается). Предельное минимальное значение указателя стека для микроконтроллера ATmega16 - 0x60, поскольку дальше начинается область SFR (Special Function Registers, регистры специального назначения).
В системе WinAVR адрес начала стека присваивается символу __stack.
Если в Вашей системе символ __stack не задан, то возможна неправильная установка стека. Символ __stack можно задать вручную и передать линкеру через командную строку компилятора, например так (в этом примере устанавливается стек для ATmega16, у которого размер RAM равен 1024 байт): Адрес начала стека можно посмотреть с помощью программы avr-nm.exe (входит в пакет WinAVR вместе с компилятором avr-gcc). Например, для выходного файла формата ELF это можно сделать так (кроме адреса, будет также выведен тип и размер символов, в списке нужно искать символ __stack):
avr-nm -S rs422.elf
Можно также использовать утилиту avr-objdump.exe (также входит в пакет WinAVR):
Общую статистику по использованию памяти может показать утилита avr-size.exe (также входит в пакет WinAVR), например:
Или из Makefile: |