引 言:
μC/OS-II作为一个嵌入式实时操作系统,自1992年以来,因其源代码的完全公开和优越性能,已为众多的爱好者和开发人员所了解并得到了广泛应用。μC/OS-II是一个占先式内核,执行时间可确定(即函数的调用与服务的时间是可知的,不依赖于应用程序的大小),目前最多支持64个任务(8个为系统保留),总是执行处于就绪态的优先级最高的任务。目前,51系列及其扩展型单片机仍在单片机应用系统占较大比重,因而详细介绍μC/OS-II在AT89C51上的移植实现过程,解决移植过程中出现的问题,有很大的实用意义。
1 KEIL C51编译器中函数再入栈的处理 (1)再入函数与再入栈
再入函数可以被递归调用,可同时被两个或多个进程调用。再入函数经常在实时应用或在中断和非中断必须共用一个函数的情况下被使用。编译时,在存储器模式的基础上为再入函数在内部或外部存储器中建立一个模拟堆栈区,称为再入栈,又可叫仿真堆栈,其增长方向是从上到下。
(2)具体实现过程
μC/OS-II是一个占先式内核,使用了较多的再入函数,用户只有通过C编译器来产生可再入代码。不同的编译器,对再入函数的仿真堆栈的处理不一样,如TC可以自动处理;而在单片机系统中应用较广的KEIL C51编译器中,要在startup.a51中进行设置。KEIL C51中,再入函数的返回地址保存在8051的硬件堆栈中,形参和局部变量必须保存在仿真堆栈中。在SMALL模式下,仿真栈与硬件堆栈分享共同的存储区,堆栈增长方向相反。而典型的51单片机真正的RAM只有128个字节,还有部分要用于位寻址区和工作寄存器,可用作仿真栈的空间有限。在这种方式下移植后,在中断嵌套或任务调用时系统会崩溃。因而,可以使用LARGE模式编译,这样,仿真栈就位于XDATA区,有充分的存储空间。编译前,要先在startup.a51中修改设置。XBPSTACK=1,XBPSTACKTOP设为仿真栈的最高地址加1(对于64KB外RAM,最高为0FFFFH,也可以保留部分地址用于外部I/O接口)。
2 时钟节拍初始化 时钟节拍是μC/OS-II运行的基础,其原理就是利用定时器中断,每隔一个时钟节拍中断一次,在发生中断时,内核判断是否进行任务切换或者别的操作。节拍率一般在10~100次之间,越高则系统的额外负荷就越重。可以使用AT89C51的定时器T0中断来实现。
void TimerInitiate(unsigned char Crystal,unsigned char Frequence)
{ //Crystal 晶振 Frenquence 时钟节拍率
unsigned long temporary=0;
temporary=1000000/(12*Frequence);
temporary=65535-Crystal*temporary;
TMOD=(TMOD & 0XF0) | 0X01; /* Timer 0工作在方式1*/
TL0=(unsigned char )temporary ;
TH0=(unsigned char )(temporary>>8);
TR0=1;
ET0=1;
}
初始化定时器中断必须紧跟在多任务系统启动之后,一般放在第一个任务中。
在Keil C51编译器中,代码优化级别设为9级,编译后,本程序占用的RAM和ROM空间约为:DATA 67.1 XDATA 732 CODE 8113 (字节)。基本上要使用外部的数据和程序存储器。
在存储器容量许可的条件下,可以加入更多μC/OS-II提供的系统功能,如邮箱、消息序列等。
结 语 μC/OS-II以其良好的稳定性与可靠性、实用的系统服务和完全公开的源代码,推动了实时操作系统的应用,也使应用系统的功能更加完善。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。