移植uCOS-II到C51 - 5

这两天又测试了几个不同的移植版本,包括最先看到的SW和杨屹的版本,总算能在我的系统上跑起来了。虽然还有些问题没搞明白,但心里还是挺高兴的。毕竟,自己的努力看到了些许成果。

做到现在才真的感觉到,其实在C51上跑uCOS,能做的东西也很有限。对我来说,只不过是个体验而已,而我也不希望这是失败的、让人受挫的体验。我也发现自己的硬件电路也有很多局限性,比如我把P3.6和P3.7用作了按键输入。这在不使用片外存储时看不出有啥问题,一旦用LARGE模式编译,一按键程序就崩掉了。另外,RS232通讯还有些问题,程序启动后串口中断只发生一次,然后再怎么发数据给它都不响应了,现在还没有找到原因。

其实,最重要的是弄清把任务模拟栈的结构。有了这个,应该很容易就能把别人的移植版本修改到自己的系统上。从模拟栈的初始化看,其内容都差不太多,必不可少的是任务的入口地址和参数。入口地址应该被写入硬件栈的底部,最终通过RETI指令被写入PC中。参数部分呢,在Keil C里,默认是通过寄存器传递参数的,比如void*类型的参数是通过R1~R3。所以在OSTaskStkInit()中,R1-R3的部分写入的是任务的参数。至于堆栈的生长方向,一开始对这个东西很迷惑,其实就是这样:向上生长的堆栈,其栈顶单元的地址比栈底单元的地址大;而向下生长的堆栈,其栈顶单元的地址比栈底单元的地址小。Keil的帮助文件中说在片内数据存储区(IDATA),堆栈是向上生长的,而在片外数据存储区(XDATA),堆栈是向下生长的。我觉得这并不影响任务模拟栈的结构,向OSTaskStkInit()传递任务模拟栈栈底高地址还是低地址,完全由你自己决定。

另外一个问题就是是否需要为函数增加可重入性(REENTRANT)。我觉得其实很多情况下都没有必要,一开始加上这些东西仅仅是因为不确定是不是可以不要这些特性。Keil会为每个可重入的函数分配一个仿真栈,这和由我们控制的任务模拟栈可不是一码事。可重入函数的每次调用,Keil都会在其仿真栈上为函数的参数和局部变量重新分配空间。这样看来,并非每个函数都需要这种特性,因为不是每个函数都会在返回前被再次调用。增加可重入性会产生更多的代码,存储器的使用也会增大。因此,应该尽可能避免使用这种特性。也许有的uCOS的系统函数也不需要增加可重入性,不过这个要经过比较谨慎的考虑。

最后说一点我这两天看移植代码的经验。我觉得从OSStart()开始,跟踪系统中第一个任务的启动,可以比较快的掌握移植过程。最开始都不要去考虑多任务,任务如何切换,先看看只有一个任务的情况,也是最简单的情况。如果这一步能调试通过,理解任务级、中断级的任务切换就容易的多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值