上海住建部网站郑州网站优化网络建设有限公司

当前位置: 首页 > news >正文

上海住建部网站,郑州网站优化网络建设有限公司,网站手机端的优势,手机wap网站开发教程0 参考资料 Cortex M3权威指南(中文).pdf ARM Cortex-A(armV7)编程手册V4.0.pdf1 Cortex-A7和Cortex-M7处理器架构取中断向量全流程分析 1.1 什么是中断向量#xff1f; 中断向量就是中断服务函数入口地址#xff0c;例如我们发生了EXTI0中断#xff0c;就需要执行EXT0中…0 参考资料 Cortex M3权威指南(中文).pdf ARM Cortex-A(armV7)编程手册V4.0.pdf1 Cortex-A7和Cortex-M7处理器架构取中断向量全流程分析 1.1 什么是中断向量 中断向量就是中断服务函数入口地址例如我们发生了EXTI0中断就需要执行EXT0中断对应的中断服务函数EXTI0_IRQHandler这个中断服务函数入口地址就是中断向量。 1.2 什么是中断向量表 通常来说CPU会有各种各样不同的中断它们对应的中断服务函数也不一样。CPU为了在中断发生时更快地跳转到对应的中断服务函数响应中断就人为将中断向量按顺序存储在内存中一般是Flash这样就形成了一张映射表。CPU只要知道这片内存的首地址、中断ID、每个中断向量占据的内存空间就能很快找到中断源对应的中断服务函数响应中断。以Cortex-M3为例它的中断向量表部分定义如下
1.3 什么是中断向量表偏移地址什么是中断向量表基址 我们已经知道中断向量表的作用CPU为了能够访问向量表需要知道向量表的地址这个就是中断向量表基址起始地址。 为了实现这一目的有些CPU如Cortex-M3架构处理器提供了一个中断向量表偏移寄存器通过中断向量表相对于存储器首地址的偏移量计算出中断向量表基址。还有些CPU如Cortex-A7架构处理器提供了中断向量表基址寄存器可以直接修改中断向量表基址。 以Cortex-M3为例它的中断向量表偏移量寄存器定义如下 注意 Cortex-M3向量表的起始地址是有要求的必须先求出系统中共有多少个向量再把这个数字向上增大到是 2 的整次幂而起始地址必须对齐到后者的边界上。1.4 Cortex-M7架构处理器是怎么取中断向量的 本例以基于Cortex-M7的stm32H743为例分析Cortex-M7架构处理器是如何取中断向量的。 1.4.1 设置中断向量表偏移地址 在stm32H743复位后首先会执行Reset_Handler函数此时中断均是失能状态如果是由BOOT引导的APP则需要在进入APP前将所有中断失能避免在中断向量表偏移地址未被正确设置前进入中断导致不可预知的错误。Reset_Handler函数内容如下 在SystemInit函数的最后会设置VTOR寄存器以修改中断向量表偏移地址
1.4.2 CPU如何查找中断向量 以stm32官方例程来说中断向量表被放到了镜像文件的起始位置。查看其启动文件startup_stm32h743zitx.s如下 和stm32H743参考手册定义的中断向量表一一对应 注 _estack是栈底地址由于stm32H743栈向下生长可以认为这是栈区最高地址。 查看.map文件找到Reset_Handler、NMI_Handler函数的入口地址 打开镜像文件内容如下 可以看到Cortex-M7直接将中断向量放入中断向量表中CPU根据中断ID及中断向量表偏移地址在中断向量表中对应的地址取出中断向量即可。至于为什么镜像中的中断向量是实际的中断向量1主要是为了避免产生fault异常 说明Cortex-M3处理器仅支持Thumb-2文中所说的Thumb就是指Thumb-2模式企图转入ARM模式将会产生fault异常。 注关于Thumb、ARM、Thumb-2指令集的说明如下 Cortex-M7也仅支持Thumb-2指令集可以看到stm32CubeIDE工程无法切换到其它指令集
1.4 Cortex-A7架构处理器是怎么取中断向量的 本例以基于Cortex-A7的stm32MP135为例分析Cortex-A7架构处理器是如何取中断向量的。 1.4.1 设置中断向量表基地址首地址 在stm32MP135复位后首先会执行Reset_Handler函数此时中断均是失能状态如果是由BOOT引导的APP则需要在进入APP前将所有中断失能避免在中断向量基地址未被正确设置前进入中断导致不可预知的错误。Reset_Handler函数内容如下 上图红框标记处开始设置中断向量表基地址。 也就是将Vectors函数的地址作为中断向量表基地址Vectors函数内容如下 和Cortex-A7的中断向量一一对应Reset_Handler对应于Not used .align 7表示Vectors函数地址按照2^7字节对齐也就是按照128字节对齐。有关VBAR寄存器的描述如下
1.4.2 CPU如何查找中断向量 和Cortex-M7架构处理器不同的是Cortex-A7架构处理器并不会直接将中断向量放到向量表中它存放的通常是一条修改PC的指令或一条跳转指令B。官方说明如下 这是因为Cortex-A7发生中断时不会直接从中断向量表取出中断向量而是会将PC值修改到中断向量表里中断对应的地址。而这个地址存放的是一条指令用来跳转到对应的中断服务函数。以stm32MP135为例其中断向量表如下 对应的.list文件如下 可以看到stmMP135采用的就是官方推荐的第二种写法。例如发生IRQ中断PC会设置为0x2ffe0118执行pc, [pc, #28]语句执行完之后PC值为0x2ffe53bf。之所以是实际中断向量1是为了告诉CPU接下来切换到ThumbThumb-2状态需要执行ThumbThumb-2指令 为了实现在ThumbThumb-2状态下处理异常/中断本例在Reset_Handler函数中已经设置了SCTLR寄存器的T位值为1 相关寄存器说明如下 说明当异常/中断发生时CPSR寄存器的T位会被设置为SCTLR的TE位的值。也就是说进入异常/中断CPU会切换到ThumbThumb-2状态。 注Cortex-A7所指的Thumb指令集就是Thumb-2指令集因此本文写成了ThumbThumb-2。 Cortex-A7什么时候在ARM状态什么时候在ThumbThumb-2状态 ARM状态只能执行ARM指令Thumb状态只能执行Thumb指令。当前执行的指令是ARM指令就处于ARM状态当前执行的指令是Thumb指令就处于Thumb状态。可以通过CPSR寄存器的T位查看CPU处于什么状态T0时处于ARM状态T1时处于Thumb状态。至于在什么时候切换状态编译器会帮我们生成能实现正确的代码。 以本文使用的stm32MP135为例内部bootloader引导程序在SYSRAM中运行第一个执行的函数就是Reset_Handler函数它被 attribute ((naked, target(“arm”)))修饰编译器会将该函数的指令全部编译为ARM指令对应的‌函数原型及函数的汇编文件如下 红框标记处可以看到指令大小均为4字节且全是ARM指令。
2 总结 1Cortex-M通过修改中断向量偏移地址来实现对中断向量表基地址修改限制了它修改的范围。而Cortex-A7可以直接修改中断向量基址灵活性大大增强我们可以把中断向量表放到DDR、Flash、SRAM等任意存储器上。 2Cortex-M中断向量表存放的是中断向量Cortex-A7中断向量表存放的是跳转/PC修改指令通过修改PC来跳转到对应的中断服务函数。 3中断发生时Cortex-M处理器直接在中断向量表找到中断向量并执行对应的中断服务函数。中断发生时Cortex-A7会跳转中断向量表对应的中断偏移位置然后执行一条指令修改PC值跳转到对应的中断服务函数。 4Cortex-M7处理器取中断向量流程也适用于Cortex-M3/M4。