总算弄明白为什么在时钟节拍的中断函数里没有保存寄存器了,原来Keil自动生成了将寄存器入栈的代码,具体见C51.pdf第126页的说明。这也决定了OSTaskStkInit()函数中寄存器入栈的顺序。
最后一篇吧,稍微总结一下。
做这个移植,到现在差不多是两周时间。最后整理代码的时候,发现要修改的地方其实并不多。主要的时间是在分析别人写的移植代码,把它们看懂。 首先是要理解uCOS的多任务是怎么回事,这从任务函数的结构(死循环,调用OSTimeDly()等函数)能看出一些蛛丝马迹。最核心的部分是任务的切换,现场的保存、恢复。然后,要熟悉移植的目标平台了,包括处理器和编译器。花一点时间了解一下处理器指令集,开发环境使用,宏汇编语法还是很必要的。Keil自带的帮助文件就是最好的资料,很多开始我不明白的东西,最后都是在它们那里找到答案。然后可以找一个比较成熟的移植版本来看,从任务模拟栈的初始化开始,到第一个任务的启动,是一个很好的切入点。我在分析前人移植代码时,都是这样开始的。还要对照uCOS-II的书,跟踪程序是怎样一步步执行的。 看懂这个就可以对照自己的目标平台修改代码了,先让单任务能跑起来再说。
uCOS-II的那本书是第一手资料。移植部分已经给出了一个框架,那个测试也很有必要好好看看,可惜我刚开始没有在意。第二就是uCOS-II的官方网站www.micrium.com,提供uCOS-II在KeilC51的移植下载。杨屹的那份移植也很好,并且有比较详细的文档,都可以作为参考。第三就是MCS-51的指令集参考,芯片的datasheet,Keil的帮助文档了。