51单片机操作系统开发中的问题与技巧
(2)重入问题的解决
应该尽量使有重入性要求的函数的参数传递通过寄存器来完成,这样可以用一般的方法来编写函数,使得函数具有重入性。如果实在是寄存器不够用的话,可以动用硬件堆栈来保存这些局部变量。
(3)堆栈分配问题的解决
鉴于各个任务对于任务堆栈大小的要求不同,即使同一个任务在不同的时刻被中断,它对堆栈大小的要求也不相同的情况,可以将任务堆栈多分配出一个字节,用来统计任务堆栈中有效数据的个数。单片机的片内RAM中,堆栈的栈底也做一个标志,当任务切换时,把当前任务放在堆栈中的环境变量从栈底到栈顶全部拷贝到任务的堆栈中,然后把将要运行任务的任务堆栈中的所有数据恢复到栈底标志开始的地方。任务堆栈和硬件堆栈之间的数据拷贝如图1所示。
其中,Stack(i)和Stack(j)都是指针数组Stack[max_tasks]中的元素,NUM=SP-StkStart,图1中所要进行的操作步骤是:①将系统硬件堆栈中的内容放到当前任务的堆栈中;②把将要运行的任务的堆栈内容移到系统的硬件堆栈中,并将硬件堆栈中的内容弹出到各个寄存器。这个过程就完成了任务的切换。
结 语
本文介绍了在基于51系列单片机的嵌入式操作系统开发中,可能遇到的几个问题和它们的解决办法。这些想法都是笔者在学习和实践中得来的,相信能够对从事相同工作的人员有一定启发。
参考文献
1 JEAN J.LABROSSE. 源代码公开的实时嵌入式操作系统. 邵贝贝译. 北京:中国电力出版社,2001
2 陈明计, 周立功, 等. 嵌入式实时操作系统Small RTOS51原理及应用. 北京:北京航空航天大学出版社,2004
3 探矽工作室. 嵌入式系统开发圣经. 北京:中国青年出版社,2002
评论