Cortex-M4架构

第一章 嵌入式系统概论

1.1 嵌入式系统概念

用于控制、监视或者辅助操作机器和设备的装置,是一种专用计算机系统。

更宽泛的定义:是在产品内部,具有特定功能的计算机系统。

1.2 嵌入式系统组成

硬件

①处理器:CPU

②存储器: Flash、SRAM

③外围电路:复位/时钟/AD/DA

软件

①底层驱动:IIC/SPI

②操作系统:FreeRTOS、linux

③中间件(API):应用程序接口

④应用程序:GUI

系统外设包括:电源模块、GP时钟模块和存储模块、网络接口、USB接口、IO设备接口以及其他外围设备。

网络接口:有线、无线接口。

有线:以太网、RS485、USB

无线:wifi、蓝牙

第二章 微处理器体系结构

2.1 嵌入式微处理体系结构

2.1.1 冯诺依曼结构

指令和数据存储在同一个存储器的不同物理单元。CPU通过地址总线,访问存储器相应地址单元中的内容。内容既可以是指令,也可以是数据,然后通过数据总线,将指令或数据传输给CPU。

2.1.2 哈佛结构

将数据和指令分别存储在不同的物理存储器,并通过两套总线分别传输。CPU首先到指令存储器中读取指令,解码后得到数据地址,再到对应的数据存储器中读取数据。

指令和数据可以同时访问,并且指令和数据可以有不同的带宽。

使用两组独立的总线,分别作为CPU与各存储器之间的专属通信通道,分别存储指令和数据。所以执行效率就高。

Cortex-M4的处理器架构采用哈佛结构,为系统提供个三套总线,独立发起总线传输读写操作。

①:I-Code总线用于取指令

②:D-code总线用于操作数据

③:系统总线用于访问其他系统空间,包括指令、数据访问,CPU及调试模块发起的访问和支持位访问。

2.2 嵌入式微处理器类型

2.2.1 MCU(嵌入式微控制器)

将整个计算机系统集成到一块芯片上,在芯片内部集成了各种必要的功能部件和外设。CPU+内存+外设。

2.2.2 MPU (嵌入式微处理器)

只保留和嵌入式应用紧密相关的功能硬件,删除其他冗余功能部件。是一个单芯片CPU,芯片内部没有存储器和外设接口等部件。只有CPU。

2.2.3 SOC (嵌入式片上系统)

可实现一个完整的软件和硬件系统,在单一芯片中实现软硬件的无缝结合,直接在处理器内部嵌入操作系统的代码模块,集成度高,处理能力强。

2.2.4 DSP (数字信号处理器)

专门用于信号处理的处理器,其系统结构和指令进行了特殊设计。

2.3 Cortex-M4处理器操作模式

2.3.1 线程模式

用于处理正常代码。处于特权级别的线程模式可以通过软件切换为非特权级别的线程模式。反之不行。

当系统复位时从线程模式中开始执行,遇到异常时自动变为特权级处理模式,异常处理程序完成后再回到线程模式。

2.3.2 处理模式

必须在特权级下执行,用于异常处理程序

代码类型特权级用户级
异常服务例程代码处理模式错误用法
主应用程序代码线程模式线程模式

2.4 ARM中的寄存器(可编程模式)

Cortex-M4处理器的可编程模式主要包括核心寄存器、堆栈和异常中断所涉及的寄存器。核心寄存器包括16个寄存器(R0~R15),其中R0~R12为32位通用寄存器,R13是堆栈指针,R14是链接寄存器,R15是程序计数器。

2.3.1 通用寄存器 R0~R12

通用寄存器分为两组:低组寄存器(R0~R7)和高组寄存器(R8~R12)。

低组寄存器,大小32位,能够被所有访问通用寄存器的指令访问,复位后初始值不变。

高组寄存器,大小32位,也能够被所有32位通用寄存器指令访问,但不能被所有16位指令访问,复位后初始值不定。

复位后初始值不变:即使系统重新启动或复位,寄存器中存储的数据仍然保持之前的数值,不会被重置或清零。

R0~R3:用做传入函数参数,传出函数的返回值。在子程序调用之间,可将R0~R3用于任何用途。被调用函数在返回之前不必恢复R0~R3。如果调用函数再次使用R0~R3的内容的话,则必须保留这些内容。当参数多于4时,会将多出的参数压入栈中进行传递(在函数调用过程中也会把R0,R1,R2,R3传递的参数压入栈)。

R4~R11:被用来存放函数的局部变量。如果调用函数使用了这些寄存器,它在返回之前必须回复寄存器的值。

R12:是内部调用暂时寄存器(ip),在过程链接胶合代码中用此角色。

在中断程序中,所有寄存器都必须保护,编译器会自动保护R4~R11

2.3.2 堆栈指针

R13:栈指针(SP),存放的值在退出调用函数时必须与进入调用函数时的值相同。

堆栈指针在物理上存在两个堆栈指针寄存器:主堆栈指针(MSP)和进程堆栈指针(PSP)

主堆栈指针(MSP)

①是默认的堆栈指针,它供给操作系统内核、异常服务例程及所有特权级访问的应用程序代码使用,即用于管理异常处理和中断服务。

②当处理异常或中断时,系统会自动切换到MSP

③在启动时通常初始化为系统的顶部内存地址。

可以用于线程模式和处理模式。

进程堆栈指针(PSP)

①用于处理线程或进程的函数调用和局部变量等;

②在多线程或多任务环境下,每个线程/任务都有自己的PSP

③当切换到线程/任务时,系统会切换到PSP的值。

多数情况下,若应用不需要嵌入式操作系统,则没必要使用PSP。

堆栈功能

SP指针是用来指示系统的栈空间。栈空间一般用于上下文切换处理。

PUSH:入栈

POP:出栈

使用情况

①当正在执行的函数需要使用寄存器进行数据处理时,临时存储数据的初始值。

②向函数或子程序中传递信息。

③存储局部变量。

④在中断等异常产生时保存处理器状态和寄存器数值。

Cortex-M4处理器使用的栈模型

处理器启动后,SP被设置为栈存储空间的最后一个位置,每次使用PUSH操作时,处理器先减小SP的值,然后将数据存储在SP指向的存储器的位置。POP操作,则先将SP指向的存储器位置的数据读出,然后SP的值增加。

2.3.3 链接寄存器(LR)

R14:链接寄存器(LR),当调用一个函数时,返回地址被自动保存到链接寄存器中,在函数返回时有效。

①:调用子程序时用于保存调用返回地址②发生异常时用于保存异常返回地址。

函数或子程序结束时,程序控制可以通过将LR的数值加载到PC中,返回调用程序并继续执行。

2.3.4 程序计数器(PC)

指向当前正在执⾏的指令的地址。是可读可写的寄存器。通过对PC的操作,改变程序直系那个的流程。

读PC时返回当前指令的地址加4:ARM处理器采⽤了指令流⽔线的执⾏⽅式,在执⾏阶段之前,处理器已经从存储器中取出了下⼀条指令,并且PC已经指向了下⼀条指令的地址。因此,当读取PC时,返回的是PC指向的下⼀条指令的地址。(由于ARM处理器采用的是32位指令集,每条指令通常占用4个字节的存储空间,所以返回的地址是当前指令地址加上4。)

写PC:当向程序计数器(PC)写入数据时,实际上是将新的地址值加载到程序计数器中,从而改变了程序流的执行路径。这会导致程序执行跳转到新的地址处,执行新的指令序列。

2.5 特殊寄存器

特殊寄存器分为程序状态寄存器、中断屏蔽寄存器和控制寄存器三大类。

2.4.1 程序状态寄存器

在其内部被分成3个子状态寄存器:应用APSR,中断IPSR,执行EPSR。这三个既可以单独访问,也可以2个或3个一起组合访问。一般我们通过MRS/MSR指令来访问特殊功能寄存器。

①应用状态寄存器(APSR)

是保持当前指令运算结果状态的寄存器。

②中断状态寄存器(IPSR)

主要字段是中断服务程序号,它指示了当前正在执行的中断服务程序的编号。这个编号对应着处理器的异常向量表中相应条目,用于确定中断服务程序的入口地址。

IPSR寄存器的内容在中断服务程序执行之前被自动保存在堆栈中,在中断服务程序执行结束后被自动恢复,以保证中断处理的正确性。

是Cortex-M处理器特有的,用于处理中断的相关状态信息。

③执行状态寄存器(EPSR)

包括中断继续指令为或IF-THEN指令状态位,以及Thumb指令设置位。

2.4.2 中断屏蔽寄存器

2.4.3 控制寄存器

用于定义处理器特权级别和用于选择堆栈指针。

2.6 流水线技术

2.6.1 什么是流水线

一条指令的执行可以分解为多个阶段,各个阶段使用到的硬件不同,这样指令执行就可以重叠,可以多条指令并行处理

2.6.2 三级流水线

包括取值、译码、执行三个阶段。 Cortex-M4采用三级流水线。

这样,⼀条指令需要3个时钟周期来完成,但吞吐率是每个周期1条指令。

周期为1时,取第一个指令;周期为2时,取第二个指令并译码第一条指令;周期为3时,取第三个指令,译码第二条指令并执行第一条指令,依次往下。

注意:流水线技术增加了CPU的吞吐量,但没有减少每条指令的延迟。

吞吐量:单位时间内执行的指令数

延迟:一条指令从进入流水线到流出流水线所花费的时间。

2.6.3 五级流水线

包括取值、译码、执行、缓冲/数据、回写五个阶段。

取指(Fetch):从内存中读取指令

译码(Decode):解析指令并确定执⾏所需的操作

执⾏(Execute):执⾏指令,包括运算、内存访问等

访存(Memory Access):如果指令需要访问内存,则在此阶段执⾏

回写(Write Back):将执⾏结果写回到寄存器中

2.6.4 超流水线

某款处理器内部的流水线超过了通常的5级或6级。

2.7 中断机制

2.7.1 什么是中断

在CPU正常执行过程中,外部发生了随机事件,CPU需要暂时中止正在执行的程序转而去处理所发生的事件。处理完成后,再返回到原来被中止的程序继续执行。

中断和异常

中断:CPU内核外部的片上外设产生的紧急事件。系统停止当前正在运行的程序转而其他服务,可能是程序接收了比自身高优先级的请求,属于正常现象。

异常:CPU内核内部产生的紧急事件。异常通常是微处理器内部发生的,大多是软件引起的,比如非法指令(除零)、地址访问越界等。属于不正常现象。

2.7.2 中断分类

①外部中断:由外部硬件设备为获得CPU的执行而产生的异步事件。

②软件中断:是程序中特殊指令产生的同步事件。

③内部中断:出现一些异常情况下,CPU自发生成的同步事件。

NVIC :总的中断控制器,专门管理中断,属于内核上的外设

2.7.3 中断管理机制

1、中断向量

中断服务程序的入口地址。

中断向量表:存放所有中断向量的存储区。

     STM32的内部闪存地址起始于0x8000000,一般情况下,程序文件就从此地址开始写入。此外STM32其内部通过“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。而这张“中断向量表”的起始地址是0x8000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

(1)STM32复位后,会从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,如图6中标号①所示。

(2)复位中断服务程序执行的最终结果是跳转至C程序的main函数,如图6中标号②所示,而main函数应该是一个死循环,是一个永不返回的函数。

(3)在main函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处,如图6中标号③所示。

(4)根据中断源进入相应的中断服务程序,如图6中标号④所示。

(5)中断服务程序执行完毕后,程序再度返回至main函数中执行,如图6中标号⑤所示。

2、中断优先级

中断优先级通过优先级配置寄存器进行配置,本寄存器宽度为8位,STM32只用到了中断优先级寄存器的的高4位。

Cortex-M4为增强带有中断系统中的优先级控制,NVIC支持优先级分组。将每个中断优先级寄存器项分为两个字段:上部字段和下部字段。其中上部字段定义组优先级,下部字段定义组中的子优先级。

3、中断管理

复位后:所有中断处于禁止状态,且默认优先级为0.在使用任何中断之前,都需要完成以下工作:

(1)设置所需的中断优先级;

(2)使能外设中可以触发中断的中断产生控制;

(3)使能NVIC中的中断;

当触发中断时,对应的ISR会执行相应的中断。编写程序时,相应ISR名称与向量表中的名称一致,这样链接器才能将该ISR入口地址放入向量表的正确位置。

进入中断

(1)中断源发出请求,硬件判断处理器是否允许中断及该中断是否被屏蔽,若允许中断则当前运行的程序被打断;
(2)处理器将各寄存器的内容压入堆栈保存,主要是PC, xPSR, R0-R3, R12, LR寄存器;
(3)根据中断向量号,到中断向量表中找到中断服务程序的入口地址跳转执行。

中断处理

(1)执行中断服务程序;
(2)遵循中断优先级和中断嵌套的执行规则。

退出中断

(1)将保存在堆栈中的现场信息弹出到原来的寄存器中;
(2)返回被原先被中断的程序处继续执行。

目前是这样的,还得再下下功夫修炼内功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JSBridge原理 - 前端H5与客户端Native交互

1. 概述: 在混合应用开发中,一种常见且成熟的技术方案是将原生应用与 WebView 结合,使得复杂的业务逻辑可以通过网页技术实现。实现这种类型的混合应用时,就需要解决H5与Native之间的双向通信。JSBridge 是一种在混合应用中实现 …

【r-tree算法】一篇文章讲透~

目录 一、引言 二、R-tree算法的基本原理 1 数据结构 2 插入操作 3 删除操作 4 查询操作 5 代码事例 三、R-tree算法的性能分析 1 时间复杂度 2 空间复杂度 3 影响因素 四、R-tree算法的变体和改进 1 R*-tree算法 2 X-tree算法 3 QR-tree算法 五、R-tree算法的…

前端| 富文本显示不全的解决方法

背景 前置条件:编辑器wangEditor vue项目 在pc端进行了富文本操作, 将word内容复制到编辑器中, 进行发布, pc端正常, 在手机端展示的时候 显示不全 分析 根据h5端编辑器内容的数据展示, 看到有一些样式造…

【任推邦新悟空网盘拉新】八款地推网推新项目,周期稳定,受众广!

现在地推网推新项目打得火热,尤其是夸克网盘,地推网推新流程其实很简单,简单来说就是就是给项目增加新用户,每邀请一个新用户注册,你就能得到收益,下面小推给大家整理了一份好推的项目,希望能够…

C++:类与对象(一)

hello,各位小伙伴,本篇文章跟大家一起学习《C:类与对象(一)》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 文章目录 面向对象和面向过程的区别1.类的引入2.…

【java面试题-Redis篇-2024】

##java面试题大全 详细面试题-持续更新中-点击跳转 点赞、收藏、加关注 java基础面试题 ##java面试题大全1、什么是 Redis2、Redis 的数据结构类型3、Redis 为什么快4、什么是跳跃表5、什么是 I/O 多路复用6、什么是缓存击穿、缓存穿透、缓存雪崩7、什么是布隆过滤器8、热…

webpack5如何关闭全屏错误

1、找到vue.config.js 2、在上面的devServer里面添加如下: client: {overlay: false, // 禁用全局错误提示},

写出好代码的底层逻辑

写出好代码的底层逻辑 程序员安身立命的手艺就是写代码,可多少人知道如何才能写出好的代码呢?这几年也做过很多次的代码 CR,可好代码的标准在哪里呢?我们在做 CR 的时候,其实只是停留在代码的表面,主要是跟…

Godot插值、贝塞尔曲线和Astar寻路

一、插值 线性插值是采用一次多项式上进行的插值计算&#xff0c;任意给定两个值A和B&#xff0c;那么在A和B之间的任意值可以定义为&#xff1a;P(t) A * (1 - t) B * t&#xff0c;0 < t < 1。 数学中用于线性拟合&#xff0c;游戏应用可以做出跟随效果&#xff08;…

keycloak - 鉴权VUE

目录 一、前言 1、背景 2、实验版本 二、开始干活 1、keycloak配置 a、创建领域(realms) b、创建客户端 c、创建用户、角色 2、vue代码 a、依赖 b、main.js 三、未解决的问题 目录 一、前言 1、背景 2、实验版本 二、开始干活 1、keycloak配置 a、创建领域(r…

VMware Esxi安装群辉系统

群晖的网络存储产品具有强大的操作系统&#xff0c;提供了各种应用程序和服务&#xff0c;包括文件共享、数据备份、多媒体管理、远程访问等。用户可以通过简单直观的界面来管理他们的存储设备&#xff0c;并且可以根据自己的需求扩展设备的功能。总的来说&#xff0c;群晖的产…

概念科普|大模型它到底是什么?

一、引言 ChatGPT、Open AI、大模型、提示词工程、Token、幻觉等人工智能的黑话&#xff0c;在2023年这个普通却又神奇的年份里&#xff0c;反复的冲刷着大家的认知。让一部分人彻底躺平的同时&#xff0c;让另外一部分人开始焦虑起来&#xff0c;生怕在这个人工智能的奇迹之年…

鸡乐盒网页版

前端时间鸡乐盒比较火&#xff0c;当时跟着做了一款鸡乐盒&#xff0c;同时拥有聊天以及音乐播放器功能 链接&#xff1a; 鸡乐盒https://www.jaron.top/app/xiana/pages/musicBox/musicBox

C语言---浮点数在内存中的存储

前面跟大家介绍了整数在内存中的存储&#xff0c;这次再向大家介绍下浮点数在内存中的存储。 我们常见的浮点数有3.14&#xff0c;1E10 等等&#xff0c;浮点数家族包括float&#xff0c;double&#xff0c;long double类型。 浮点数的表示范围在头文件 float.h 定义。 1.浮…

代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)

文章目录 491. 非递减子序列解题思路源码 46. 全排列解题思路源码 47. 全排列 II解题思路源码 总结 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 …

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能&#xff08;Generative AI&#xff09;正以前所未有的速度改变着各行各业的运作模式。其中&#xff0c;游戏产业作为科技应用的前沿阵地&#xff0c;正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业&#xff0c;以及这一变革背后的深远影响。…

博士推荐 | 拥有超过10年的数据解决方案经验,数据驱动的决策者

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

评估精益管理培训的有效性需要收集哪些数据?

近年来&#xff0c;企业纷纷寻求通过精益管理培训来提升效率和竞争力。然而&#xff0c;精益管理培训是否真正有效&#xff0c;能否为企业带来实实在在的改变&#xff0c;这是许多管理者和决策者关心的问题。为了回答这个问题&#xff0c;我们需要收集一系列关键数据来评估精益…

基于 OpenHarmony PrecentPositionLayout 开发指南

1. PrecentPositionLayout 功能介绍 1.1. 组件介绍&#xff1a; 鸿蒙 SDK 提供了不同布局规范的组件容器&#xff0c;例如以单一方向排列的 DirectionalLayout、以相对位置排列的DependentLayout、以确切位置排列的 PositionLayout 等。 但是 PositionLayout 中组件的位置是…

基于单片机收音机调幅系统设计仿真源码

**单片机设计介绍&#xff0c;基于单片机收音机调幅系统设计仿真源码 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机收音机调幅系统设计的仿真源码&#xff0c;主要实现了通过单片机控制调幅收音机的核心功能。以下是…