1 引 言
实时操作体系是为微处理器或微控制器办理规划的底层软件。在嵌人式运用中,运用实时操作体系的最首要意图是添加体系的可靠性,进步开发功率、缩短开发周期。
μC/OS-II是一个可移植(portable)、可固化的(romable)和占先式的(preemptive)实时内核,最多能够办理64个使命(用户最多能够规划56使命)。μC/oS-II的源代码揭露,绝大部分代码运用规范的ANSIC:书写,所以能够方便地移植到许多不同品种的处理器或控制器上。用户能够免费从相关网站下载源代码。
现在,51系列的单片机在世界范围内有着广泛的运用。AT89S52是ATMEL公司使用51内核出产的一款FLASH型8位微控制器。控制器内部集成了8 kB的FLASH,256 B RAM,3个16位守时计数器,4组8位并行口,1个全双工可编程串行口。
笔者在用AT89S52单片机规划多路数据采集器时,在编译器KEIL环境下,成功地把μC/OS-II移植到AT89S52单片机上面。下面论说如何将μC/OS-II移植到AT89S52上。
2移植条件和必要进程
μc/OS-II要求微处理器有仓库指针、有CPU内部人栈与出栈指令以及必定容量的硬件仓库。AT89S52能够满意这些要求。
μC/OS-II在规划的时分充分考虑了可移植性。移植作业包含在OS CPU.H中设置1个常量、声明几个数据类型、声明3个宏,在OS CPU C.C中写6个简略的C函数,以及在OS CPU A.ASM中写几个汇编言语函数。
3移植的首要进程
3.1 OS CPU.H的编写
OS CPU.H需求规则栈的增加方向。这儿界说常量OS STK GROWTH为0,标明栈的增加方向向上。
用户要用到的变量类型应该在这儿界说,一起有必要留意KEIL对C言语的扩展。笔者只界说了以下几种变量类型。


最终还需求声明OS-TASK-SW()宏。
#define OS TASK SW() OSCtxSw()
3.2 OS CPU C.C中相关函数的编写
在(OS CPU C.C)中要写几个C函数(OS CPUC.C)。这几个C函数包含OSTaskStklnit(),OSTaskCreateHook(),OSTaskDelHook(),()STaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。他们中除了OSTaskStkInit()外都是用户依据自己的需求界说的,能够没有任何内容。下面侧重评论OSTaskStklnit()。
函数OSTaskStklnit()由使命创立函数OSTaskCreate()或()STaskCreateExt(),在树立每个使命的时分初始化使命仓库。初始化后的使命仓库看起来就像刚刚产生中止相同。开端运转这个使命便是模仿中止回来,把初始化后仓库的各个值康复给各个寄存器。所以初始化使命仓库便是在使命仓库中模仿产生过1次中止后的仓库结构,依照中止后的进栈次第预留各个寄存器的存储空间,还要在这些存储空间里边放上恰当的初值。用户仓库初始化时从下向上顺次保存:用户仓库长度,PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。
初始化使命栈的时分,需求传递使命代码开端指针(task)、参数指针(pdata)、使命仓库顶端的地址(便是仓库栈顶指针ptos)。使命栈初始化完成后,回来1个新的仓库栈顶指针,OSTaskcreate()或OSTaskCreateExt()将他保存到OS TCB中去。
OSTaskStklnit()的程序清单如下:
OS STK*OSTaskStklnit(void(*task)(void*pd),void*
ppdata,OS STK *ptos,INTl 6U opt)reentrant


3.3 OS_CPU_A.ASM中相关函数的编写
在OS CPU A.ASM中要写几个汇编言语的程序。这几个汇编程序包含OSStARtHIghRdy(),OSTIckISR(),OSCtxSw()和OSIntCtxSw()。限于篇幅,笔者在这儿只给出了OaNtARtHIghRdy()和OSTIckISR()的程序代码。
这儿先介绍4个宏:PUSHALL,POPALL,SAVESTFACK和RESTORESACK。PUSHALL的效果是把当时一切寄存器的内容以保存到体系栈中;POPALL的效果是在使命切换之前从体系仓库康复一切的寄存器中的内容;SAVESTACK的效果把体系栈的内容保存到使命栈(片外RAM);RESTORESTACK的效果把使命栈的内容复制到体系栈(片内)。在本规划中,因为AT89S52单片机的片内RAM有限,所以把使命栈规划在了片外。
OSStARtHIghRdy()的效果是使处于安排妥当状况的使命开端运转。在这个函数中调用钩子函数OSTaskSwHook(),这个函数能够让用户扩展体系的功用。然后取得优先级最高的使命的指针,依据这个指针从要开端运转使命的使命仓库中康复一切寄存器,康复完后履行1次中止回来(AT89S52单片机没有直接改动PC的指令),程序就开端运转安排妥当状况使命了。OSStARtHIghRdy()的程序清单如下:

OSTIcKISR()μC/OS-Ⅱ中的时钟节拍中止服务程序。μC/OS-Ⅱ需求用户供给周期性信号源,用于完成时刻延时和承认超时。μC/OS-Ⅱ中的时钟节拍服务是经过在中止服务子程序OSTIcklSR()中调用OSTimeTick()来完成的。OSTIcklSR()的程序清单如下:

OSCtxSw()用在使命级的切换场合。当需求从低优先级的使命切换到高优先级的使命时或当时使命主动抛弃CPU时,先保存处理器的内容到当时使命的使命仓库。再调用钩子函数OSTaskSwHook。然后从要开端使命的使命仓库里康复一切寄存器和PC的值,最终履行中止回来指令开端运转新的使命。