В проекте на MSP430F5437a пытаюсь применить uCOS-III.
По старту OS в OSStart(&os_err) - заполняются TCB - вроде все правильно.
Затем начинается вызов самих тасков в порядке приоритета.
Сначала вызывается первый task - все нормально.
Затем первый task в pend, переходим на второй. И здесь проблема в schedulere.
Вместо перехода на следующий похоже возвращаемся на старую точку.
Вот код:
OSCtxSw
POPX.W R12 ; Pop lower 16 bits of PC.
POPX.W R13 ; Pop upper 4 bits of PC.
PUSHX.W R12 ; Save lower 16 bits of PC.
RLAM.A #4, R13 ; Save SR + upper 4 bits of PC.
RLAM.A #4, R13
RLAM.A #4, R13
MOVX.W SR, R12
ADDX.A R13, R12
PUSHX.W R12
PUSHM.A #12, R15 ; Save R4-R15.
MOVX.A &OSTCBCurPtr, R13 ; OSTCBCurPtr->StkPtr = SP
MOVX.A SP, 0(R13)
CALLA #OSTaskSwHook
MOVX.B &OSPrioHighRdy, R13 ; OSPrioCur = OSPrioHighRdy
MOVX.B R13, &OSPrioCur
MOVX.A &OSTCBHighRdyPtr, R13 ; OSTCBCurPtr = OSTCBHighRdyPtr
MOVX.A R13, &OSTCBCurPtr
MOVX.A @R13, SP ; SP = OSTCBHighRdyPtr->StkPtr
POPM.A #12, R15 ; Restore R4-R15.
RETI
После
POPM.A #12, R15
все регистры заполняются верно(смотрел в debug), в том числе и SP.
Если поставить точку останова на RETI и затем сделать один шаг в Debug, то
переходит как и требуется на следующий task, записанный в контексте.
Если же после RETI продолжить в автомате, то переключается не на task,
а похоже в точку вызова OSCtxSw.