μC/OS-II操作体系是一种抢占式多使命、单内存空间、细小内核的嵌入式操作体系,具有高效紧凑的特色。它履行效率高,占用空间小,可移植性强,实时功用杰出且可扩展性强。选用μC/OS-II实时操作体系,可以有效地对使命进行调度;对各使命赋予不同的优先级可以确保使命及时呼应;选用实时操作体系,降低了程序的复杂度,便利程序的开发和保护。 μC/OS-11十分合适运用在一些小型的嵌入式产品运用场合,在家用电器、机器人、工业操控、航空航天、军事科技等范畴有着广泛的运用。
单片机、ARM、FPGA与μC/OS-II操作体系相结合,完结一些详细功用,是现在嵌入式运用中比较常见的。在这些运用中,基础性的作业便是操作体系的移植。本文选取运用较多的51单片机、LPC2210、NiosII三种处理器进行介绍。
1 μC/OS-II操作体系移植条件
μC/OS-II操作体系的大部分源代码都是用C言语书写的,但仍需运用汇编言语来完结一些和处理器相关的操作,例如读写处理器、寄存器时只能运用汇编言语来完结。因而,将μC/OS-II操作体系移植到方针处理器上,需求从硬件和软件两方面来考虑。
硬件方面,方针处理器需满意以下条件:
①处理器的C编译器能发生可重入代码;
②用C言语可以开/关中止;
③处理器支撑中止,并且可以发生守时中止(通常在10~1 000 Hz之间);
④处理器可以支撑包容必定量数据的硬件仓库;
⑤处理器有将仓库指针和其他寄存器读出和存储到仓库或内存中的指令。
软件方面,首要重视的是一些与处理器相关的代码移植,其散布在OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM这3个不同的文件中。
2 方针处理器硬件支撑
51单片机、LPC2210、NiosII三种处理器在硬件方面均能满意μC/OS-II操作体系的移植要求。
51单片机:挑选Keil公司的集成开发环境作为开发工具,由于该集成开发环境的C51编译器能发生可重入型代码,且用C言语就可以开/关中止。一起具有必定数量的仓库和操作相关寄存器的指令。
LPC2210:选用ARM7微操控器可以满意上述②、④、⑤,而ADS1.2的C编译器可以满意①、③的要求。
NiosII处理器:Nios处理器可以装备成最多支撑64个中止,包含外部硬件中止、内部中止以及TRAP(调试中止)。Nios II处理器可以装备运用32位内部守时器,经过用软件操控写入几个操控寄存器的内容来取得守时作业,与一般的守时器作业原理相同,可以发生守时中止。 Nios处理器可以外接存储器。以运用的DE2开发板为例,外接512 KB SRAM资源,可提供满足的数据硬件仓库。NioslI 8.0 IDE选用GNU编译器,支撑C/C++的编译、链接发生重入代码,答应在C言语中嵌入汇编言语。
3 软件移植进程
3.1 OS_CPU.H的完结
OS_CPU.H文件包含了用#define言语界说的与处理器相关的常数、宏以及数据类型。
在上述三种处理器选用的不同编译器中,数据类型的界说是相同的,在此不做详细介绍。
在OS_CPU.H中界说与处理器相关的宏,首要是进入临界区的OS_ENTER_CRITICAL()和退出临界区的OS_EXIT_CRITICAL()。
在Keil编译器中,EA是总中止。
#define OS_ENTER_CRITICAL() EA=0;//关中止
#define OS_EXIT_CRITICAL() EA=1;//开中止
在ADS编译器中界说为软件中止函数,并编写软件中止处理代码完结开/关中止。
_swi(0x00)viod OS_TASK_SW(viod);//使命级使命切换函数
_swi(0x00)viod OS_ENTER_CRITICAL(viod);//关中止
_swi(0x00)viod OS_EXIT_CRITICAL(viod); //开中止
在NiosII 8.0 IDE编译器中:
#define OS_ENTER_CRITICAL() asm(“PFX 8\n WRCTL%g0;”) //关中止
#define OS_EXIT_CRITICAL() asm(“PFX 9\n WRC TL%g 0;”) //开中止
仓库的增加方向经过设置OS_STK_GROWTH为0或许1来确认。51单片机中只能设置为0,表明仓库是从下往上增加的。LPC2210中则可以设置成0或许1。NiosII中则只能设置成1,表明仓库是从上往下增加的。
3.2 OS_CPU_C.C的完结
OS_CPU_C.C中,首要应改写仓库初始化函数OS-TaskStkIint()。有必要依据移植时统必界说的使命仓库结构进行初始化,其他9个钩子函数只需阐明即可。也可依据移植时用户自己的需求,编写相应的操作代码。
以LPC2210为例,仓库空间从高到低顺次存放着PC,LR,R12,R11,…,R1,R0,CPSR,OsEnterSum。每个使命都有独立的 OsEnterSum,在使命切换时保存和康复各自的OsEnterSum值。各个使命开/关中止的状况可以不同,这样完结了开/关中止的嵌套。
关于51单片机和NiosII处理器的这部分移植,请参看参考文献。
3.3 OS-CPU-A.S的完结
这部分需求对处理器的寄存器进行操作,所以有必要用汇编言语编写。μC/OS-II移植要求用户编写4个简略的汇编言语函数:OSStartHighRdy()、OSCtxSw()、OS-IntCtxSw()、OSTickISR()。
OSStartHighRdy()的使命是进行使命调度和切换;OSCtxSw()的使命是强制CPU进行寄存器和程序计数器的切换;OSIntCtxSw()的使命是在中止回来时进行使命切换;OSTickISR()是时钟节拍中止服务程序,用来完结时刻的推迟和超时功用。
以OSStartHighRdy()使命调度和切换函数为例,介绍3种处理器移植代码。
(1)51单片机
OSStartHighRdy:
结 语
51单片机、LPC2210,NiosII三种处理器在现在的嵌入式运用方面有着宽广的市场前景。将μC/OSs-II操作体系移植到这三种以及其他处理器上,可以更好地确保体系运行时的稳定性和实时性,并且该操作体系代码少,易于把握和移植。
本文所介绍的μC/OS-II操作体系在3种处理器上的移植是笔者在实践学习进程中,进行的整理和小结,对初学者有必定的参考价值。