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)返回被原先被中断的程序处继续执行。
目前是这样的,还得再下下功夫修炼内功
相关文章:
Cortex-M4架构
第一章 嵌入式系统概论 1.1 嵌入式系统概念 用于控制、监视或者辅助操作机器和设备的装置,是一种专用计算机系统。 更宽泛的定义:是在产品内部,具有特定功能的计算机系统。 1.2 嵌入式系统组成 硬件 ①处理器:CPU ②存储器…...
对称排序(蓝桥杯)
文章目录 对称排序问题描述模拟 对称排序 问题描述 小蓝是一名软件工程师,他正在研究一种基于交换的排序算法,以提高排序的效率。 给定一个长度为 N 的数组 A,小蓝希望通过交换对称元素的方式对该数组进行排序。 具体来说,小蓝…...
React - 你使用过高阶组件吗
难度级别:初级及以上 提问概率:55% 高阶组件并不能单纯的说它是一个函数,或是一个组件,在React中,函数也可以做为一种组件。而高阶组件就是将一个组件做为入参,被传入一个函数或者组件中,经过一定的加工处理,最终再返回一个组件的组合…...
【C语言】结构体、枚举、联合(自定义类型)
文章目录 前言一、结构体1.结构体的声明2.结构体的自引用3.结构体变量的定义和初始化4.结构体成员的访问5.结构体内存对齐(重点)6.#pragma修改默认对齐数7.结构体传参 二、位段1.位段的声明2.位段的内存分配3.位段的跨平台问题 三、枚举四、联合 &#x…...
用vue.js写案例——ToDoList待办事项 (步骤和全码解析)
目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项(全)代码 一.准备工作 在开发“ToDoList”案例之前,需要先完成一些准备工作&a…...
提高大型语言模型 (LLM) 性能的四种数据清理技术
原文地址:four-data-cleaning-techniques-to-improve-large-language-model-llm-performance 2024 年 4 月 2 日 检索增强生成(RAG)过程因其增强对大语言模型(LLM)的理解、为它们提供上下文并帮助防止幻觉的潜力而受…...
Rust 练手小项目:猜数游戏
好久没写 Rust 了,参考《Rust 程序设计语言》写了一下猜数游戏。差不多 40 行,感觉写起来真舒服。 use rand::Rng; use std::{cmp::Ordering, io};fn main() {let secret_number rand::thread_rng().gen_range(0..100);println!("[*] Guess the n…...
蓝桥杯物联网竞赛_STM32L071_16_EEPROM
仍然是没有考过的知识点 朴素的讲就是板子中一块不会因为断电重启而导致数值初始化的一片地址 要注意的是有时候容易把板子什么写错导致板子什么地址写坏了导致程序无法烧录,这个时候记得一直按flash键烧录,烧录时会报错,点击确定࿰…...
复习知识点整理
零碎语法 1.导入某个文件夹的index文件,index可以省略(这里导入的是router和store文件下的index.js文件) 2.路由懒加载 this 1.在vue文件中使用router\store对象时 this:普通函数的this指向vue实例对象(在没有明确指向的时候…...
7款公司电脑监控软件
7款公司电脑监控软件 研究证明,人们在家办公的效率比在办公室办公的效率低一半,其中原因是缺少监督,即便在公司办公,还存在员工偷闲的时刻,比如聊天、浏览无关网站、看剧、炒股等,企业想提高员工的工作效率…...
服务器 安装1Panel服务器运维管理面板
服务器 安装1Panel服务器运维管理面板 SSH链接服务器安装1Panel 出现此提示时输入目标路径,须以“/”开头,默认:/opt,本例:/www。 出现此提示时输入目标端口,须未被使用的端口,默认࿱…...
最大花之能量(蓝桥杯)
文章目录 最大花之能量问题描述动态规划 最大花之能量 问题描述 在一个神奇的王国里,有一个美丽的花园,里面生长着各种奇妙的花朵。这些花朵都有一个特殊的能力,它们能够释放出一种叫做「花之能量」的神秘力量。每朵花的花之能量都不同&…...
探索算力(云计算、人工智能、边缘计算等):数字时代的引擎
引言 在数字时代,算力是一种至关重要的资源,它是推动科技创新、驱动经济发展的关键引擎之一。简而言之,算力即计算能力,是计算机系统在单位时间内完成的计算任务数量或计算复杂度的度量。随着科技的不断发展和应用范围的不断扩大…...
数据可视化-ECharts Html项目实战(10)
在之前的文章中,我们学习了如何在ECharts中编写雷达图,实现特殊效果的插入运用,函数的插入,以及多图表雷达图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错&…...
甲方安全建设之研发安全-SCA
前言 大多数企业或多或少的会去采购第三方软件,或者研发同学在开发代码时,可能会去使用一些好用的软件包或者依赖包,但是如果这些包中存在恶意代码,又或者在安装包时不小心打错了字母安装了错误的软件包,则可能出现供…...
[html]网页结构以及常见标签用法
哎,我服了,明明之前学了html的,但时间一长我就忘记了,本来flask学到视图了,但涉及到了html我觉得还是需要重新回顾一下,,,,,, web开发技术栈一共有3门语言。分别是: HTML:译作超文本标记语言&am…...
【C语言】if语句选择题
前言 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 题目八: 前言 关于if语句相关的选择题 题目一: 关于if语句说法正确是:( ) A .if语…...
ZLMediaKit ubantu 下编译
1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu)系统下安装依赖的方法: #除了…...
什么是stable diffusion
机器学习中的稳定扩散 在机器学习中,特别是在深度学习中,稳定扩散可能指的是通过特定的算法,例如深度学习模型,来稳定地生成数据或样本的过程。例如,一些生成模型能够稳定地从高斯分布中采样,以生成高质量的…...
C++ list链表模拟实现
目录 前言: 模拟实现: 迭代器的实现: list类功能函数实现: 初始化成空函数(empty_init): 构造函数: 拷贝构造函数: 尾插(push_back): 插入…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...




