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

介绍


三种主流 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.hqwc.cn/news/80665.html

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

相关文章

【Unity自制手册】游戏基础API大全

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

Eduma主题 - 线上教育WordPress主题/网站

Eduma主题 – 线上教育WordPress主题是为教育网站、LMS、培训中心、课程中心、学院、大学、学校、幼儿园而制作的。基于我们使用以前的主题eLearning WP构建WordPress LMS的经验,Education WP是下一代,也是围绕WordPress最好的教育主题之一,它…

清华源的链接太多老崩溃,我把它拷过来,需要什么点什么

建议按照字母分个类可能会好点 把链接这里改为 哈哈就不卡了,浏览器也不崩溃了还能很快就链接成功 Links for pandas这是链接 这个小技巧教给大家请给我点个赞

详细手机代理IP配置

嗨,亲爱的朋友们!作为一家代理产品供应商,我知道有很多小伙伴在使用手机进行网络爬虫和数据采集时,常常会遇到一些IP限制的问题。别担心!今天我要给大家分享一下手机IP代理的设置方法,让你们轻松应对这些限…

【LUBAN】【功能验证】至简投屏功能之Android有线连接方式测试

1、概述 至简投屏功能之Android有线连接方式支持至简自带应用至加的投屏功能和谷歌官方的Android auto功能。 支持的功能范围列举如下: 1、屏幕投屏(支持自动旋转屏)2、音视频播放(抖音、百度地图等)3、车机反控手机…

Spring 为什么使用三级缓存解决循环依赖

文章目录 前言1. 什么是循环依赖1.1 互相依赖1.2 递归依赖 2. Sping中循环依赖有什么问题?3. 什么是三级缓存4. Spring 可以解决哪些情况的循环依赖? 二级缓存作用——普通循环依赖实操环节1. 实例化类A对象2. 实例化类B对象3. B对象完成创建4.继续创建A…

C 实现Window/DOS 键盘监听事件

今天是重新复习C语言实现的第一天,今天想编写C 对Windwos/Dos 键盘事件的学习。但是我在安装Visual Studio 2022 没有安装MFC 框架,今天记录下VS追加 MFC框架。 Visual Studio 2022 追加MFC 1、打开vs,点击创建新项目,右侧滑动框…

大数据风控介绍

众所周知,金融是数据化程度最高的行业之一,也是人工智能和大数据技术重要的应用领域。随着大数据收集、存储、分析和模型技术日益成熟,大数据技术逐渐应用到金融风控的各个环节。个推作为专业的数据智能服务商,拥有海量数据资源&a…

Unity - 制作package 插件包

1.将制作的插件包代码放置一个根目录下 2.在跟目录下创建package.json文件 //package.json {"name": "com.unity.customlibrary", //插件包名:com.组织名.包名"displayName": "CustomLibrary", //显示的插件名"v…

华为OD机试 - 过滤组合字符串 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

【Linux操作系统】Linux中的信号回收:管理子进程的关键步骤

在Linux中,我们可以通过捕获SIGCHLD信号来实现对子进程的回收。当一个子进程终止时,内核会向其父进程发送SIGCHLD信号。父进程可以通过注册信号处理函数,并在处理函数中调用wait()或waitpid()函数来回收已终止的子进程。 文章目录 借助信号捕…

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉…