Есть глобальная структура с 4 переменными которые используются во функции MiDI По адресу 01F4.
Есть функция: void MiDI(void){ while(1){ здесь код. ret //выход }; };
Данная функция вызывается из другого места по указателю на нее. Выполнив нужные действия выходим из нее, потом возвращаемся обратно, при минимальной оптимизации все нормально вот асм: 4: void MiDI (void){ +000005EF: C020 RJMP PC+0x0021 Relative jump
Но стоит повысить оптимизацию так вот получается вот что асм 4: void MiDI (void){ +00000444: 93BA ST -Y,R27 Store indirect and predecrement +00000445: 93AA ST -Y,R26 Store indirect and predecrement +00000446: EFA4 LDI R26,0xF4 Load immediate +00000447: E0B1 LDI R27,0x01 Load immediate +00000448: C020 RJMP PC+0x0021 Relative jump
СОХРАНЯЕТ В СТЕКЕ ДАННЫХ регистры R27, R26! Он думает цикл бесконечный а, я выхожу из него ! по ret (макрос), и происходит потеря данных, ведь я не восстанавливаю из стека данных. Как компилятор отучить делать вот так +00000444: 93BA ST -Y,R27 Store indirect and predecrement +00000445: 93AA ST -Y,R26 Store indirect and predecrement
|