第八章 在51单片机上移植μC/OS-Ⅱ
8.1 μC/OS-Ⅱ移植的一般性问题
8.1.1 可重入函数
能允许同时被多个任务所调用,而不会通过函数中变量的耦合引起任务之间的相互干扰的函数叫做可重入函数。
一个可重入函数只使用局部变量,因为函数的局部变量存储在任务的堆栈中,所以可保证不同的任务在调用同一个函数时不会发生冲突。如果函数一定要使用全局变量,则需要对使用的全局变量做必要的保护。
8.1.2 时钟节拍的产生
一般情况下应该使用硬件定时器来作为时钟中断源,这个定时器可以是微处理器集成在一个芯片上的,也可以是分立的,定时中断的频率以10~100Hz为宜。
8.1.3 任务堆栈的设计
系统堆栈与任务堆栈的关系:
各个任务用来存储各自任务堆栈内容的片外RAM空间叫做任务堆栈;
定义在片内RAM的,各个任务在运行时使用的堆栈叫做系统堆栈。
8.2 在51系列单片机上已知μC/OS-Ⅱ
8.2.1 改写文件OS_CPU.H
1. 堆栈的增长方向
#defineOS_STK_GROWTH 1
堆栈从低地址向高地址增长(从下往上增长)
2. 定义临界段的宏
#defineOS_ENTER_CRITICAL() EA = 0
#defineOS_EXIT_CRITICAL() EA = 1
3. 定义任务切换宏
#defineOS_TASK_SW() OSCtxSw()
4. 定义数据类型
8.2.2 任务堆栈的设计
8.2.3 文件OS_CPU_C.C的改写
在文件OS_CPU_C.C中主要改写任务堆栈的初始化函数OSTaskStkInit(),由于要使用单片机上的定时器为系统设置时钟中断,所以还要添加对51单片机定时器的初始化程序。
如果对51单片机的T0定时器作为系统时钟的中断源,初始化如下:
void InitTimero(void) reentrant
{
TMOD = TMOD & 0x0F0;
TMOD = TMOD | 0x001;
TH0 = 0x70;
TL0 = 0x00;
TH0 = 1;
}
8.2.4 几点必须注意的事项
μC/OS-Ⅱ使用的pdata、data等参数都与KEIL的关键字相同,所以还要把μC/OS-Ⅱ的这些数据改成ppdata、ddata等。
为了使用Ri而不用对它们进行访问,要使用KEIL扩展关键字IDATA,将它们定义在内部RAM中。
8.3 应用举例