Цитата(skyspark @ Oct 9 2015, 07:03)

Вариант без volatile (нерабочий):
Код
08002206: beq.n 0x8002220 <OS::TKernel::sched()+40>
84 SchedProcPriority = NextPrty;
>0800220a: str r2, [r0, #12]
90 DUMMY_INSTR();
>08002216: nop
93 while(CurProcPriority != SchedProcPriority); // until context switch done
>0800221a: ldr r3, [r0, #0]
87 do
>0800221c: cmp r3, r2
0800221e: bne.n 0x8002214 <OS::TKernel::sched()+28>
Хм.
[r0, #12] - это SchedProcPriority
[r0, #0] - это CurProcPriority
У вас здесь похоже, всё наоборот: CurProcPriority - volatile (перечитывается перед сравнением), а SchedProcPriority - нет.
Наверное, вы для проверки убирали volatile, и убрали немного не там
Если бы я знал, что такое электричество...