完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转rtx操作系统
本章教程为大家讲解RTX运行模式的一个重要知识点,特权级模式和非特权级模式,有些资料或者书籍将非特权级模式称为用户模式。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。 9.1 RTX任务特权级知识点说明 9.2 RTX任务特权等级深入认识 9.3 实验例程说明 9.4 总结 9.1 RTX任务特权级知识点说明 对于初学者只需记住本小节的知识点即可,如果要深入的了解还是需要花些时间去研究下Cortex-M3或者M4权威指南。 对于使用Cortex-M3或者M4内核的芯片来说,RTX操作系统可以让任务运行在特权级或者非特权级模式,这两种模式是M3或者M4内核本身所具有的特性。 在特权级模式下,用户可以访问和配置系统控制寄存器,比如NVIC中断控制器。然而,如果是在非特权级模式下,系统控制寄存器是不允许访问的,一旦访问将导致硬件异常。 u Unprivileged: 非特权级,起到保护用户任务的作用,防止用户可以在任意任务中访问和修改系统寄存器,操作不当会造成系统崩溃。 u Privileged: 特权级,这种模式下用户可以在任意任务中对系统控制寄存器的访问和修改。 有了这点基础的认识之后,还有以下四个疑问有待解决。 |
|
相关推荐
|
|
9.1.1 非特权级模式下那些寄存器不可访问
对于Cortex-M3或者M4内核来说,所有的核心外设寄存器都是只能在特权级下才可以访问,那些又是核心外设寄存器呢,对于STM32来说需要大家看编程手册,如下这些核心外设所有的寄存器都需要在特权级下才可以访问: 核心外设主要是MPU,NVIC,SCB和STK四个单元。一些初学者要问了,你又是如何知道这些内核外设的寄存器要在特权级下才可以访问?答案就在这里,我们可以任意打开一个寄存器: |
|
|
|
|
|
关于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多任务前做核心外设的初始化。 |
|
|
|
|
|
9.1.3 Cortex-M3或者M4内核如何切换两种模式
Cortex-M3/M4中的特殊功能寄存器包括: u 程序状态寄存器组(PSRs或曰xPSR) u 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及BASEPRI) u 控制寄存器(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配置向导 u Run in privileged mode 此参数就是用来设置特权级和非特权级的,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。 |
|
|
|
|
|
9.2 RTX任务特权等级深入认识
本小节的知识点对于初学者来说比较难理解,需要积累了一定的经验后才能更好的理解,不过还是建议读一读。 深入了解Cortex-M3/M4内核的特权等级就不得不说说两种操作模式,Cortex-M3/M4支持两种操作模式,两种操作模式分别是: u Handlermode,中断模式,简单的说就是指的异常服务程序是处在中断模式。 u Threadmode,线程模式,简单的说就是异常服务程序以外的程序都是处在线程模式。 Cortex-M3/M4内核实现这两种操作的目的就是区分普通应用程序的代码和异常服务程序。下面是两种操作模式和两种特权等级的关系: l 中断和异常的区别 在 ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外, 当有指令执行了“非法操作”, 或者访问被禁的内存区间,因各种错误产生的 fault, 以及不可屏 蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可 以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。 |
|
|
|
|
|
当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面,handler模式总是特权级的。
在系统复位后,处理器进入线程模式+特权级。 在特权级下的代码可以通过置位CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将 以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。用户级下的代码不能再试图修改 CONTROL[0]来回到特权级。它必须通过一个异常handler,由那个异常handler来修改CONTROL[0],才能在 返回到线程模式后拿到特权级。下图是特权级线程模式和用户级线程模式的切换图: 一些简单的应用程序是不需要用户级线程模式的,如下图所示: |
|
|
|
|
|
把代码按特权级和用户级分开对待,有利于使CM3/CM4的架构更加安全和健壮。例如,当某个用户程序代码出问题时,不会让它成为害群之马,因为用户级的代码是禁止写特殊功能寄存器和NVIC中断寄存器的。另外,如果还配有MPU,保护力度就更大,甚至可以阻止用户代码访问不属于它的内存区域。
为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给应用程序专门配一个堆栈,不让它共享操作系统内核的堆栈。在这个管理制度下,运行在线程模式的用户代码使用PSP,而异常服务例程则使用MSP。这两个堆栈指针的切换是智能全自动的,就在异常服务的始末由硬件处理。 如前所述,特权等级和堆栈指针的选择均由CONTROL负责。当CONTROL[0]=0时,在异常处理的始末,只发生了处理器模式的转换,如下图所示。 |
|
|
|
|
|
但若CONTROL[0]=1(线程模式+用户级),则在中断响应的始末,处理器模式和特权等极都要发生变化,如下图所示。
CONTROL[0]只有在特权级下才能访问。用户级的程序如想进入特权级,通常都是使用一条“系统服务呼叫指令(SVC)”来触发“SVC异常”,该异常的服务例程可以视具体情况而修改CONTROL[0]。 关于操作模式和特权级就跟大家说这么多,后面讲解RTX任务切换时再详述(此章节在后期RTX教程升级版本时再配套)。 |
|
|
|
|
|
9.3 实验例程说明
9.3.1 STM32F103开发板实验 配套例子: V4-404_RTX实验_任务运行在用户模式(非特权级) 实验目的: 1. 学习RTX的任务运行在用户模式的设置方法 实验内容: 1. K1按键按下,串口打印。 2. K2键按下,设置NVIC分组,从而导致系统进入到硬件异常HardFault_Handler。 3. 各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
RTX配置:
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任务运行在非特权级,即用户模式。 |
|
|
|
|
|
程序设计:
u 任务栈大小分配: staticuint64_t AppTaskUserIFStk[512/8]; /* 任务栈 */ staticuint64_t AppTaskLEDStk[256/8]; /* 任务栈 */ staticuint64_t AppTaskMsgProStk[512/8]; /* 任务栈 */ staticuint64_t AppTaskStartStk[512/8]; /* 任务栈 */ 将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。 u 系统栈大小分配: |
|
|
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
RTX任务创建:
复制代码 /* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) { HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF, /* 任务函数 */ 1, /* 任务优先级 */ &AppTaskUserIFStk, /* 任务栈 */ sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */ 2, /* 任务优先级 */ &AppTaskLEDStk, /* 任务栈 */ sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */ HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */ 3, /* 任务优先级 */ &AppTaskMsgProStk, /* 任务栈 */ sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */ } |
|
|
|
|
|
9.3.2 STM32F407开发板实验
配套例子: V5-404_RTX实验_任务运行在用户模式(非特权级) 实验目的: 1. 学习RTX的任务运行在用户模式的设置方法 实验内容: 1. K1按键按下,串口打印。 2. K2键按下,设置NVIC分组,从而导致系统进入到硬件异常HardFault_Handler。 3. 各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
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任务运行在非特权级,即用户模式。 |
|
|
|
|
|
249 浏览 0 评论
512 浏览 0 评论
【智能化+高精度】电焊机为何需要一颗“智慧大脑”?航顺HK32F103A给出答案
555 浏览 0 评论
314 浏览 0 评论
463 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12498 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-13 04:31 , Processed in 1.005505 second(s), Total 103, Slave 85 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191