Простите, не понял сразу.
CODE
PendSV_Handler
#if defined __ARM_ARCH_6M__ // Cortex-M0(+)/Cortex-M1
CPSID I // Prevent interruption during context switch
MRS R0, PSP // Load process stack pointer to R0
SUBS R0, R0, #32 // Adjust R0 to point to top of saved context in stack
MOV R1, R0 // Preserve R0 (needed for os_context_switch_hook() call)
STMIA R1!, {R4-R7} // Save low portion of remaining registers (r4-7) on process stack
MOV R4, R8 // Move high portion of remaining registers (r8-11) to low registers
MOV R5, R9
MOV R6, R10
MOV R7, R11
STMIA R1!, {R4-R7} // Save high portion of remaining registers (r8-11) on process stack
// At this point, entire context of process has been saved
PUSH {LR} // we must save LR (exc_return value) until exception return
LDR R1, =os_context_switch_hook // call os_context_switch_hook();
BLX R1
// R0 is new process SP;
ADDS R0, R0, #16 // Adjust R0 to point to high registers (r8-11)
LDMIA R0!, {R4-R7} // Restore r8-11 from new process stack
MOV R8, R4 // Move restored values to high registers (r8-11)
MOV R9, R5
MOV R10, R6
MOV R11, R7
MSR PSP, R0 // R0 at this point is new process SP
SUBS R0, R0, #32 // Adjust R0 to point to low registers
LDMIA R0!, {R4-R7} // Restore r4-7
CPSIE I
POP {PC} // Return to saved exc_return. Exception return will restore remaining context
#else
Если есть необходимость, могу загрузить проект. Но Вы под IAR-ом не работаете.
Для визуального контроля границ стеков процессов добавил в функцию TBaseProcess::init_stack_frame возможность записи заголовков в формате "ProcXX".
Хорошо видно тогда в дампе памяти дно стека. Если затёрт заголовок полностью - хана, стек закончился!
А выглядит это так:

или вот так:

Код функции:
CODE
//------------------------------------------------------------------------------
void TBaseProcess::init_stack_frame( stack_item_t * Stack
, void (*exec)()
#if scmRTOS_DEBUG_ENABLE == 1
, stack_item_t * StackBegin
#endif
)
{
// ARM Architecture Procedure Call Standard [AAPCS] requires 8-byte stack alignment:
StackPointer = (stack_item_t*)((uintptr_t)Stack & 0xFFFFFFF8);
// Prepare Process Stack Frame.
*(--StackPointer) = 0x01000000UL; // xPSR
*(--StackPointer) = reinterpret_cast<uint32_t>(exec); // Entry Point
StackPointer -= 14; // emulate "push R14,R12,R3,R2,R1,R0,R11-R4"
#if scmRTOS_DEBUG_ENABLE == 1
for (stack_item_t* pDst = StackBegin; pDst < StackPointer; ++pDst)
*pDst = STACK_DEFAULT_PATTERN;
stack_item_t* pDst = StackBegin;
*pDst++ = 0x636f7250;
int a = this->priority()& 0x0000003F;
if (a == prIDLE)
{
*pDst = 0x454c4449;
return;
}
#if scmRTOS_PRIORITY_ORDER > 0
a = scmRTOS_PROCESS_COUNT - a;
#endif
int b = 48;
while (a>10)
{
b++;
a -= 10;
}
b += (a+48)<<8;
*pDst = b;
#endif // scmRTOS_DEBUG_ENABLE
}
Эту фичу можно включить с помощью макроса scmRTOS_DEBUG_ENABLE