Цитата(rezident @ Mar 21 2007, 22:21)

Попробуйте выходить по
break, а
ret поставить
после бесконечного цикла.
Цикл с выходом из середины (Википедия). Или см. K&R раздел
3.7. Оператор BREAK.
Решил проблему в лоб, спрятал работу со структурой в функцию processingDI();
Теперь функция с бесконечным циклом MiDI состоит только из переключателя switch и функций. Данных нет. :
void MiDI(void){ //
while(1){
processingDI();
switch(GetExeKey()){ //здесь считываем функцией переменную из структуры, которую //обрабатывает processingDI();
case DI_UP_FAN:{
OutFan(0);
Delay(2, MiDIPr);
UpDownFan(UP);
}
И т.д.
Асм при старте void MiDI(void)
4: void MiDI(void){
+0000045D: C020 RJMP PC+0x0021 Relative jump – переход на processingDI();
Теперь при максимальной оптимизации по скорости все нормально работает
Вот асм функции processingDI();
180: void processingDI(void){
+000001BB: 93BA ST -Y,R27 Store indirect and predecrement
+000001BC: 93AA ST -Y,R26 Store indirect and predecrement
181: key.currentKey = ReadDI();
Здесь еще код для работы сос структурой
: key.previousKey = key.currentKey;
+000001CD: 930C ST X,R16 Store indirect
190: };
+000001CE: 91A9 LD R26,Y+ Load indirect and postincrement
+000001CF: 91B9 LD R27,Y+ Load indirect and postincrement
+000001D0: 9508 RET Subroutine return