并且要修改OSIntCtxSw函数,原始的OSIntCtxSw函数的写法是:
1、调整栈指针来去掉在调用:OSIntExit,OSIntCtxSw过程中入栈的多余内容
2、将当前任务栈指针保存到OSTCBCur中(OSTCBCur->OSTCBStkPtr = __SP__)
3、如果需要则调用OSTaskSwHook
4、OSTCBCur = OSTCBHighRdy
5、OSPrio = OSPrioHighRdy
6、从OSTCBCur中恢复栈指针(__SP__ = OSTCBCur->OSTCBStkPtr)
7、恢复保存了的CPU寄存器
8、执行中断返回指令
新的写法只需将原写法中的1,2去掉即可,因为1,2步只是保存旧任务的栈指针,而新的写
法中,这些步被移到了“中断服务程序”中的2.2.
5.注意arm Image for uCOSII for lpc213x 模板中的TargetInit()
对于很多使用ZLG arm Image for uCOSII for lpc213x 模板的初学者,常常会置疑使用该模板
后自动生成的target.c文件,和在程序中调用的TargetInit()函数,我和 Zgpswh都是如此,这
个问题当初困扰了很久:当用户程序中不调用TargetInit()时,发现内核能运行,但是等待机制
失灵,调用 TargetInit(),很多硬件中断打不开,后来,在很多热心人的指点下解决了,现重新
总结如下:
请仔细察看ZLG模板里的target.c文件,这里的TargetInit()如下:
void TargetInit(void)
{
OS_ENTER_CRITICAL();
srand((uint32)TargetInit);
VICInit();
Timer0Init();
OS_EXIT_CRITICAL();
} |