Cortex-M3内核的μC/OSII性能研究
,提高系统的实时性。PendSV服务例程的流程如图3所示。
图3 PendSV服务例程流程
任务切换上文的程序:
SUBS R0,R0,#0x24;调整PSP指针,mode、R4~R11共36字节
MRS R1,CONTROL;获取当前任务的访问等级mode
STM R0,{R1,R4R11};压栈mode,R4~R11
LDR R1,=OSTCBCur;获取OSTCBCur?OSTCBStkPtr
LDR R1,[R1]
STR R0,[R1];存储PSP值到任务控制块切换下文的程序:
……;OSPrioCur=OSPrioHighRdy;
……;OSTCBCur=OSTCBHighRdy;
……;得到新任务的PSP值,存储到R0中
LDM R0,{R1,R4R11};R1(mode),R4~R11出栈
MSR CONTROL,R1;修改CONTROL[0]
ORR LR,LR,#0x04;选择返回时使用的堆栈
ADDS R0,R0,#0x24;调整PSP值
MSR PSP,R0;R0存入PSP中
4.4 系统函数的使用
系统函数都是在特权级下执行的,在应用程序中调用系统函数前应该切换到特权级,系统函数执行完毕后再切换后用户级。调用形式如下:
ToPrivilege ();
OSFunction(Parameter1, Parameter2……);//系统函数
ToUser ();
在特权级下可以通过置位CONTROL[0]来进入用户级。用户级下是不能通过修改CONTROL[0]来回到特权级的,必须通过一个异常handler来修改CONTROL[0],才能在返回到线程模式后取得特权级。因此,从用户级到特权级的方法就是产生一个异常,再在异常例程中修改CONTROL[0]。通常的方法是使用软中断SVC。
切换到特权级的代码如下:
ToPrivilege;函数ToPrivilege ()
SVC 0
BX LR
SVC_Handler;SVC服务例程
MRS R1,CONTROL
AND R1,R1,#0xFE
MSR CONTROL,R1;回到特权级
BX LR
而从特权到用户级就简单了,只要执行切换程序就可以了,不用产生异常。切换到用户级的代码为:
ToUser;函数ToPrivilege ()
MRS R0,CONTROL
ORR R0,R0,#0x01;切换到用户级
MSR CONTROL,R0
BX LR
4.5 其他改进方法
任务在用户级+PSP下运行,而操作系统函数运行在特权级+MPS运行,中断服务例程有硬件设定在处理模式+特权级+MSP,这样系统的安全性和稳定性会更高。但是每个任务需要两个堆栈PSP、MSP。这样无疑增加了内存的使用(将近增加一倍),由于嵌入式芯片的片内RAM比较小,增加内存必然会增加成本,并且要对任务控制块做相应的修改,存储两个堆栈。任务创建时对这两个堆栈都要初始化,任务切换时判断切换的堆栈与访问权限,这些都增加了系统的开销。
结语
系统连续稳定地运行10个小时以上没出现任何问题,可见系统移植成功。利用CortexM3内核选配的MPU,对μC/OSII操作系统进行修改,只是增加了很小的系统开销,却使系统的安全性和稳定性得到了很大的提高。该方法可应用于对系统安全性与稳定性要求比较高的场合。
研究 性能 C OSII 内核 Cortex-M3 相关文章:
- 基于DSP的音频会议信号合成算法研究(05-10)
- 基于定点DSP的MP3间频编码算法研究(07-04)
- DSP的并联电力有源滤波器的仿真研究(02-15)
- PCI总线数据采集系统的硬件研究(09-12)
- PIC单片机在温度测量领域的应用及仿真研究(11-23)
- 嵌入式软PLC 的设计与研究(06-27)