关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > CortexM3内核的μC/OSII安全性与稳定性的研究

CortexM3内核的μC/OSII安全性与稳定性的研究

作者:时间:2010-12-21来源:网络收藏


4.1 系统寄存器的设置

用户应用程序运行在用户级,使用PSP堆栈指针;操作系统函数运行在特权级,使用的也是PSP堆栈指针;而中断服务例程运行在处理模式的特权方式下,使用MSP堆栈指针。

特权与用户级分区
特权与用户级分区
图2 特权与用户级分区

首先利用MPU把内存分为特权级访问和用户级访问两个区,如图2所示。在系统初始化时,设置MPU相关寄存器,为系统分配任务堆栈与主堆栈:任务堆栈分配在用户区,系统变量与主堆栈分配在特权区,只可特权级下访问。

4.2 系统函数的修改

用户任务工作在用户级下,操作系统函数工作在特权级下,任务可能会在执行系统函数时执行上下文切换,因此系统要记录任务切换时是处在特权级还是用户级下,以便任务再次获得处理器控制权时,切换到原先的访问等级下。在任务创建时,加入访问权限参数mode。

权限的值定义为:

#define OS_Mode_USER 1u //用户级

#define OS_Mode_PRIVILEGE 0u //特权级

在创建任务函数与堆栈初始函数的参数中加入访问权限参数,形式如下:

INT8U OSTaskCreateExt (……,INT8U mode );

OS_STK *OSTaskStkInit (……,INT8U mode);

在堆栈初始化时,把mode最后存到堆栈当中,以便任务第一次运行时进入相应的工作模式(特权级或用户级)。统计任务和空闲任务的mode是OS_Mode_PRIVILEGE,而用户任务为OS_Mode_USER。

4.3 OS_CPU_A.ASM文件中函数的修改

在OS_CPU_A.ASM文件中,只需修改函数PendSV_Handler(PendSV服务例程),任务切换是由它来完成的。同时,设置PendSV的优先级为最低,以便快速响应中断,提高系统的实时性。PendSV服务例程的流程如图3所示。

PendSV服务例程流程
PendSV服务例程流程
图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中


评论


相关推荐

技术专区

关闭