对于初学者只需记住本小节的知识点即可,如果要深入的了解还是需要花些时间去研究下Cortex-M3或者M4权威指南。
对于使用Cortex-M3或者M4内核的芯片来说,RTX操作系统可以让任务运行在特权级或者非特权级模式,这两种模式是M3或者M4内核本身所具有的特性。
在特权级模式下,用户可以访问和配置系统控制寄存器,比如NVIC中断控制器。然而,如果是在非特权级模式下,系统控制寄存器是不允许访问的,一旦访问将导致硬件异常。
u Unprivileged:
非特权级,起到保护用户任务的作用,防止用户可以在任意任务中访问和修改系统寄存器,操作不当会造成系统崩溃。
u Privileged:
特权级,这种模式下用户可以在任意任务中对系统控制寄存器的访问和修改。
有了这点基础的认识之后,还有以下四个疑问有待解决。
关于MPU,NVIC,SCB和STK四个单元的其它寄存器是否需要在特权级下才可以访问,大家可以按照我上面说的方法进行查看。
除了核心外设寄存器以外,M3/M4内核的特殊功能寄存器也是不能在非特权级下访问的,特殊功能寄存器主要包括以下寄存器:
u 程序状态寄存器组(PSRs或曰xPSR)
u 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及BASEPRI)
u 控制寄存器(CONTROL)
对于参考手册上面所说的SPI,USART,USB等所有外设寄存器都是可以在非特权级下进行访问的。
9.1.2 非特权级模式下核心外设寄存器如何初始化
如果用户将RTX操作系统的任务设置在非特权级模式下运行,那么核心外设寄存器应该放在哪里进行初始化呢,主要有以下两种方法:
u 使用SVC(Supervisor Call)软中断,这个在第19章有详细讲解。
u 在初始化和开启RTX多任务前做核心外设的初始化。
Cortex-M3/M4中的特殊功能寄存器包括:
u 程序状态寄存器组(PSRs或曰xPSR)
u 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及BASEPRI)
u 控制寄存器(CONTROL)
其中控制寄存器CONTROL是用来设置特权级和非特权级切换的,CONTROL寄存器定义如下:
本小节的知识点对于初学者来说比较难理解,需要积累了一定的经验后才能更好的理解,不过还是建议读一读。
深入了解Cortex-M3/M4内核的特权等级就不得不说说两种操作模式,Cortex-M3/M4支持两种操作模式,两种操作模式分别是:
u Handlermode,中断模式,简单的说就是指的异常服务程序是处在中断模式。
u Threadmode,线程模式,简单的说就是异常服务程序以外的程序都是处在线程模式。
Cortex-M3/M4内核实现这两种操作的目的就是区分普通应用程序的代码和异常服务程序。下面是两种操作模式和两种特权等级的关系:
l 中断和异常的区别
在 ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,
u Task Configuration
l Number of concurrent running tasks
允许创建4个任务,实际创建了如下四个任务
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。
l Number of tasks with user-provided stack
创建的4个任务都是采用自定义堆栈方式。
l Run in privileged mode
设置RTX任务运行在非特权级,即用户模式。
u Task Configuration
l Number of concurrent running tasks
允许创建4个任务,实际创建了如下四个任务
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。
l Number of tasks with user-provided stack
创建的4个任务都是采用自定义堆栈方式。
l Run in privileged mode
设置RTX任务运行在非特权级,即用户模式。