Есть глобальная структура с 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