
第9章 任务运行在特权级或非特权级模式 本章教程为大家讲解RTX运行模式的一个重要知识点,特权级模式和非特权级模式,有些资料或者书籍将非特权级模式称为用户模式。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。 9.1 RTX任务特权级知识点说明 9.2 RTX任务特权等级深入认识 9.3 实验例程说明 9.4 总结 对于初学者只需记住本小节的知识点即可,如果要深入的了解还是需要花些时间去研究下Cortex-M3或者M4权威指南。 对于使用Cortex-M3或者M4内核的芯片来说,RTX操作系统可以让任务运行在特权级或者非特权级模式,这两种模式是M3或者M4内核本身所具有的特性。 在特权级模式下,用户可以访问和配置系统控制寄存器,比如NVIC中断控制器。然而,如果是在非特权级模式下,系统控制寄存器是不允许访问的,一旦访问将导致硬件异常。 Unprivileged: 非特权级,起到保护用户任务的作用,防止用户可以在任意任务中访问和修改系统寄存器,操作不当会造成系统崩溃。 Privileged: 特权级,这种模式下用户可以在任意任务中对系统控制寄存器的访问和修改。 有了这点基础的认识之后,还有以下四个疑问有待解决。 6 D. T5 @; d0 D5 n5 z1 Y& V+ \ 9.1.1 非特权级模式下那些寄存器不可访问 对于Cortex-M3或者M4内核来说,所有的核心外设寄存器都是只能在特权级下才可以访问,那些又是核心外设寄存器呢,对于STM32来说需要大家看编程手册,如下这些核心外设所有的寄存器都需要在特权级下才可以访问: ![]() 核心外设主要是MPU,NVIC,SCB和STK四个单元。一些初学者要问了,你又是如何知道这些内核外设的寄存器要在特权级下才可以访问?答案就在这里,我们可以任意打开一个寄存器: ![]() ![]() 关于MPU,NVIC,SCB和STK四个单元的其它寄存器是否需要在特权级下才可以访问,大家可以按照我上面说的方法进行查看。 除了核心外设寄存器以外,M3/M4内核的特殊功能寄存器也是不能在非特权级下访问的,特殊功能寄存器主要包括以下寄存器: 1. 程序状态寄存器组(PSRs或曰xPSR) 2. 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及BASEPRI) 3. 控制寄存器(CONTROL) 对于参考手册上面所说的SPI,USART,USB等所有外设寄存器都是可以在非特权级下进行访问的。 ! d1 j/ @4 a8 E 9.1.2 非特权级模式下核心外设寄存器如何初始化 如果用户将RTX操作系统的任务设置在非特权级模式下运行,那么核心外设寄存器应该放在哪里进行初始化呢,主要有以下两种方法: 1. 使用SVC(Supervisor Call)软中断,这个在第19章有详细讲解。 2. 在初始化和开启RTX多任务前做核心外设的初始化。 8 T+ C, B; z4 m1 c9.1.3 Cortex-M3或者M4内核如何切换两种模式 Cortex-M3/M4中的特殊功能寄存器包括: 1. 程序状态寄存器组(PSRs或曰xPSR) 2. 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及BASEPRI) 3. 控制寄存器(CONTROL) 其中控制寄存器CONTROL是用来设置特权级和非特权级切换的,CONTROL寄存器定义如下: ![]() CONTROL[0] 仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个软中断,再由服务例程改写该位。 CONTROL寄存器也是通过MRS和MSR指令来操作的: MRS R0, CONTROL MSR CONTROL, R0 9.1.4 RTX任务特权等级的设置方法 RTX任务特权等级的设置方法比较简单,查看RTX系统的配置向导,如下图9.1所示: ![]() 图9.1 RTX配置向导 Run in privileged mode 此参数就是用来设置特权级和非特权级的,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。 |
9.3.1 STM32F103开发板实验
. D* d( f0 G) |/ U% h+ l% o! A
9 n; z' _( t" H2 c