Обратил внимание на следующую вещь:
Код
stack_item_t* OS::TKernel::context_switch_hook(stack_item_t* sp)
{
CONTEXT_SWITCH_HOOK_CRIT_SECT();
ProcessTable[CurProcPriority]->StackPointer = sp;
sp = ProcessTable[SchedProcPriority]->StackPointer;
#if scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE == 1
context_switch_user_hook();
#endif
CurProcPriority = SchedProcPriority;
return sp;
}
SchedProcPriority - volatile, читается дважды без создания локальной копии, что приводит к необходимости обязательно запрещать прерывания перед вызовом context_switch_hook() или в CONTEXT_SWITCH_HOOK_CRIT_SECT(). Иначе в случае прерывания с перепланировкой между двумя чтениями SchedProcPriority может призойти переключение на один просесс, а в CurProcPriority запишется другой процесс и всё развалится. А вот если сделать локальную копию SchedProcPriority, то, например, для Cortex-M прерывания при переключении контекста можно и не запрещать.{
CONTEXT_SWITCH_HOOK_CRIT_SECT();
ProcessTable[CurProcPriority]->StackPointer = sp;
sp = ProcessTable[SchedProcPriority]->StackPointer;
#if scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE == 1
context_switch_user_hook();
#endif
CurProcPriority = SchedProcPriority;
return sp;
}
И ещё кусочек:
Код
if(p->Timeout > 0)
{
if(--p->Timeout == 0)
{
set_process_ready(p->Priority);
}
}
Неиспользование локальной копии p->Timeout приводит к её двойному чтению, в данном случае без тяжёлых последствий, просто неоптимально по длине кода.
{
if(--p->Timeout == 0)
{
set_process_ready(p->Priority);
}
}