当前位置: 首页 > article >正文

嵌入式八股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指针了
      在这里插入图片描述

      在这里插入图片描述

    • 跳转执行中断服务程序

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

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

相关文章:

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…...

MyBatis 如何解析 XML 配置文件和 SQL 映射文件

MyBatis 使用 SAX(Simple API for XML)解析器来解析 XML 文件,SAX 是一种基于事件驱动的 XML 解析方式,具有高效、低内存消耗的优点。 MyBatis 主要解析两种类型的 XML 文件: 核心配置文件 (mybatis-config.xml): 定…...

使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法

使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法 现在PRD文档要如何写更高效、更清晰、更完整? 还是按以前的思路写PRD,就还是以前的样子。 现在AI这么强大,产品经理如何使用DeepSeek写PRD文档,产品经…...

【VUE2】第五期——VueCli创建项目、Vuex多组件共享数据、json-server——模拟服务端api

黑马程序员视频地址:091-vuex的基本认知_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p91 目录 1 VueCli 自定义创建项目 2 Eslint代码规范 2.1 规…...

rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64

在我在Linux中安装离线CAN工具时,出现了一个问题, rootwanghuo:~# rpm -ivh can-uilts-v2019.00.0-alt1.aarch64.rpm error: Failed dependencies:rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64 意思是尝试安装 can-uilts-v20…...

CNN 稠密任务经典结构

FCN UNet FPN FCNUNETFPNpadding无(逐渐变小) 有(左右对称)上采样 双线性双线性 最近邻跳跃链接 相加 Cropcat 1x1卷积相加 三个网络差不多,UNet名字最直观,后续流传…...

算法刷题整理合集(二)

本篇博客旨在记录自已的算法刷题练习成长,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是算法小白,水平有限,如果文章中有什么错误或遗漏之处,望各位可以在评论区指正出来&#xf…...

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…...

Houdini学习笔记

1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体...

如何在Futter开发中做性能优化?

目录 1. 避免不必要的Widget重建 问题:频繁调用setState()导致整个Widget树重建。 优化策略: 2. 高效处理长列表 问题:ListView一次性加载所有子项导致内存暴涨。 优化策略: 3. 图片加载优化 问题:加载高分辨率…...

仿Ant Design Vue风格自定义浏览器滚动条样式

仿Ant Design Vue风格自定义浏览器滚动条样式 问题原因 浏览器默认的滚动条样式很丑,无法满足需求,需要自定义滚动条样式,参考ant-design-vue的样式 css修改滚动相关属性可查阅官方文档 选择器介绍 ::webkit-scrollbar:滚动条…...

Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台

1. 前言 1.1 什么是Apache Ignite Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。 1.2 为什么选择Apache Ignite 高性能:Ignite利用内…...

OpenCV中文路径图片读写终极指南(Python实现)

文章目录 OpenCV中文路径图片读写终极指南(Python实现)一、问题深度解析1.1 现象观察1.2 底层原因 二、中文路径读取方案2.1 终极解决方案(推荐)2.2 快速修复 三、中文路径保存方案3.1 通用保存函数3.2 使用示例 四、技术原理详解…...

单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明

单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤: 编写测试用例,覆盖代码的各个分支和边界条件。使用测试框架(如JUnit、NUnit)执行测试。检查测试结果,确保代码按预期运行。修复发现的缺陷并重新测…...

《CircleCI:CircleCI:解锁软件开发持续集成(CI)和持续部署(CD)高效密码》:此文为AI自动生成

《CircleCI:CircleCI:解锁软件开发持续集成(CI)和持续部署(CD)高效密码》:此文为AI自动生成 一、CircleCI 初印象 在当今软件开发的快节奏赛道上,持续集成(CI&#xff…...

网络安全反渗透 网络安全攻防渗透

网络渗透防范主要从两个方面来进行防范,一方面是从思想意识上进行防范,另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面,纵观容易出现网络安全事故或者事件的公司和个人,在这些…...

《GitHub网路访问不稳定:解决办法》:此文为AI自动生成

《GitHub网路访问不稳定:解决办法》:此文为AI自动生成 GitHub 网路访问不稳定初现 在当今数字化时代,软件开发行业蓬勃发展,GitHub 作为全球最大的代码托管平台,已然成为无数开发者不可或缺的 “宝库”。它不仅汇聚了…...

G-Star 公益行 | 温暖相约 3.30 上海「开源×AI 赋能公益」Meetup

你是否曾想过,在这个数字化浪潮席卷的时代,公益组织如何突破技术瓶颈?当 AI 成为热门话题,它能为公益事业带来怎样的温度?开源的力量,如何让每一份善意都拥有无限可能? G-Star 公益行&#xff…...

docker pull 镜像问题

问题一:pull镜像报错:time out 分析:源问题,网络不稳定,更换加速源,地址:/etc/docker/daemon.json 解决:更换地址,如下,然后敲:docker daemon-reload &&…...

【Go】字符串相关知识点

字符串(String)是 Go 语言中最常用的数据类型之一,广泛应用于文本处理、数据解析、网络通信等场景。Go 语言的字符串是不可变的 UTF-8 字节序列,在性能和安全性方面与其他编程语言有所不同。 源代码 package main//字符类型 byt…...

STAR Decomposition 一种针对极端事件的信号分解方法 论文精读加复现

STAR 分解🚀 在时序预测任务中,为了情绪化信号的各种成分,例如趋势信息季节信息等往往都需要对信号进行分解。目前熟知的分解方式有很多种,经验模态分解 EMD 变分模态分解 VMD ,还有 集合经验模态分解 EEMD&#xff0c…...

基于SpringBoot + Vue 的房屋租赁系统

基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色:用户、管理员、房东 管理员:个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…...

Excel中国式排名,3种方法!

大家好,我是小鱼。 什么是中国式排名呢? 举个例子比如说公司一共有10名员工进行成绩考核,如果9个人考核成绩都是90分,你是89分,按照国际惯用的排名法则:9 个人考核成绩并列第一,你第10名&…...

Flutter:跑马灯公告栏

组件 import dart:async; import package:flutter/material.dart; import package:ducafe_ui_core/ducafe_ui_core.dart;class MarqueeNotice extends StatefulWidget {/// 公告数据列表&#xff0c;每条公告包含title和descfinal List<Map<String, String>> notic…...

Jmeter下载及环境配置

Jmeter下载及环境配置 java环境变量配置配置jdk环境变量检查是否配置成功JMeter下载 java环境变量配置 访问地址&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/ 注意&#xff1a;需要自己注册账号 下载完成&#xff0c;解压后的目录为&#xff1a; …...

【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统

在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…...

OpenCV特征提取与深度学习CNN特征提取差异

一、特征生成方式 ‌OpenCV传统方法‌ ‌手工设计特征‌&#xff1a;依赖人工设计的算法&#xff08;如SIFT、FAST、BRIEF&#xff09;提取图像中的角点、边缘等低层次特征&#xff0c;需手动调整参数以适应不同场景‌。‌数学驱动‌&#xff1a;基于梯度变化、几何变换等数学规…...

微信小程序threejs三维开发

微信小程序threejs开发 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…...

关于在vue3中使用keep-live+component标签组合,实现对指定某些组件进行缓存或不缓存的问题

今天收到一个需求&#xff0c;在vue3写的动态组件条件下&#xff0c;要对指定的几个vue组件进行缓存。 我们用到了keep-livecomponent标签进行动态的渲染 可以通过exclude(排除)和include(包含)来进行指定缓存 <el-tabs v-model"activeName" type"card"…...

[Java实战]性能优化qps从1万到3万

一、问题背景 ​ 事情起因是项目上springboot项目提供的tps达不到客户要求,除了增加服务器提高tps之外,作为团队的技术总监,架构师,技术扛把子,本着我不入地狱谁入地狱的原则,决心从代码上优化,让客户享受到飞一般的感觉。虽然大多数编程工作在写下第一行代码时已经完成…...