uC/OS-II是一个源码公开应用于嵌入式的小型的RTOS(实时),由于其内核精简,可理解性和可移植性强,因此广泛应用于小型的嵌入式系统中.
内核工作原理:
实时嵌入式操作系统mC/OS-II内核的工作原理如图1所示。首先,在主程序中对操作系统进行初始化,完成 uC/OS-II所有变量和数据结构的初始化,包括任务控制块(TCB)初始化,TCB优先级表初始化,TCB链表初始化,事件控制块(ECB)链表初始化以及空闲任务的创建等。
在理解了处理器和C编译器的技术细节后,uC/OS的移植只需要修改与处理器相关的代码就可以了。具体有如下内容:
·OS_CPU.H中需要设置一个常量来标识堆栈增长方向;
·OS_CPU.H中需要声明几个用于开关中断和任务切换的宏;
·OS_CPU.H中需要针对具体处理器的字长重新定义一系列数据类型;
程序进入Task1()后,首先初始化时钟和启动时钟节拍源开始计时。此节拍源给系统提供周期性的时钟中断信号,实现延时和超时确认。然后根据应用程序要求,完成该任务的基本功能。最后,调用OSTimeDly(),将自己挂起,即从就绪表中删除。直到等待延时时间到,才将该任务恢复到就绪表中,并等待调度器的调度。
OSTimeDly()将任务挂起的同时,为其做好延时记号,然后调用OS_Sched()进行任务级的任务调度。若此时没有任何任务进入就绪态,就切换到空闲任务。
当时钟中断来临时,系统进入中断服务程序OSTickISR()。系统把当前正在执行的任务挂起,保护现场,进行中断处理OSTimeTick(),判断有无任务延时到期,若有,则使该任务进入就绪态。最后调用OSIntExit()进行中断级的任务调度,从而切换到优先级最高的任务,若没有别的任务进入就绪态,则恢复现场继续执行原任务
然后,根据应用程序的需要,用户可以调用OSTaskCreate()函数创建多个任务(至少1个)。该函数为新任务建立任务堆栈(OSTaskStkInit())以及初始化任务控制块TCB(OS_ TCBInit())。
最后,通过调用OSStart()启动多任务调度。程序将跳到就绪表中优先级最高的任务开始执行。这里假设启动多任务调度前创建了一个任务Task1()。
要移植uC/OS,目标处理器必须满足以下要求;
·处理器的C编译器能产生可重入代码,且用C语言就可以打开和关闭中断;
·处理器支持中断,并能产生定时中断;
·处理器支持足够的RAM(几K字节),作为多任务环境下的任务堆栈;
·处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。
·OS_CPU_A.ASM需要改写4个汇编语言的函数;
·OS_CPU_CH,将上面的三个文件和其他自己的头文件加入。