В проекте на 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.
|