嵌入式八股ARM篇

前言

  ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习

1.寄存器

  1. R0 - R3 R4 - R11 寄存器
    R0 - R3一般用作函数传参
    R4 - R11用来保存程序运算的中间结果或函数的局部变量
    在函数调用过程中
  • 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入栈中, 这也是为什么我们的PendSV只用压入R4 - R11
  1. R12 没啥用

  2. R13寄存器
    R13寄存器又叫做堆栈指针寄存器SP 总是指向当前正在运行的函数的栈帧

    • MSP 和 PSP
      对于 cortex-M3架构 存在两个SP 指针 一个 MSP 一个 PSP
      在这里插入图片描述

      • PSP只能被用作线程模式 MSP可以在 线程/handler模式运行
        具体的等后面模式做详解
    • FP 与 SP
        前面将函数调用过程的时候讲到了 栈帧是靠这俩寄存器FP和SP维护的 可是为啥没见FP寄存器呢? FP似乎通常是R11寄存器 但不绝对

  3. R14寄存器—LR寄存器

    • 用来保存保存上一级函数调用者的返回地址,这样当我们函数调用返回的时候就知道从哪里接着运行了
    • 当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行
    • 当中断发生的时候,LR寄存器的值会被设定为"EXC_RETURN"
    • BL function
      当我们通过这样的指令跳转的时候 就会更新我们的LR寄存器的值了
    • BX LR
      这个我们在RTOS的PendSV函数的最后会看到 BX LR 指令 这是因为PendSV结束调用时还处于特权模式(LR = EXC_RETURN),而我们实际上是想返回线程模式的 所以用BX LR 而不是 MOV PC, LR
  4. R15寄存器—PC寄存器
    每取一次指令,PC的值会自动 + 8

  5. 各种状态寄存器
    不必关心

  6. ARM的三级流水线
      一条指令的执行分为三步:取址, 译码 和 执行 每一条都需要一个时钟周期 所以一条指令需要三个时钟周期。 那如果我们只有第一条指令执行完才执行第二条 就意味着取址单元会有两个时钟周期啥也不干
    所以引入流水线就好了
    在这里插入图片描述

    • 为什么是PC = PC + 8 呢
      这么理解
      “正在取值的指令” = “正在执行的指令” + 8 *
      就对了,反正这也是给你看的不是给机器看的…
      可以看到对于第一条指令add r0,r1,#5真正执行的时候,我们取的是第三条指令cmp r2,#3的值
      在这里插入图片描述
  7. 顺序执行与乱序执行
    因为我们的指令很有可能下个指令依赖上个指令的结果,那此时三级流水线就出问题了
    比如上个指令的结果还没放回内存了 这边已经从内存开始取数据了
    此时就得加入空指令 暂停流水线了–效率低下
    所以就会有乱序执行–有专门逻辑电路进行分析做这个事

2.特权与模式

  1. cortex-M3的模式
    两种模式 – handler模式与线程模式
    两种特权 – 用户级和特权级
  2. ARM的七种模式
    • 用户模式(User):这是唯一的非特权模式,
    • 快速中断模式(FIQ, Fast Interrupt Request):
    • 标准中断模式(IRQ, Interrupt Request)
    • 管理模式(SVC, Supervisor)。
    • 中止模式(Abort)
    • 未定义模式(Undefined)
    • 系统模式(System)
      在这里插入图片描述

  用户级和特权级是针对访问权限:特权级访问寄存器不受限,用户级不行
  模式是针对运行状态: 触发异常了就得进入 handler模式 普通状态就是线程模式
  所以不能在用户级去操作handler模式,但是线程模式下特权级还是用户级都无所谓啦

  1. 复位后的状态
    复位后,处理器默认进入线程模式(MSP),特权极访问
    可以通过修改CTRL寄存器回到线程模式(PSP指针)
    但是线程模式可就不能修改CTRL寄存器了—那想回去怎么办?触发异常再异常中修该
    在这里插入图片描述

3.存储区映射

对于32位的处理器 地址空间是4个G 这4G对于ARM来说是这么定义的
在这里插入图片描述

异常

  对于所有的异常都进行了编号 前15种是系统异常 后面的都是外部中断
在这里插入图片描述

  我们可以看到对于后面几个异常是可编程的,这个在RTOS的任务切换很重要,我们一般会把PendSV这个异常设定为最低优先级(0xffffffff)—为了在对所有中断都响应后在切换任务

  • 抢占优先级和响应优先级
    高抢占优先级可以打断低抢占优先级
    但是同抢占优先级下,高响应优先级打断不了低的响应优先级

  • 中断向量表—处理中断的关键
    在这里插入图片描述

    这个是在starup.s中定义的 一般我们也不会有重新定义新的中断的需求

  • 对中断的响应
    正常来说需要我们在中断服务程序清除对应的标志位
    在这里插入图片描述

    如果不清除会咋样—那就反复进入该中断处理程序操作
    在这里插入图片描述

    如果极短时间多次请求–一般只会响应一次,因为中断就悬起了一次
    在这里插入图片描述

    假如在中断服务函数执行过程中,又触发了一次相同的中断–就会再执行一次

  • NVIC中断控制器

    • 中断的悬起与解悬
    • 中断的优先级控制
    • 对中断响应的暂时屏蔽

中断

  • msp与psp指针
    MSP:复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
    PSP:由用户的应用程序代码使用。
    两个堆栈指针,同一时刻只能用一个。
    作用:提升程序健壮性。一定程度上保证应用的数据(栈)空间不会溢出到操作系统数据(栈)空间
  • 中断发生后做了什么
    当一个中断发生的时候 我们的内核到底做了什么
    • 寄存器入栈–保存现场
      在这里插入图片描述

    • 地址总线从向量表查询中断向量

    • 更新寄存器–此时就进入handler模式了同时使用的也是MSP指针了
      在这里插入图片描述

      在这里插入图片描述

    • 跳转执行中断服务程序

    • 中断返回–包括把之前保存的寄存器的值自动弹出来(恢复现场)

  • 中断的递归调用
    不用我等操心 但是需要我们注意的是就是给栈提供一个合适的大小
  • 中断与异常的区别
    中断——外部事件引起,正在运行的程序所不期望的–异步的
    异常——内部执行指令引起–同步的
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 实现的采集诸葛灵签

Python 实现的采集诸葛灵签 项目介绍 这是一个基于 Python 开发的诸葛灵签数据采集和展示项目。通过爬虫技术获取诸葛神签的签文和解签内容,并提供数据存储和查询功能。 项目结构 zhuge/├── zhuge_scraper.py # 爬虫主程序├── zhuge_pages/ # 数据存储目录…

【C++项目实战】校园公告搜索引擎:完整实现与优化指南

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、项目概述 📖1.项目背景 📖2.主要功能 📖3.界面展…

代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus适用场景和工作方式

在 Swift 开发中,在 Swift 开发中,代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus 主要用于 组件之间的通信,但它们的适用场景和工作方式有…

设计模式--单例模式(Singleton)【Go】

引言 在设计模式中,单例模式(Singleton Pattern)是一种非常常见且实用的模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要全局唯一对象的场景中非常有用,比如配置管理、日志记录、数…

MySQL数据库复制

文章目录 MySQL数据库复制一、复制的原理二、复制的搭建1.编辑配置文件2.在主库上创建复制的用户3.获取主库的备份4.基于从库的恢复5.建立主从复制6.开启主从复制7.查看主从复制状态 MySQL数据库复制 MySQL作为非常流行的数据库,支撑它如此出彩的因素主要有两个&am…

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制? 1.1 为什么要会略? 对于开发者而言,明智地选择忽略某些文件类型,能带来三大核心优势: 仓库纯净性:避免二进制文件、编译产物等污染代码库 安全防护:防止敏感信息&…

基于yolov8+streamlit实现目标检测系统带漂亮登录界面

【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统,结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势,为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能,还拥有一个漂亮且…

分享vue好用的pdf 工具实测

vue3-pdf-app: 带大纲,带分页,带缩放,带全屏,带打印,带下载,带旋转 下载依赖: yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类: 创建文件 pdfConfig.ts /…

基于微信小程序开发的宠物领养平台——代码解读

项目前端 一、项目的技术架构概况 一句话概括:该项目是基于微信小程序开发的宠物领养平台,采用原生小程序框架进行用户界面的构建,使用 wx.request 进行 API 请求,并通过 getApp() 和本地存储来管理全局状态和用户信息。 一&am…

最完美的WPF无边框设计!

常规的无边框方法设计 常规的WPF无边框设计方法都是通过AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome样式来实现,但是这样会有问题就是,窗体最大化的时候将底部任务栏给挡住了,另外最大化的时候不能拖动窗体。参考这个大佬的设计@ 若…

【区块链】btc

学习视频源链接: https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根据肖老师的视频进行的笔记记录 一、 cryptographic hash function 1.1. collision resistance抗碰撞性 : collision 指的是hash碰撞 抗碰撞性 (Collision Resistance) 是密码…

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言:为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时…

QT:文件读取

问题: 在文件读取,判断md5值时,遇到py文件读取转String后,再转byte,md5前后不一致问题。 解决方法: python文件读取要使用QTextStream,避免\t 、\r、\n的换行符跨平台问题(window…

32单片机——LED

LED原理图如图所示: 代码 DS0和DS1每过500ms一次交替闪烁,实现类似跑马灯的效果 GPIO输出配置步骤 (1)使能对应GPIO时钟 STM32在使用任何外设之前,我们都要先使能其时钟(下同)。本实验用到…

贪心算法和遗传算法优劣对比——c#

项目背景:某钢管厂的钢筋原材料为 55米,工作需要需切割 40 米(1段)、11 米(15 段)等 4 种规格 ,现用贪心算法和遗传算法两种算法进行计算: 第一局:{ 40, 1 }, { 11, 15…

【Java篇】一法不变,万象归一:方法封装与递归的思想之道

文章目录 Java 方法的使用:从基础到递归的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定义1.3 方法调用的执行过程1.4 实参和形参的关系1.5 没有返回值的方法 二、方法重载2.1 为什么需要方法重载2.2 方法重载的概念2.2.4 C 和 Java 的比较&…

深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素虽看似普通&#xff0c;却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木&#xff0c;能够将各种 HTML 元素巧妙地组合起来&#xff0c;无论是构建页面布局&#xff0c;还是对局部内容进行样式调整&#xff…

《大语言模型》学习笔记(一)

一、什么是大语言模型 大语言模型是指在海量无标注文本数据上进行预训练得到的大型预训练语言模型&#xff0c;例如GPT-3&#xff0c;PaLM和LLaMA。大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一种基于深度学习的自然语言处理模型&#xff0c;能…

电力行业中分布式能源管理(Distributed Energy Management System, DEMS)的实现

以下是电力行业中分布式能源管理(Distributed Energy Management System, DEMS)的实现方案,涵盖系统架构、关键技术、核心功能及实施路径,结合典型场景与代码示例: 一、系统架构设计 采用云-边-端三层架构,实现分布式能源的高效协同管理: 1. 终端层(感知层) 设备组…

实验5 逻辑回归

实验5 逻辑回归 【实验目的】掌握逻辑回归算法 【实验内容】处理样本&#xff0c;使用逻辑回归算法进行参数估计&#xff0c;并画出分类边界 【实验要求】写明实验步骤&#xff0c;必要时补充截图 1、参照“2.1梯度下降法实现线性逻辑回归.ipynb”和“2.2 sklearn实现线性逻辑…