Uc/os-II的移植与FreeRTOS的移植很类似,FreeRTOS 的移植大致由3 个文件完成,一个.h 文件界说编译器相关的数据类型和中止处理的宏界说;一个.c 文件完成使命的仓库初始化、体系心跳的办理和使命切换的恳求;一个.s 文件完成详细的使命切换。Uc/os-II的移植主要由OS-CPU.H、OS-CPU-C.C以及OS-CPU-A.ASM完成。
1. INCLUDE.H
INCLUDE.H是一个主头文件,它出现在每个.C文件的第1行。
能够经过从头修改INCLUDE.H,增加自己的头文件,但头文件有必要增加在头文件列表的最终。
2. OS-CPU.H
OS-CPU.H包含了用|define句子界说的、与处理器相关的常数、宏以及类型。
3. OS-CPU-C.C
Uc/os-II的移植要求用户编写10个简略的C函数:(Hook结束表明相应的接口函数)
(1) OSTaskStkInit( ) 初始化使命的栈结构
OSTaskCreate( )和OSTaskCreatExt()经过调用它来初始化使命的栈结构;因而,仓库看起来就像中止刚发生过相同,一切的寄存器都保存在仓库中。别的,在初始化仓库今后,OSTaskStkInit( )应当回来仓库指针所指向的地址。
(2) OSTaskCreateHook( )
每逢增加使命时,OS-TCBInit()函数都会调用OSTaskCreateHook( )
函数,当其被调用时,它会收到指向刚刚树立使命的使命操控块的指针。这样,它就能够拜访使命操控块结构的一切的成员了。若用OSTaskCreate()树立使命,OSTaskCreateHook( )的功用是有限的;但若运用OSTaskCreateExt()树立使命时,会得到OS-TCB中的扩展指针(OSTCBExtPtr)。该指针可用来拜访使命的附加数据,如浮点寄存器、MMU寄存器、使命计数器、以及调试信息。能够查看OS-TCBInit()看做了哪些作业。
(3) OSTaskDelHook( )
在使命从安排妥当列表或等候列表中被删去后,OSTaskDel()就会调用OSTaskDelHook( )。当调用当时,它会收到一个指向正在被删去使命的使命操控块的指针,使它能够拜访使命操控块结构的一切的成员。
(4) OSTaskSwHook( )
使命切换时被调用,能够直接拜访OSTCBCur和OSTCBHighRdy这2个全局变量。OSTCBCur指向将被切换出去的使命的使命操控块,OSTCBHighRdy指向新使命的使命操控块。
(5) OSTaskIdleHook( )
OSTaskIdle()可调用OSTaskIdleHook( )完成CPU的低功耗形式。
(6) OSTaskStatHook( )
每秒都会被计算使命OSTaskStat()调用一次,能够用其扩展计算使命功用。例如,能够盯梢并显现每个使命的履行时间、每个使命所用的CPU比例以及每个使命履行的频率等等。
(7) OSTimeTickHook( )
每个时钟节拍都会被OSTimeTick()调用。
(8) OSInitHookBegin( )
进入OSInit()函数后,OSInitHookBegin( )就立即被调用,增加其原因在于,这个函数使得用户能够将自己特定代码也放在OSInit()中,使代码简洁明了。
(9) OSInitHookEnd( )
与OSInitHookBegin( )类似,仅仅它在OSInit()函数回来之前被调用。
(10)OSTCBInitHook( )
OS-TCBInit()函数在调用OSTaskCreateHook( )之前,会先调用OSTCBInitHook( )。原因在于,用户能够在OSTCBInitHook( )中做一些与初始化操控块OS-TCB有关的处理;在OSTaskCreateHook( )中做一些以初始化使命有关的处理。同OSTaskCreateHook( )相同,OSTCBInitHook( )会收到指向新增加使命的使命操控块的指针。
4.OS-CPU-A.ASM
Uc/os-II的移植要求用户编写4个简略的汇编语言函数:
(1) OSStartHighRdy()
OSStart()函数调用OSStartHighRdy()来使安排妥当使命中优先级最高的使命开端运转。牢记,在调用OSStart()之前,要现已树立了至少1个使用使命。
(2) OSCtxSw()
使命级的切换是经过履行软中止指令,或许根据处理器的不同,TRAP(圈套)指令来完成的。中止服务子程序,圈套或反常处理的向量地址有必要指向OSCtxSw()。
(3) OSIntCtxSw()
OSIntExit()经过调用OSIntCtxSw(),在ISR中履行使命切换功用。OSIntCtxSw()与OSCtxSw()很类似,差异仅仅,由于ISR现已保存了CPU的寄存器,而不需要再在OSIntCtxSw()函数中保存。