【Cortex-M3权威指南】学习笔记1 - 概览与基础

news2024/11/17 3:55:08

介绍


三种主流 Cortex 款式

款式 A:设计用于高性能的“开放应用平台”
款式 R:用于高端的嵌入式系统,尤其是那些带有实时要求的
款式 M:用于深度嵌入的,单片机风格的系统中


指令集发展

ARM 处理器一直支持两种形式上相对独立的指令集,它
们分别是

  • 32 位的 ARM 指令集。对应处理器状态:ARM 状态
  • 16 位的 Thumb 指令集。对应处理器状态:Thumb 状态

Thumb 指令集在功能上是 ARM 指令集的一个子集,但它能带来
更高的代码密度


Cortex-M3 概览


寄存器组

Cortex-M3 处理器拥有 R0-R15 的寄存器组。其中 R13 作为堆栈指针 SP

SP 有两个,但在同
一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器

在这里插入图片描述


寄存器分析

R0-R12:通用寄存器

Banked R13: 两个堆栈指针,含有主堆栈指针(MSP)以及进程堆栈指针(PSP);
前者操作系统内核,后者处理用户应用代码

R14:连接寄存器,当呼叫一个子程序时,由 R14 存储返回地址


特殊功能寄存器

在这里插入图片描述


操作模式与特权

在这里插入图片描述

两种操作模式

  1. 处理者模式(handler mode)
  2. 线程模式(thread mode)

两种特权操作

  1. 特权级
  2. 用户级

用户切换到特权级需要经过此步骤:执行系统调用指令 SVC,触发 SVC 异常,通过异常服务例程接管后修改 CONTROL 寄存器,才可以进入特权级


内建嵌套向量中断控制器

嵌套向量中断控制器 NVIC(Nested Vectored Interrupt Controller)

其提供的功能:

  1. 涵盖了所有外部中断和绝大多数异常,可赋予异常优先级,若硬件发现高优先级进来就会立刻抢占当前异常位
  2. 开始响应一个中断后,CM3 会自动定位一张向量表,并且根据中断号从表中找出 ISR 的入口地址,然后跳转过去执行
  3. 软件可以在运行时期更改中断的优先级
  4. 既可以屏蔽优先级低于某个阈值的中断/异常,也可以全体封杀

存储器映射

在这里插入图片描述

system level 系统寄存区,这里的设备均使用固定地址


总线接口

Cortex-M3 拥有以下三大总线接口:

  1. 指令存储区总线:I-Code 总线(用于取指)和 D-Code 总线(用于查表)
  2. 系统总线:用于访问内存和外设
  3. 私有外设总线:负责一部分私有外设的访问,主要就是访问调试组件

存储器保护单元(MPU)

该部件为可选的,开启它以对特权访问以及用户访问进行不同限制

MPU 最常见的就是保护特权级代码不被其他低级用户随意篡改,通过吧内存区设置为只读来进行保护


指令集

Cortex-M3 只使用 Thumb-2 指令集,它允许同时处理 32 位指令和 16 位指令

再过去的 cortex 架构,在 32 位和 16 位状态下,分别处于 ARM 状态和 Thumb 状态,需要执行状态切换,存在开销


中断及异常

ARMv7-M 开创了一个全新的异常模型,他支持 11 种系统异常,240 个外部终端输入,并取消了 FIQ 概念

CM3 的所有中断机制都由 NVIC 实现


Cortex-M3 基础


寄存器组

通用目的寄存器 R0-R7
R0-R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后的初始值是不可预料的

通用目的寄存器 R8-R12
R8-R12 也被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们,32 位的
thumb-2 指令则不受限制


堆栈指针 R13

主堆栈指针(MSP):由 OS 内核、异常服务例程等特权访问程序使用

进程堆栈指针(PSP):常规应用程序代码

cortex-m3 给予了两根指令 PUSH 和 POP 处理堆栈指针的操作


链接寄存器 R14(LR)

LR 寄存器用于存储函数调用的返回地址。

当一个函数被调用时,当前函数的返回地址会被保存到 LR 寄存器中,以便在函数执行完毕后返回到正确的位置。


程序计数器 R15(PC)

R15 寄存器 在 ARM 架构中用于存储下一条将要执行的指令的地址。它指示了程序执行的当前位置,并在指令执行期间自动递增,以便跳转到下一条指令的地址。


特殊功能寄存器组

程序状态寄存器 PSR

PSR 包括三个子状态寄存器

  • 应用程序 PSR(APSR)
  • 中断号 PSR(IPSR)
  • 执行 PSR(EPSR)

使用 MSR 和 MRS 指令


屏蔽寄存器组
在这里插入图片描述


控制寄存器 CONTROL

在这里插入图片描述

控制寄存器有两种作用:定义特权级别、选择当前使用的堆栈指针

Cortex-M3 的 handler 模式中,CONTROL[1]总是 0。在线程模式中则可以为 0 或 1

这两个 CONTROL 都必须位于特权级下才可以进行写操作


操作模式

线程模式+用户级下,无法访问系统控制空间(SCS)

越权访问一律产生 fault,单少部分情况下会被忽略掉而不产生 fault


特权级下置位 CONTROL[0] 进入用户级,再通过异常返回先前的用户级
如下图所示,特权级和用户级之间的转换

在这里插入图片描述


栈内存操作

我们所谓的堆栈操作实际上就是对内存的读写,访问地址通过 SP 给予

一般的,PUSH 和 POP 必须要成对使用,对应寄存器先后顺序必须一致
使用这两条指令时对应 SP 指针也会自增和自减

PUSH 指令等效于与使用 R13 作为地址指针的 STMDB 指令,而 POP 指令则等效于使用
R13 作为地址指针的 LDMIA 指令


Cortex-M3 堆栈实现

Cortex-M3 使用的是“向下生长的满栈”模型,即栈空间从高地址向低地址生长的一种栈结构。

Cortex-M3 具有两个堆栈,分别是:主堆栈和进程堆栈
双堆栈的作用是可以在主堆栈处理异常的错误而不会影响到进程堆栈中的应用程序执行


复位序列

在 CM3 中,在 0 地址处提供 MSP 的初始值,然后紧跟着就是向量表(向量表在以后还可以被移至其它位置——译注)。
向量表中的数值是 32 位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令。


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

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

相关文章

10个最好的云GPU服务

随着深度学习、人工智能和机器学习等新技术的出现,云 GPU 的需求量很大。 GPU(图形处理单元)是专用处理器,用于处理计算机图形和游戏等活动所需的大量数据集和复杂计算。不过,它们现在对人工智能(A.I.&…

我们在深圳聊了聊娱乐产品怎么“玩”!

伴随着移动互联网的普及,国内娱乐社交产品呈现出多元化发展趋势。 根据相关调研显示,一般普通用户通常会同时选择至少 3 款同类娱乐社交应用作为日常休闲、社交工具。可以说,各类垂直赛道聚集了大量新老“玩家”。 在如此激烈的竞争环境下&am…

Openlayers实战:启动、取消事件的监测

在Openlayers的实际项目中,我们会用到各种地图事件,比如click,dblclick,change,loadstart … 监测的时候往往用on(‘事件名称’,回调函数)来操作,但是取消这些事件的监控怎么做呢,请参考源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师…

Java百度提前批面试题

今天分享百度提前批的 Java 后端开发面经,整体上考察的点挺多的,主要重点考察了网络i/o、网络协议、linux系统、mysql,Java 问的不多,可能是百度的后端开发的语言不是主要以 Java 为主,所以重点看面试者的计算机基础是…

删除重复记录但保留其中一行数据的sql写法

欢迎关注微信公众号:互联网全栈架构 数据库表中存在重复记录的场景并不罕见,导致这种情况的原因可能是进行了数据迁移,或者程序代码有bug(比如并发情况没有处理好),或者在测试库中手动插入了重复数据&#…

问道管理:证券代码是什么?有什么用?

交流炒股经历时,有些股民一时忘了股票发行公司的全称,会直接报一串数字来代替,这串数字的内容是证券代码,那么,证券代码是什么?它又起什么作用?关于这些,为大家准备了以下参考内容。…

Python-主线程控制子线程-4

需求:在Python-主线程控制子线程-3的基础上,新增使用UDP接收指令功能,代替从键盘输入指令 # 修改后的程序,主线程可以获取子线程的结果 import threading import time import queue import tracebackfrom loguru import logger i…

齐聚众力,中国移动以“百川”定乾坤

近日,由工业和信息化部、宁夏回族自治区人民政府主办的2023中国算力大会在宁夏银川举办。中国移动党组书记、董事长杨杰参加开幕式,并在大会主论坛作题为《算网筑基锻引擎 数实融合创未来》的主旨演讲。在演讲中,杨杰表示:未来&am…

牛客OJ 把字符串转换成整数

⭐️ 题目描述 🌟 O链接 https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId13&&tqId11202&rp6&ru/activity/oj&qru/ta/coding-interviews/question-ranking 思路: 首先需要检查第一位是否有符号位&#x…

【EA-ISET协会】Elsevier|2区智慧农业类SCIEI, 进展顺,3个月左右录用~

一、期刊简介 2区智慧农业类SCI&EI 【期刊简介】IF: 3.0-4.0, JCR2区, 中科院4区; 【检索情况】SCI&EI双检,正刊; 【终审周期】走期刊部系统,3个月左右录用; 二、征稿范围 大数据和遥感技术在智慧农业中…

Blender文件云端GPU渲染

本文介绍如何在 GPU云平台vast.ai 上渲染Blender动画的技术指南,假设你已使用 vast.ai 并知道如何启动实例,这里的重要步骤是为实例选择正确的映像。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 使用 nvidia/cuda:11.4.1-cudnn8-devel-ubuntu2…

C++信息学奥赛1138:将字符串中的小写字母转换成大写字母

#include<bits/stdc.h> using namespace std; int main() {string arr;// 输入一行字符串getline(cin, arr);for(int i0;i<arr.length();i){if(arr[i]>97 and arr[i]<122){char aarr[i]-32; // 将小写字母转换为大写字母cout<<a; // 输出转换后的字符}els…

AI教学赋能计划(大模型特辑)2023秋季学期启动申请!

AI教学赋能计划是由百度飞桨发起&#xff0c;面向高校提供产教融合人才培养方案&#xff0c;一站式助力高校复合型人才培养&#xff0c;截至目前已经培养5200名AI专业师资&#xff0c;助力484所高校开设人工智能与AIX特色课程。 2023年随着文心一言等预训练大语言模型发展&…

中国平台软件市场研究报告:OceanBase为金融行业国产分布式数据库销售额第一

近日&#xff0c;《2022-2023年度中国平台软件市场研究报告》&#xff08;以下简称“报告”&#xff09;发布&#xff0c;报告对包括数据库、操作系统等在内的平台软件市场发展进行了分析。报告指出&#xff0c;在对平台软件需求增长最快的金融行业&#xff0c;OceanBase已占据…

一文看懂 ISP pipeline

文章目录 概述什么是ISPISP实现方案 ISP PipelineISP输入行缓冲数据对齐 难理解的关键算法WDR图像压缩色调映射 Tone MappingRAW域处理镜头阴影校正 LSC降噪&#xff1a;空域滤波器 Spatial FilterBayer Demosaic 概述 什么是ISP 主流的CMOS和CCD sensor基本都是输出Bayer Mo…

金佰利Kimberly-Clark直连EDI解决方案

Kimberly-Clark 金佰利是全球健康卫生护理领域的领导者。 成立于1872年的金佰利公司是全球健康卫生护理领域的行业领导者。个人健康护理用品、家庭生活用纸和商用消费产品是金佰利公司三大核心业务。金佰利在全球35个国家设有生产设施&#xff0c;产品销往超过175个国家和地区…

真机和开发者工具如何模拟虚拟定位

二、如何模拟虚拟定位 微信开发者如何模拟虚拟定位 1、打开微信开发者工具 2、打开调试器 3、切换到Sensor 4、勾选Enable 5、填写经纬度数值&#xff0c;在线解析经纬度链接&#xff1a;【经纬度查询】在线地图经度纬度查询|经纬度地名坐标转换 6、重新编译&#xff0c…

8月23日上课内容 第二章 MySQL数据库管理

本章结构&#xff1a; 数据库基本操作 查看数据库的结构 查看数据库列表信息 show database 查看数据库中的表信息 use 数据库名#切换到数据库中 show tables show tables in mysgl 显示数据表的结构(字段) describe user; Field:字段名称type: 数据类型Nul1 :是否允许为空Key…

c++多种情况不同概率下,在范围内使用随机数

多种情况不同概率下&#xff0c;在范围内使用随机数。比如有5种情况&#xff0c;每种情况的概率不相同&#xff0c;有的概率为25&#xff0c;有的为15. 使用random库的函数来生成随机数。 std::random_device rd; //产生随机数种子 std::mt19937 gen(rd()); //生成伪随机数&a…

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…