Да вроде анализируется...
Код
INLINE inline void ISR_Enter()
{
if(Kernel.ISR_NestCount++ == 0)
{
Kernel.ProcessTable[Kernel.CurProcPriority]->StackPointer = GetStackPointer();
SetISRStackPointer();
}
}
//-----------------------------------------------------
INLINE inline void ISR_Exit()
{
DisableInterrupts();
if(--Kernel.ISR_NestCount) return;
SetStackPointer(Kernel.ProcessTable[Kernel.CurProcPriority]->StackPointer);
Kernel.SchedISR();
}
Собственно код один в один с IAR. Разница начинается дальше, в GetStackPointer() / SetISRStackPointer() / SetStackPointer().
Но они, скорее всего, работают, иначе бы и при единственном обработчике с _SS всё падало.
Но на всякий случай:
Код
INLINE inline TStackItem* GetStackPointer() { return reinterpret_cast<TStackItem*>(GetSP()); }
INLINE inline TStatusReg GetSP()
{
uint16_t __x;
__asm__ __volatile__(
"mov r1, %0"
: "=r" (__x)
:);
return __x;
}
INLINE inline void SetISRStackPointer()
{
WRITE_SP(GetInitialStack());
}
#define WRITE_SP(x) \
__asm__ __volatile__("mov %0, r1" : : "r" ((uint16_t) x))
static INLINE inline word GetInitialStack()
{
extern uint8_t __stack;
return reinterpret_cast<word>(&__stack);
}
__stack определен в линкерном скрипте (для F149) как
Код
PROVIDE (__stack = 0xa00);
Вроде правильно всё...
Полез в листинги...
Если бы я знал, что такое электричество...