okmonster писал(а):вот
Это скомпилированный вашим компилятором, тот же самый код? Мда, накрутил он там что пипец...
На сколько мог разобрался в чем причина. В этой прошивке компилятор такое вытворяет со стеком, что его просто напросто сносит. Я не знаю почему, но помимо начала памяти, он еще и зачем-то записывает какие-то данные ближе к концу, а там стек. Причем и стек этот получается просто неприличных размеров. Нет я понимаю что Си-компиляторы любят без повода накидать в начале подпрограммы конструкции вида PUSH R0 PUSH R1... и так до 31-го регистра, но тут помимо этого есть еще и чтение и модификация самого регистра SP.
Вот этот кусок кода вообще убил:
Код: Выделить всё
ST Y+11,R24
ST Y+12,R25
ST Y+13,R26
ST Y+14,R27
LDI R17,$01
LD R22,Y+11
LD R23,Y+12
LD R24,Y+13
LD R25,Y+14
Что, напрямую MOV R22,R24 сделать нельзя? Может конечно значение в Y+11 потом еще где-то используется, не знаю...
Причем во время симуляции значения Y получаются больше чем адрес в SP, т.е. числа пишутся прямо в стек.
В итоге, примерно после 3 секунд работы в результате этих манипуляций со стеком, его указатель превышает размер ОЗУ и очередная попытка что-либо туда затолкать или извлечь приводит к той самой ошибке про запись в несуществующую область. Может конечно это и глюк симулятора, так как отследить вручную правильность выполнения команд в таком запутанном коде невозможно, но в реальности такие вещи приводят к совершенно разнообразным глюкам, начиная от появления случайных данных в регистрах и заканчивая сбросом контроллера.
Еще раз спрошу, вы уверены, что ваша программа на 100% верно работает в железе длительное время?