摘要:指出了μC/OS—III较μC/OS—II的改善和开展,阐明晰移植μC/OS—III的一般准则和办法,最终逐渐给出了μC/OS—IlI在S12X架构上移植的进程,读者依照该进程就可以顺利完结移植作业。
要害词:μC/OS—III;S12X;CodeWarrior V5.1
导言
S12X架构是飞思卡尔公司推出的16位CPU,占有必定的单片机运用商场。μC/OS—III是.Micrium公司推出的一款实时操作体系(RTOS),它的前身——μC/OS—II,因为源码揭露、实时性好、便于学习等长处,运用十分广泛,并被移植到了简直一切干流的CPU架构上。可是到目前为止,μC/OS—III在S12X架构上还没有官方的移植版别。
μC/OS-III比较μC/OS—II作了很大的改善,整个内核根本被重写。使命的数量可无限多,只受限于体系存储器的巨细;因为支撑时刻片轮转调度,使命的优先级可以相同;选用了推迟中止处理机制(deferred post),中止服务所要拜访的全局变量数变得很少,使得大部分临界代码的维护只需求封闭调度器,而不需求封闭中止,大大缩短了体系的中止推迟;体系时钟服务(tick handling)被移到了使命级履行,进一步缩短了中止推迟;引入了时刻戳的概念,用32位计数器为体系供给了准确的时标,用来核算每个使命的CPU运用率、最长关中止时刻、最长关调度器时刻等;供给了共同的、丰厚的运转时计算参数,为更好地运用μC/OS—III供给了有力的根底。更深化地了解μC/OS—III内核,读者可以拜见参阅文献。
总归,μC/OS—III是μC/OS—II的全面晋级,具有更短的中止推迟、更丰厚的运转时参数、更丰厚的调试手法、更优的代码安排、更灵敏的装备和运用等,可是,μC/OS—III关于硬件却没有更高的要求:关于ROM的需求,μC/OS—III为6~24 KB,μC/OS—II为6~26KB;关于RAM的需求二者均为1 KB左右,可见μC/OS—III相同适宜运转在低端的8位、16位单片机上。因为承继了μC/OS—II的长处,μC/OS—III有了这么多新的优异特性,它应该会得到更广泛的运用。本文详细地叙述了μC/OS—III移植的办法和在S12X架构上移植的详细进程,期望能对在该方面有需求的读者供给协助。
1 μC/OS-III的移植办法
如前所述,μC/OS—III关于硬件的要求并不比μC/OS—II高多少。事实上,只需满意如下几条,μC/OS—III就可以被移植到该平台上:
①处理器带有支撑规范C的东西链,而且需求支撑32位数据。
②处理器支撑中止,并可以供给10~1 000 Hz的周期中止作为体系的时钟节拍源。
③中止可以被封闭和翻开。
④处理器有栈指针寄存器,而且一切其他的寄存器可以被存储和康复。
⑤处理器可以支撑满意的寻址空间。
这几个条件,现在的处理器架构都可以满意,S12X明显也满意,所以μC/OS—III可以移植到S12X架构上。
μC/OS—III的代码安排十分利于移植,代码依照模块分层次地安排在一起。移植时需求改动的模块和文件如表1所列。
2 μC/OS-III在S12X架构上移植的进程
2.1 第一步:树立适宜的起点
移植之前找一个适宜的起点十分必要。这包含挑选现已移植好的可运转的版别、东西链和开发板。因为不存在飞思卡尔16位CPU的μC/ OS—III的移植版别,这儿挑选K60移植版别。该移植版别的IAR示例工程可以从Micrium官方网站下载。东西链挑选CodeWarrior Development Studio for S12(X)V5.1(以下简称CW5.1),开发板运用MC9S12XDP512的中心小板即可。K60的处理器根据Cortex—M4架构,是32位CPU,与S12X 16位处理器存在很大的差异,所以表1中所列的文件根本需求悉数重写。
2.2 第二步:新建工程
翻开CW5.1,新建工程,挑选方针为MC9S12XDP512,调试办法为TBDML,选用C言语开发,挑选小存储形式(small memory model),其他的选项依照默许设置即可。MC9S12XDP512选用了分页内存机制,扩展了16位CPU的64 KB寻址空间,它具有512 KB的Flash,出于简略考虑,移植的进程中疏忽这种分页机制,即所谓的小存储形式,只运用默许的64 KB的存储空间。关于大多数的16位单片机运用,这么大的存储空间应该够用。μC/OS—III的规划并没有固定代码和数据的方位,也没有固定中止的设置办法,也没有固定自己的发动代码,将这些都交给了东西链或许用户。μC/OS—III代码的运转开端于main函数,关于之前的C言语环境初始化、硬件初始化没有什么特别的需求,关于自己的代码和数据段的放置也没有特别的要求,这应该说是一种灵敏性。中止设置,需求在前述的prm文件中参加如下几行:
VECTOR 0_startup
VECTOR 7OS_CPU_SysTickHandler
VECTOR 4OSCtxSw
别离拟定好用于使命切换的软中止和时钟节拍的RTI中止。
2.3 第三步:增加文件
翻开资源管理器,在工程目录下新建表2所示目录,并从官网上下载的IAR示例工程中复制相应的文件。在CW5.1的工程中增加表2中新建的文件夹,并将上述复制的文件参加对应的文件夹。接下来需求修正途径设置:Edit->Standard Setting->Target->Access Paths,勾选Always Search Usei Paths。这样,增加文件的环节算是完结了。
2.4 第四步:修正文件
这一步是移植的要害,依照表2的总结,总共需求修正8个文件,接下来逐一阐明。
(1)os_cpu_a.asm
该文件包含了OSStartHiglaRdy、OSCtxSw、OSIntCtxSw 三个完结使命切换的代码片段,将这3个片段界说到一个代码段,比方codesecti on2段,详细就是在文件开端处加上句子“codesection2:SECTION”即可。别的,μC/OS—III中这3个函数都是在临界代码段中拜访,故不需求考虑同享变量的问题。OSCtxSw的代码如下:
该函数被规划成swi软中止的服务程序,所以1~2行代码结合中止响应时的入栈操作完结了被换出使命的上下文的保存,3行调用介入函数,4~7行修正了记载当前使命TCB和优先级的全局变量,8即将SP换成了换入使命的栈指针,9行履行后CPU会装载换入使命的上下文,然后完结了上下文切换。OSStartHighRdy和OSIntCtxSw的机制和OSCtxSw相似,代码别离如下:
应该留意到,这3个函数的功用只是是保存换出使命的上下文和装载换入使命的上下文,之所以这么简略,首要是因为S12X的寄存器很少,中止响应和回来进程硬件都主动完结了一切寄存器的保存和康复。这也从一个旁边面阐明晰为什么需求凭借中止完结使命切换的一个原因:凭借中止机制,可以高效简练地完结上下文切换。
(2)os_cpu_c.c
这个文件里边至少需求修正两个函数,即使命栈初始化函数OSTaskStkInit和时钟节拍服务程序OS_CPU_SysTickHandler。遵循S12X中止的栈结构,OSTaskStkInit完结如下:
从栈顶到栈底依次为CCR、D、X、Y、PC,依照S12X的C言语参数传递规矩,使命函数的传入参数被保存在了D寄存器对应的栈方位。
该宏保存被中止使命的栈顶指针,在其TCB结构中,之所以需求先递加SP、保存SP、再递减,是因为CPU_SR_ALLOC()宏界说了一个局部变量,该变量处在使命栈上,可是不属于上下文的一部分。
假如在该移植版别上写中止服务子程序,都需求写成上述格局,μC/OS-III才可以正常运转。别的,需求将OSTaskSwHook函数独自界说在os_cpu_a.asm文件中所界说的那个段中,这只需在该函数头尾加上如下句子:
#pragma CODE_SEG codesection2
void OSTaskSwHook(void){
……
}
#pragma CODE_SEG DEFAULT
这是因为该函数被os_cpu_a.asm文件中的3个汇编函数以bsr指令调用,而bsr只可以完结-128~+127规模的相对搬运,故这儿只需求将他们放在同一段,即可完结跳转。
os_cpu.h为头文件,需求界说上述OS_SAVE_SP()宏,其他的可以不更改,也可以删去那些没有被界说的声明(如本来的pendSV的服务子程),留意os_cpu_a.asm是彻底重写,os_cpu_c.c只是修正上述两个函数。
(3)cpu.h
编译器无关的数据类型界说,可以参阅Edit->Standard Setting->Compiler for HC12->type sizes,默许情况下char为8位,int和short为16位,long和long long为32位,该编译器不支撑64位。该处理器为大端形式、栈成长方向为递减,其他的设置都很简略改动,这儿不逐个赘述。
(4)cpu_a.asm
代替对应的函数如下所示,其他的函数可以删去(μC/OS—III没有用到):
这几个函数完结相应的使能中止、封闭中止、保存中止状况并封闭、康复中止状况这4个功用,都比较简略,这儿不再赘述。
cpu_c.c文件中的函数其实都可以删了,当然也可以保存,因为这儿面本来是一些关于中止向量操作、位带操作指令,这些都是特定于Cortex—M3的,S12X并没有位操作的对应指令。
最终是bsp.c和bsp.h,简略起见,bsp.c只界说了如下函数:
void BSP Init(void){
IRQCR=0x00;
RT%&&&&&%TL=0x74;
CRGINT|=0x80;
}
这算得上是最简略的“bsp包”了,只是设置并使能了RTI中止作为体系时钟中止(当然还封闭了IRQ中止)。该函数需求在第一个运转的用户使命中调用,开端μC/OS—III的心跳。
至此,一切必要的文件修正作业现已完结。
2.5 第五步:调试运转
通过上述进程,假如编译、链接没有什么问题,写一个简略的运用,凭借调试器就可以对根据μC/OS—III的运用进行调试了。其实在移植的进程中,第四步的许多细节都是在第五步的调试中发现问题并完善的。值得留意的是,因为MC9S12XDP512没有32位的计数器,所以bsp.c里边也没有初始化该计数器的代码,也没有供给体系所需的CPU_TS_TmrRd函数,所以以下几个宏应该装备如下:
#defineOS_CFG_TS_EN 0u
#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u
不界说CPU_CFG_INT_DIS_MEAS_EN宏,在这种装备下,体系一切依赖于时刻戳的功用都被封闭。其他的μC/OS—III组件都可以使能。
结语
运用CW5.1集成开发环境的读者,只需依照以上进程,即可在S12X系列单片机上完结μC/OS—III的移植和运转。本文还融入了笔者关于μC/OS—III的了解,期望可以协助读者了解和了解μC/OS-III的移植作业,进一步加深关于该款优异实时内核的了解。