ARM V7
文章平均质量分 92
斯安
这个作者很懒,什么都没留下…
展开
-
深入理解Cortex-M7 SVC和PendSV
将PendSV优先级还有一点考虑,如果其优先级比较高,有可能出现以下情况:PendSV会抢断其他中断的执行,随后进行上下文切换,而其他中断以尾链机制继续执行,并请求进行上下文切换,这就导致多次重复的上下文切换,而在此过程中,无辜的任务只能眼巴巴的等着,啥都做不了,而内核在忙着来回切换上下文,浪费了很多CPU时间。此外,SVC指令要求SVC异常的优先级高于异常可执行优先级,否则将触发错误异常。因此,在NMl或HardFault等优先级高于SVC的异常处理程序中,不能使用SVC。原创 2024-04-14 20:25:27 · 1083 阅读 · 0 评论 -
Armv7-M Interworking机制
由于历史原因(从ARM7TDMI开始), ARM处理器一直支持两种形式上相对独立的指令集, 它们分别是: 32位的指令集,对应处理器状态:ARM状态,在32位存储器上效率较高,能够同时访问32位的数据和地址空间,具有更好的代码效率和执行速度; 16位的指令集,对应处理器状态:Thumb状态,指令长度短,代码密度高(),在16位存储器(数据总线为16位的存储系统)上效率较高,内存占用小,有利于,所以常用于嵌入式系统中对和的场景。原创 2024-04-10 23:35:07 · 1116 阅读 · 0 评论 -
Cortex-M7 私有外设(peripherals)总览
由Cortex-M7的内存映射模型可知,0xE000_0000~0xE00F_FFFF地址空间为私有外设总线 (Private peripheral bus,PPB)的内存区域,其具体的地址映射如表1所示。表1 PPB寄存器内存映射其中,注释后缀的相关含义如下:a,表示该外设是可选的;b ,软件可以通过读MPU Type Register(位于地址0xE000ED90),以确认是否配有MPU;此外,PPB的内存区域为不可执行的。原创 2024-04-07 02:04:43 · 475 阅读 · 0 评论 -
Cortex-M7 内存映射模型
软件程序直观地定义了一个程序执行流(program flow),其规则时基于一定的逻辑顺序。而当软件程序经编译器翻译成可执行的机器码并在CPU上执行时,内存系统通常不会严格按照软件程序定义的时序来进行内存访问,这也就是前文描述的乱序执行。CPU采用乱序执行的原因主要有以下几点:① 在不改变软件程序定义的指令序列的预期行为的前提下,CPU可能会对一些访存操作重新排序;② CPU拥有多个总线接口(bus interface);③ 不同的内存区域或设备具有不同的等待状态;原创 2024-04-06 20:55:34 · 1222 阅读 · 1 评论 -
Cortex-M7 异常处理与返回
当CM3开始响应一个中断时,会在它小小的体内奔涌起三股暗流: 入栈: 把8个寄存器的值压入栈; 取向量:从向量表中找出对应的服务程序入口地址; 选择堆栈指针MSP/PSP,更新堆栈指针SP,更新LR,更新程序计数器PC;---引自《Cortex-M3权威指南》为了提高异常响应的实时性,Cortex-M7采用了如下机制:①即便CPU当前正在进行异常处理,当新到异常的优先级较高时,即可进行抢占,转而处理该优先级较高的异常,即支持中断嵌套处理;②。原创 2024-04-05 19:28:41 · 1224 阅读 · 1 评论 -
Cortex-M7 中断优先级
除了Reset(优先级-3),NMI(优先级-2) 和 HardFault(优先级-1)三个异常的有限制为固定值外,对于其他优先级可配置的异常,Cortex-M7最大支持0~255共计256个优先级。具体支持的优先级范围,决定于芯片厂商的实现,通常都会进行裁剪。总的来说,Cortex-M7对于异常的优先级有着如下规定:① 优先级值越小,表示的优先级越高;② 除了Reset,NMI和HardFault外,其他异常的优先级均是可配置的;原创 2024-04-05 00:41:29 · 1344 阅读 · 1 评论 -
Cortex-M7中断向量表的重定向
系统上电后,PC会指向复位向量,即向量表中的Reset_Handler,而系统就是通过Vector Table Offset Register (VTOR)的值加上4字节来找到复位向量的入口的。因为地址 0 处应该存储引导代码,所以它通常映射到 Flash 或者是 ROM 器件,并且它们的值不得在运行时改变。然而,为了支持动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但更多是在 RAM 区。在 RAM 区就可以修改向量的入口地址了。原创 2024-03-30 17:11:15 · 1358 阅读 · 1 评论 -
Cortex-M7 中断开关指令总结
PRIMASK, FAULTMASK 以及 BASEPRI是三个可以用于异常使能或除能的特殊功能寄存器,需要通过通过 MRS/MSR 指令来访问。亦或者,可以使用CPS指令来设置PRIMASK和PRIMASK这两个寄存器。原创 2024-03-28 00:15:42 · 1163 阅读 · 1 评论 -
Cortex-M7 异常(中断)基础总结
Cortex-M7集成了嵌套向量中断控制器(Nested Vectored Interrupt Controller),最大支持256个中断优先级,其 “向量” 指示着中断服务函数(interrupt service routines, ISRs)响应的方式不再通过软件编程来实现,即由硬件堆叠的寄存器组和相应可挂起的多指令加载和存储指令(可被中断打断,给中断让路),来实现从中断响应到ISR入口的快速选择这一过程。原创 2024-03-26 23:27:49 · 1172 阅读 · 0 评论 -
Cortex-M7 处理器模式与程序执行权限级别
图1 Cortex-M7模块总览如图1所示, Cortex-M7属于ARM V7架构,采用了6级流水线的哈弗结构和Thumb-2指令集(代码密集度code density更高,有利于减少程序代码所占用的内存空间)。其中,Cortex-M7处理器的核心外设包括以下几个部分:①,包含一个不可屏蔽中断(non-maskable interrupt, NMI),最大支持256个中断优先级,其。原创 2024-03-24 20:43:24 · 1334 阅读 · 1 评论 -
ARM-v7 程序计数器PC的相关指令与应用
如图1所示,R14是连接寄存器(Link Register),在汇编指令中通常也写为LR,用于存储函数调用和异常等的返回信息,复位时,默认值为0xFFFFFFFF;图1 Core registerR15是程序计数器(PC,Program Counter),,其bit[0的值为必须1,并会加载到EPSR(Execution Program Status Register)的T字段(Thumb state bit),表示处于Thumb状态。原创 2024-03-09 23:42:45 · 920 阅读 · 0 评论 -
ARM-v7 数据大小端转换实现
如果当前的CPU是ARM的Cortex-M架构微控制器,建议使用标准的CMSIS接口来进行大小端转换,不仅效率高,软件移植性也会更好。原创 2024-03-03 23:48:58 · 1403 阅读 · 0 评论 -
从ARM V7汇编层分析 if else和swith 语句效率
回到最开始的问题上,if else 和 swith两种语句从C语言角度来看都是顺序执行的,其效率最终还是看汇编层的优化程度。对于两分支语句,if else语句效率肯定是没问题的;对满足swith使用条件的多分支语句,且输入的条件变量是连续紧凑的正数值时,应优先使用swith语句。原创 2024-02-25 01:16:25 · 1220 阅读 · 1 评论 -
freeRTOS(Arm M7)中断压栈分析
以Arm M7核为例,当CPU响应中断异常时,第一件事就是保存现场,进行压栈。如果当前使用的是任务堆栈,则压入PSP;如果使用的是系统主堆栈,则压入MSP。根据权威指南的说法,CPU在响应异常序列时,首先会进行压栈、取向量、更新寄存器(选择堆栈指针MSP/PSP,更新堆栈指针SP,LR及PC)这三部曲。取向量指的是指令总线从向量表中找到对应的异常向量,并在对应的服务程序的入口处进行取值,而更新寄存器部分则可以解释我的疑惑。原创 2024-02-08 01:15:36 · 1100 阅读 · 0 评论