导言
μC/OS-II是依据优先级的可掠夺型内核,实时性较强,但不区别用户空间和体系空间,使得体系的安全性变差。而μC/OS-II官网供给的依据Cortex-M3内核移植的μC/OS-II操作体系,一直运转在特权级下,用户程序也能够拜访操作体系的变量和常量,导致体系的安全性与稳定性变得更差。
1 开发坏境与Cortex-M3内核简介
运用IAR 5.30开发环境,移植μC/OS-II 2.86到Cortex-M3内核上,选用装备了MPU的LPC1786处理器作为硬件试验渠道。
Cortex-M3处理器支撑:两种作业方式,线程方式和处理方式;两种拜访等级,特权级和用户级;两个仓库指针,主仓库指针(MSP)和进程仓库指针(PSP)。反常处理作业在“处理方式+特权级+MSP”下;线程方式下,拜访等级与仓库指针能够彼此调配运用;但是在用户级下,对特别功用寄存器和体系操控空间(SCS)的大部分寄存器的拜访是制止的。
假如处理器(如LPC1700系列、LM3S系列等)装备有MPU,可经过设定内存的拜访权限大幅度地进步体系的安全性。
2 μC/OS-II内核简介
μC/OS-II操作体系凭仗其源代码揭露、结构细巧、内核可掠夺、实时性高级许多特性而得到广泛的运用,而且μC/OS-II绝大部分代码是用C言语编写的,便于移植到各种内核上。它供给了比如使命调度、使命办理、时间办理、内存办理、中止办理,以及使命间的同步与通讯等实时内核的基本功用,而没有供给输入输出办理、文件体系、图形用户接口及网络组件之类的额定服务。但由于μC/OS-II具有较好的可移植性和开源性,用户能够依据实践运用增加所需求的服务,而且体系移植只需修正文件OS_CPU_C.C、OS_CPU.H、OS_CPU_A.ASM。
3 μC/OS-II操作体系移植的改善
假如用户使命运转在“用户级+PSP”状况下,而调用操作体系函数时运转在“特权级+MSP”状况下,再合作MPU的运用,能够使体系的安全性与稳定性得到很大的进步。
3.1 设置体系寄存器
体系使命(计算使命、闲暇使命等)只运用主仓库指针MSP,而且一直运转在特权级下;而用户使命则运用PSP、MSP两个仓库。在体系初始化时,设置MPU的相关寄存器,把内存分为特权级与用户级两个区,如图1所示。PSP分配在用户区,MSP、体系变量与常量分配在特权区,以进步体系的安全性。
3.2 修正体系函数
为了使命初次运转时,能够进入相应的拜访等级和运用相应的仓库指针,在使命创立时,参加作业状况参数mode。在ucos_ii.h中界说拜访等级与仓库挑选的常量:
3.2.1 修正使命操控块OS_TCB
在使命操控块中参加MSP指针,方式如下:
3.2.2 修正使命创立函数
在使命创立函数的参数中参加mode参数,方式如下:
对OSTaskCreateExt()函数做的修正同上。
3.2.3 修正仓库初始函数
在仓库初始化时,把mode值存储在MSP底部,以便使命第一次运转时进入相应的运转状况(特权级仍是用户级,运用MSP仍是PSP)。体系使命的mode是OS_Mode_PRIVILEGE | OS_Mode_MSP,使命创立时PSP为0;而用户使命为OS_Mode_USER | OS_Mode_PSP。
仓库初始函数的参数中参加mode参数,方式如下:
OS_TCBInit()函数把仓库初始化得到的仓库指针存入OS_TCB中。
3.3 修正OS_CPU_A.ASM文件中的函数
在OS_CPU_A.ASM文件中,只需修正函数PendSV_Handler(PendSV服务例程),使命切换是由它来完结的。
PendSV服务例程的流程如图2所示。
3.4 体系函数的运用
体系函数都是在“特权级+MSP”状况下履行的,因而,在用户使命调用体系函数前,应先切换到“特权级+MSP”状况,体系函数履行结束后再切换到“用户级+PSP”状况。详细代码如下。
在特权级下经过置位CONTRO[0]来进入用户级,而用户级下是不能直接修正CONTROL[0]回到特权级的,有必要经过一个反常,在反常例程中修正CONTROL[0],才能在返回到线程方式后拿到特权级。一般的办法是运用软中止SVC。
因而,从“用户级+PSP”状况下切换到“特权级+MSP”状况的完成办法是:在用户级下履行SVC指令,在SVC反常服务函数中清零CONTROL[0]位,再返回到线程方式下清零CONTROL[1]位切换到MSP;而从“特权级+MSP”状况下切换到“用户级+PSP”状况下,只需置位CONTROL[0]与CONTROL[1]。