Мега 128,IAR.
Стана перфектно. Заделих си отделен стек за прекъсванията
 |  |  |
 | Код: #ifdef INTERRUPT_STACK_ENABLE #ifdef INTERRUPT_STACK_SWITCH_USE_R10_R11 MOVW R10,R28 LDI R28,LOW(InterruptStack+INTERRUPT_STACK_SYZE_BYTES-1) LDI R29,HIGH(InterruptStack+INTERRUPT_STACK_SYZE_BYTES-1) #else STS (InterruptStack+INTERRUPT_STACK_SYZE_BYTES-1),R28 STS (InterruptStack+INTERRUPT_STACK_SYZE_BYTES-2),R29 LDI R28,LOW(InterruptStack+INTERRUPT_STACK_SYZE_BYTES-3) LDI R29,HIGH(InterruptStack+INTERRUPT_STACK_SYZE_BYTES-3) #endif #endif ---------------------------------- ---------------------------------- ---------------------------------- кода на функцията на прекъсването ---------------------------------- ---------------------------------- ---------------------------------- #ifdef INTERRUPT_STACK_ENABLE #ifdef INTERRUPT_STACK_SWITCH_USE_R10_R11 MOVW R28,R10 #else LDS R28,(InterruptStack+INTERRUPT_STACK_SYZE_BYTES-1) LDS R29,(InterruptStack+INTERRUPT_STACK_SYZE_BYTES-2) #endif #endif
|  |
 |  |  |
InterruptStack е масив от unsigned char с размерност INTERRUPT_STACK_SYZE_BYTES
И системния таимер го направих по този начин да ползва тоя стек. Освободи ми се достатъчно RAM.
При AVR e добре да се резервират R10-R15 също че да не отнема толкова време съхраняването на контекста.
В единия вариант тук си ползвам R10-R11 за съхраняване на стековия укзател. А в другия си го съхранявам дирекно в началото на стека.
Това решение не става за nested interrupts но на мен и не ми трябват такива.
Така операционната система изобщо не разбира че е имало прекъсване и собствените ти функции на прекъсванията могат да си са съвсем независими от операционната система