在做嵌入ucos于凌阳SPCE061A的时候
在这个函数OSCtxSw()如下
.TEXT
.PUBLIC _BREAK
//.PUBLIC _OSCtxSw
//_OSCtxSw:
_BREAK:
//保存当前任务的寄存器的内容 压栈
PUSH R1,R5 TO [SP]; //调用子程序时会自动将PC,SR压入栈中,不需要再保存
//保存即将挂起任务的堆栈地址在本任务的TCB中
R2=[_OSTCBCur] //取得当前任务(即将挂起的任务)的TCB首地址
[R2]=SP //在TCB的第一项(首地址)中保存堆栈地址
//****************************************
CALL _OSTaskSwHook
//对OSTCBCur等等指针进行调整
R1=_OSTCBCur //取得 OSTCBCur的地址
R2=[_OSTCBHighRdy] //取得 OSTCBHighRdy所指向的TCB的首地址
[R1]=R2 //将优先级最高的就绪态任务的TCB的首地址赋予 OSTCBCur
R1=[_OSPrioHighRdy] //改变当前优先级
[_OSPrioCur]=R1
//**************************
//切换至新的任务堆栈 所以要弹出新任务栈中的内容
R1=[_OSTCBHighRdy] //取得将要运行的任务的TCB块的首地址(其中放置了该任务的堆栈地址SP)
SP=[R1]
POP R1,R5 FROM [SP]
RETI //因为任务调度的时候用的是函数的调用call 所以现在用RETF
//如果用的是软中断 则要用RETI 其实是一样的
若我用软中断 第一次进入这个函数后就再也不能进去了!
若我用函数调用 直接调用OSCtxSw 就没什么问题!
问 为什么会这样 软中断和函数调用不都是先把SR和PC压入堆栈中吗??然后弹出来不就可以了吗 为什么用软中断就不行!!