Спасибо.
Я немного поторопился, нужно было поразбираться глубже.
Для переключения контекста я использовал Компаратор B.
Но, в отличие от Компратора А (на основе которого сделано переключение в примерах scmRTOS), запрос прерывания не сбрасывается автоматически при входе в обработчик прерывания.
Для сброса запроса прерывания нужно прочитать регистр CBIV, что заодно и сбросит флаг CBIFG в регистре CBINT.
Я добавил строчку
Код
mov.w &CBIV,&CBIV
в файл OS_Target_asm.s43 и программа заработала:
Код
#if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
// extern OS_ContextSwitchStackData
extern os_context_switch_hook
public context_switcher_isr
common INTVEC(1)
org CONTEXT_SWITCH_ISR_VECTOR
dc16 context_switcher_isr
rseg ISR_CODE(1)
context_switcher_isr:
save_regs
mov.w SP,r12
xcall #os_context_switch_hook
mov.w r12,SP
l_restore_context:
restore_regs
mov.w &CBIV,&CBIV // добавил
reti
#endif // scmRTOS_CONTEXT_SWITCH_SCHEME
Можно ли добавить какую-то обертку (например в файл scmRTOS_TARGET_CFG.h) для добавления кода сброса запроса прерывания?