以下内容转载自安富莱电子: 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. python之函数用法xrange()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法xrange() #xrange() #说明:返回一个生成器 #xrange做循环的性 ...

  2. Linux系统中用stat命令查看文件的三个时间属性

    在Linux中,没有文件创建时间的概念.只有文件的访问时间.修改时间.状态改变时间.也就是说无法知道文件的创建时间. [root@rhel7 yum.repos.d]# stat cdrom.repo ...

  3. pip安装注意事项

    pip源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 h ...

  4. Java中的资源文件加载方式

    文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Jav ...

  5. Python 的 Numpy 库

    Numpy: # NumPy库介绍 # NumPy的安装 #  NumPy系统是Python的一种开源的数值计算扩展 #  可用来存储和处理大型矩阵. #  因为不是Python的内嵌模块,因此 ...

  6. android 添加桌面快捷方式

    .在桌面创建快捷方式方法: 方法一:通过长按某一个应用程序的图标在桌面上创建启动该应用程序的快捷方式. 这个方法安装完程序都用户都能实现. 方法二:在应用程序中构建一个Intent,然后以Broadc ...

  7. IIS7的应用程序池详细解析

    在 IIS 7 中,应用程序池有两种运行模式:集成模式和经典模式.应用程序池模式会影响服务器处理托管代码请求的方式 在IIS 7中,添加一个应用程序或者单独的网站,默认会自动新建一个对应的“应用程序池 ...

  8. C#中?和:?和??总结

    ?代表可空类型修饰符    引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.为了使值类型也可为空,就可以使用可空类型?:三元表达式    int a=b>c?b:c 如果b大 ...

  9. Remote 'attachhome' failed on nodes:XXX

    RAC安装过程中,在安装GI的时候报如下错误: 解决方法: 根据提示执行以下脚本 $ /u01/app//grid/oui/bin/runInstaller -attachHome -noCluste ...

  10. Python中的迭代和可迭代对象

    什么是迭代(iteration)呢? 给定一个list或者tuple,通过for循环来遍历这个list或者tuple.这种遍历就是迭代(iteration).只要是可迭代的对象都可以进行迭代.怎么判断 ...