“野火FreeRTOS教程”第7章补充知识点-异常流程

2023-05-16

一、知识点

1. Cortex-M3/4在复位后CONTROL寄存器初始值为0,也就是说MCU会处于线程模式、具有特权访问权限且使用主栈指针(MSP)

2. 当进入异常时CM3会自动入栈,如下图所示:

 3. 当异常返回时CM3会自动出栈,如下图所示:

 4. CM3进入异常或者中断服务函数(ISR)时,R14(LR)会被自动更新为EXC_RETURN,且EXC_RETURN具有以下位域。

当发生程序调用后,LR为子程序的返回地址。(程序调用的实质是将PC赋值给LR,执行完子程序后,又将LR赋值给PC。这些由硬件自动完成)

二、教程分析

1. 文中指出任务栈在初始化完成后,如下状态,可以看到此时栈顶指针指在最低地址处,当然这时PSP还没有被赋值为栈顶指针。

图、二-1

 2. 接下来调用"SVC 0",产生SVC异常服务,教程中SVC异常服务函数如下。

按照出现顺序,这里用到知识点2图8.7、知识点4、知识点3图8.10(#1出栈时)。进入SVC异常服务函数前,CPU会自动将R0,…,xPSR(8个32位寄存器)存储到MSP指向空间,R4-R11不会自动入栈。当然在SVC异常服务函数中,我们是去启动第一个任务,因此主要考虑出栈操作,如下。

  • 上图(2)-(4)是获取任务栈顶指针,(5)LDMIA是指先加载指针指向内容至CPU寄存器中,然后增加指针(加载一个内容增加一个指针,!表示指针变量会更新),(6)把当前的栈指针赋值给PSP,(9)给EXC_RETURN或上0xd,表示“返回线程模式且返回后使用进程栈(PSP)”。
  • 当使用"bx r14"后会触发异常返回机制,CPU会使用PSP来完成自动出栈,即将R0,…,xPSR存储到PSP指向空间,CPU也是使用LDMIA完成出栈操作的,因而此时PSP指向任务栈的位置如下。
  • 此后CPU会取走R15(PC),程序自然跳转到任务1循环体中执行。

3.  任务1入栈

在任务1循环体的最后触发了PendSVC异常服务这里用到知识点2图8.8,知识点3图8.10(#1压栈时和出栈时)。教程中PendSVC异常服务函数如下。

图、二-3
  •  进入PendSVC异常服务函数前,CPU会自动将R0,…,xPSR存储到PSP指向空间,CPU是使用STMDB完成入栈操作的,R4-R11不会自动入栈,此时PSP还是指向第一个任务的栈空间,如下图。STMDB是指先减小指针,然后存储CPU寄存器值至指针指向空间中(减小一个指针存储一个内容,!表示指针变量会更新)

  • 剩下的R4-R11也需要使用STMDB手动入栈,见图二-3中的(4)、(7)。
  • 然后将R0的值赋值给第一个任务的栈顶指针,见图二-3中的(5)、(6)、(8),以恢复任务栈顶指针为初始状态,如图二-1。(其实可以不用重新赋值任务的栈顶指针,因为没有变过,但考虑到要逻辑严谨,还是重新赋值比较好)。此时的PSP、R0和第一个任务的栈顶指针状态如下。

  •  到这里任务1的入栈已经完成。

 4 任务2出栈

  •  接着看图二-3,(9)其实就是保护EXC_RETURN的bit2不会变成0,因为一旦发生程序调用,R14即为子程序的返回地址,原本的EXC_RETURN就会被打乱,导致异常返回时,CPU的SP不一定就是PSP,所以必须加以保护。
  • R3也要加以保护,因为它保存了一个指针变量(pxCurrentTCB)的地址,指向要(或正在)执行的任务控制块。
  • (12)将pxCurrentTCB指向第二个任务控制块。
  • 进入异常或中断后,CPU自动使用主栈,因此(9)和(14)使用的SP就是MSP。
  • (15)-(19)与二-2(SVC异常服务)是一样的。
  • 至于为什么最后没有给EXC_RETURN或上0xd,其实EXC_RETURN_bit2没改变过,当然你要或上0xd也可以。

5. 总结

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“野火FreeRTOS教程”第7章补充知识点-异常流程 的相关文章

  • linux基本服务之sshd

    这段时间在学习linux常用服务 xff0c 这里将学习内容以及自己的实验心得记录下来 在自己忘记的时候也好复习 实验环境 xff1a centos 6 7 64bit 1 简介 SSHD服务 介绍 xff1a SSH协议 xff1a 安全
  • Git+VSCode基本使用

    前言 由于工作需要 xff0c 最近简单学习了git xff0c 巧合发现了VSCODE编辑器正好集成了git命令 xff0c 使得本地代码管理变得更加容易 因为最后是在linux下交叉编译 xff0c 但是我更习惯windows下写代码
  • 掌握音频开发基础知识

    文章目录 基本概念几种CODEC介绍实时调度相关缓冲区两种类型编写要点遇到的问题 解码能力的自适应混音模块回声消除的延时控制能量统计双声道支持ALSA设备 代码相关 基本概念 采样率 Hz 每秒去取样本的个数 xff0c eg 48000H
  • CSDN日报20170616 ——《从裁缝到码农》

    程序人生 从裁缝到码农 作者 xff1a 修电脑的裁缝酱 我伸出颤抖的手去抓 xff0c 发现曾经遥不可及的梦想 xff0c 经过坚持和努力之后 xff0c 真的可以抓住 我把它抓在手心 xff0c 紧紧地 点击阅读全文 机器学习 一文了解
  • Java中char类型详解

    1 基本定义 char类型的值可以表示为十六进制值 xff0c 其范围从 u0000 到 uffff xff0c 由两个字节构成 char类型原本用于表示单个字符 xff0c 但是现在情况有所变化 xff0c 有些Unicode字符需要一个
  • Git命令行简单使用小结

    最近复习了一下git 总结了一下命令行的基本使用 0 基本理论 a 基本概念 Working Directory 就是平时存放项目代码的地方 Stage Index 用于临时存放改动 事实上他只是一个文件 保存即将提交的文件列表信息 Rep
  • 无外接环境下,单笔记本直连浪潮服务器BMC灌装系统

    1 环境因素 xff1a 单服务器无网络无显示器等外接 xff0c 需要对浪潮防火墙灌装系统 xff1b 2 所需材料 xff1a 1 浪潮服务器 2 可接网线笔记本电脑 xff08 Windows平台 xff09 3 网线一根 3 连接拓
  • python抽样方法详解及实现

    抽样方法概览 随机抽样 总体个数较少 每个抽样单元被抽中的概率相同 xff0c 并且可以重现 随机抽样常常用于总体个数较少时 xff0c 它的主要特征是从总体中逐个抽取 1 抽签法 2 随机数法 xff1a 随机数表 随机数骰子或计算机产生
  • ROS 1.0 学习笔记(6)CMakeLists.txt 使用说明

    ROS1中每个PKG的配置都是在CMakeList txt中 xff0c 本文从官方 WiKi 资料中翻译而来 1 概览 文件CMakeLists txt是CMake编译系统的配置文件 xff0c 用于配置需要编译软件包 任何兼容CMake
  • LQR控制算法推导以及简单分析

    首先 xff0c 这篇文章是看了几个大神的博客后 xff0c 自己抄录以及整理的内容 xff0c 其中有些自己的想法 xff0c 但是原理部分基本都是学习大神们的 xff0c 在此先说明一下 1 全状态反馈控制系统 在介绍LQR之前 xff
  • C++ Primer(第五版)|练习题答案与解析(第三章:字符串、向量和数组)

    C 43 43 Primer 第五版 练习题答案与解析 第三章 字符串 向量和数组 本博客主要记录C 43 43 Primer 第五版 中的练习题答案与解析 参考 C 43 43 Primer C 43 43 Primer 练习题3 2 编
  • ROS学习(五)导航、路径规划、SLAM

    主要涉及到3个基本包 用于让机器人在制定框架内移动到目标位置的move base包 用于从激光扫描仪 深度摄像机来绘制地图的gmapping包 用于在现有的地图中定位的amcl包 先阅读 http wiki ros org navigati
  • 微服务架构模型和进程间通信

    微服务架构 微服务的扩展模型X轴扩展在多个相同实例之间实现请求的负载均衡Y轴扩展根据功能将应用程序拆分为服务Z轴扩展根据请求的属性路由请求微服务架构与SOA的异同微服务架构的好处微服务架构的弊端 微服务进程间通信基于同步远程过程调用模式的通
  • 关于搭建guacamole-server.1.4.0简单步骤,及问题记录

    问题1 xff1a 在guacamole server 1 4 0目录下 xff0c 执行 configure 发现记录中出现以下警告 xff0c 并且VNC没有成功加载 xff08 libvncserver devel已经导入yum的情况
  • 【获奖公布】征文 | 你会为 AI 转型么?

    AI xff08 Artificial Intelligence xff09 xff0c 即人工智能 人工智能领域的研究包括机器人 语音识别 图像识别 自然语言处理和专家系统等 人工智能从诞生以来 xff0c 理论和技术日益成熟 xff0c
  • spring security filter

    一 spring security过滤器默认配置 WebSecurityConfigurerAdapter init WebSecurityConfigurerAdapter getHttp new HttpSecurity new Fil
  • 金属氢化物Fluent传热仿真论文复现(UDF加载能量源项)

    关于金属氢化物的传质传热 xff0c 论文有相应的公式 xff0c 主要是通过六个方程 xff1a 能量守恒 动量守恒 动力学方程 热力学方程和理想气态方程 相应的公式解释在这里不作过多的解释 xff0c 以后有时间 xff0c 我会专门写
  • ue4_AI_BT

    Rotate to face BB entry 大家在编写行为树的时候 xff0c 经常会遇到需求就是要把操作目标转向某人 xff0c 面对某人 xff0c UE4的行为树中 xff0c 为我们提供了节点Rotate to face BB
  • vscode在远程服务器提交git的时候无需每次都要输入账号密码的配置

    要避免在每次 git 操作时都需要输入账号和密码 xff0c 可以使用 SSH 鉴权 xff0c 具体步骤如下 xff1a 生成 SSH key在本地计算机上使用命令 ssh keygen t rsa b 4096 生成 SSH key 这
  • TLAB和逃逸分析

    逃逸分析 xff1a 对象创建在栈中 xff0c 不一定都是在堆中 xff0c 适用于无并发 xff0c jvm默认开启 TLAB xff1a 多线程并发中堆空间也有线程私有空间 xff08 除了栈外 xff09 xff0c 堆中的一小块内

随机推荐