以下内容转载自安富莱电子: http://forum.armfly.com/forum.php

本章教程为大家讲解 RTX 运行模式的一个重要知识点,特权级模式和非特权级模式,有些资料或者书籍将非特权级模式称为用户模式。

RTX 任务特权级知识点说明
对于初学者只需记住本小节的知识点即可,如果要深入的了解还是需要花些时间去研究下 Cortex-M3
或者 M4 权威指南。
对于使用 Cortex-M3 或者 M4 内核的芯片来说,RTX 操作系统可以让任务运行在特权级或者非特权
级模式,这两种模式是 M3 或者 M4 内核本身所具有的特性。
在特权级模式下,用户可以访问和配置系统控制寄存器,比如 NVIC 中断控制器。然而,如果是在非
特权级模式下,系统控制寄存器是不允许访问的,一旦访问将导致硬件异常。
 Unprivileged:
非特权级,起到保护用户任务的作用,防止用户可以在任意任务中访问和修改系统寄存器,操作不当
会造成系统崩溃。
 Privileged:
特权级,这种模式下用户可以在任意任务中对系统控制寄存器的访问和修改。
有了这点基础的认识之后,还有以下四个疑问有待解决。

非特权级模式下那些寄存器不可访问
对于 Cortex-M3 或者 M4 内核来说,所有的核心外设寄存器都是只能在特权级下才可以访问,那些
又是核心外设寄存器呢,对于 STM32 来说需要大家看编程手册,如下这些核心外设所有的寄存器都需要
在特权级下才可以访问:

关于 MPU,NVIC,SCB 和 STK 四个单元的其它寄存器是否需要在特权级下才可以访问,大家可以按照
我上面说的方法进行查看。
除了核心外设寄存器以外,M3/M4 内核的特殊功能寄存器也是不能在非特权级下访问的,特殊功能
寄存器主要包括以下寄存器:
 程序状态寄存器组(PSRs 或曰 xPSR)

 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及 BASEPRI)
 控制寄存器(CONTROL)
对于参考手册上面所说的 SPI,USART,USB 等所有外设寄存器都是可以在非特权级下进行访问的。

非特权级模式下核心外设寄存器如何初始化
如果用户将 RTX 操作系统的任务设置在非特权级模式下运行,那么核心外设寄存器应该放在哪里进行
初始化呢,主要有以下两种方法:
 使用 SVC(Supervisor Call)软中断,这个在第 19 章有详细讲解。
 在初始化和开启 RTX 多任务前做核心外设的初始化。

Cortex-M3 或者 M4 内核如何切换两种模式
Cortex-M3/M4 中的特殊功能寄存器包括:
 程序状态寄存器组(PSRs 或曰 xPSR)
 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及 BASEPRI)
 控制寄存器(CONTROL)
其中控制寄存器 CONTROL 是用来设置特权级和非特权级切换的,CONTROL 寄存器定义如下:

RTX 任务特权等级的设置方法
RTX 任务特权等级的设置方法比较简单,查看 RTX 系统的配置向导,如下图 9.1 所示:

 Run in privileged mode
此参数就是用来设置特权级和非特权级的,选上单选框表示使能任务工作在特权级模式,取消单选框
表示任务工作在非特权级模式。

RTX 任务特权等级深入认识
本小节的知识点对于初学者来说比较难理解,需要积累了一定的经验后才能更好的理解,不过还是建
议读一读。
深入了解 Cortex-M3/M4 内核的特权等级就不得不说说两种操作模式,Cortex-M3/M4 支持两种操
作模式,两种操作模式分别是:
 Handler mode,中断模式,简单的说就是指的异常服务程序是处在中断模式。
 Thread mode,线程模式,简单的说就是异常服务程序以外的程序都是处在线程模式。

当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面,handler 模式
总是特权级的。在系统复位后,处理器进入线程模式+特权级。
在特权级下的代码可以通过置位 CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,
处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。用户级下的代
码不能再试图修改 CONTROL[0]来回到特权级。它必须通过一个异常 handler,由那个异常 handler 来修
改 CONTROL[0],才能在返回到线程模式后拿到特权级。下图是特权级线程模式和用户级线程模式的切换图: 

户程序代码出问题时,不会让它成为害群之马,因为用户级的代码是禁止写特殊功能寄存器和 NVIC 中断
寄存器的。另外,如果还配有 MPU,保护力度就更大,甚至可以阻止用户代码访问不属于它的内存区域。
为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给应用程序专门配一个堆栈,不让它共享
操作系统内核的堆栈。在这个管理制度下,运行在线程模式的用户代码使用 PSP,而异常服务例程则使用
MSP。这两个堆栈指针的切换是智能全自动的,就在异常服务的始末由硬件处理。
如前所述,特权等级和堆栈指针的选择均由 CONTROL 负责。当 CONTROL[0]=0 时,在异常处理
的始末,只发生了处理器模式的转换,如下图所示。

开发板实验 :

RTX 配置:
RTX 配置向导详情如下:

RTX——第9章 任务运行在特权级或非特权级模式的更多相关文章

  1. CPU Rings, Privilege, and Protection.CPU的运行环, 特权级与保护

    原文标题:CPU Rings, Privilege, and Protection 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的 ...

  2. RTX——第19章 SVC 中断方式调用用户函数(后期补历程)

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式 ...

  3. Linux从头学12:读完这篇【特权级】文章,你就比别人更“精通”操作系统!

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  4. [书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型

    本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解J ...

  5. 第12章 Reference-RIL运行框架

    Reference-RIL完成两部分处理逻辑: 与LibRIL交互完成RIL消息的处理. 与Modem通信模块交互完成AT命令的执行. Reference-RIL的运行机制 主要涉及以下几个方面: R ...

  6. 第 4 章 ROS运行管理

    第 4 章 ROS运行管理 ROS是多进程(节点)的分布式框架,一个完整的ROS系统实现: 可能包含多台主机:每台主机上又有多个工作空间(workspace):每个的工作空间中又包含多个功能包(pac ...

  7. jmp && call && ret 特权级转移 & 进程调度

    ①jmp是不负责任的调度,不保存任何信息,不考虑会回头.跳过去就什么也不管了.②call,保存eip等,以便程序重新跳回.ret是call的逆过程,是回头的过程.这都是cpu固有指令,因此要保存的信息 ...

  8. MapReduce的ReduceTask任务的运行源码级分析

    MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...

  9. 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS

    [0]README text description from orange's implemention of a os . [1]特权级概述 当当前代码段试图访问一个段或者门时,目标段的DPL将会 ...

随机推荐

  1. DIY手机万能红外遥控器

    DIY手机万能红外遥控器 1.手机安装软件:遥控精灵 2.红外二极管两个(旧的遥控器里面可以拆) 3.耳机的插头一个 步骤:首选讲两个二极管的正负相接(即a二极管的正极连接b二极管的负极,a二极管的负 ...

  2. flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事项

    一. fluem中出现,transactionCapacity查询一下,得出一下这些: 最近在做flume的实时日志收集,用flume默认的配置后,发现不是完全实时的,于是看了一下,原来是memery ...

  3. atime、mtime、ctime

    当你同熟练的UNIX用户进行交谈时,你经常会听到他们傲慢地讲出术语“改变时间(change time)”和“修改时间(modification time)”.对于许多人(和许多字典而言),改变和修改是 ...

  4. 使用Nginx限制同一IP的访问频率

    http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html http://nginx.org/en/docs/http/ngx_http ...

  5. 转:【HTTP】常见错误码说明

    一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 ...

  6. Ways to 优化JAVA程序设计和编码,提高JAVA性能

    通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化.一般有两种方案:即优化代码或更改设计方法.我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能 ...

  7. Integer 内部实现

    public static void main(String[] args) { Integer in1 = 128; Integer in2 = 128; System.out.println(in ...

  8. 设置当前Activity的屏幕亮度

    设置当前的Activity的屏幕亮度,而不是设置系统的屏幕亮度,退出当前的Activity后恢复系统的亮度. 直接看代码好了 Java代码 WindowManager.LayoutParams lp  ...

  9. 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库

    采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...

  10. 【转】其他人的BUG

    在软件行业,经常看到有的公司管理让一个人修补另一个人代码里的BUG.有时候有人写了一段代码,扔出来不管了,然后公司管理让其他工程师来修复它.我想告诉你们,这种方法会很失败. 首先,让一个人修复另一个人 ...