ARM Cortex-M系列之中断向量表

linux内核学习10.1:Linux内核ARM7架构异常中断向量表 https://www.cnblogs.com/sky-heaven/p/8028978.html https://blog.csdn.net/weixin_42262944/article/details/107426398 阅读详情

ARM Cortex-M架构的芯片的中断向量表(Interrupt Vector Table)前16位的中断由ARM核设定。16位以后的中断为芯片厂商自行定义。ARM Cortex-M架构芯片一般带有片上闪存(flash)。ARM Cortex-M手册规定在片上闪存起始地址处需要有一个有效的中断向量表。芯片上电或复位后首先从中向量表中读出入口函数地址和栈指针。将入口函数地址和栈指针装载入寻址寄存器(PC)和栈指针(SP)寄存器后,开始执行程序。

中断向量表格式

中断向量表每一位为一个32bit的地址。每一个地址对应一个中断函数的地址(第一位除外)。除了第一位以外,所有地址的目标都为寻址寄存器(PC)。当相应中断触发时,ARM Cortex-M硬件会自动把中断向量表中相应的中断函数地址装载入寻址寄存器(PC)然后开始执行中断函数。如上所述,前16位为ARM保留的系统中断,建议读者熟记。之后的中断为芯片自定义的外部中断,可以在使用时查询手册或者厂商提供的驱动程序。

Exception Number IRQ Number 中断 注释
NA NA SP 初始栈指针
1 NA Reset 复位函数地址
2 -14 NMI 不可屏蔽中断
3 -13 Hard fault
4 -12 Memory fault (Reserved in CM0/0+) 内存管理错误中断
5 -11 Bus fault (Reserved in CM0/0+) 总线错误中断
6 -10 Usage fault (Reserved in CM0/0+) 使用错误中断
7 -9 Reserved 保留位(未使用)
8 -8 Reserved 保留位(未使用)
9 -7 Reserved 保留位(未使用)
10 -6 Reserved 保留位(未使用)
11 -5 SVC 通常用于请求privileged模式,或者在OS中用于请求系统资源
12 -4 Reserved 保留位(调试用)
13 -3 Reserved 保留位(未使用)
14 -2 PendSV 通常用于在OS中切换任务
15 -1 SysTick 系统节拍时钟中断

中断向量表定义

中断向量表可以通过汇编语言定义也可以通过C语言定义。以下列出两种方式的示例程序。

C

这里我们定义了一个数组,数组的每一项对应相应的中断函数。如上所述,数组的第一项为初始栈指针,第二项为入口函数地址。余下的所有中断都指向了一个通用中断函数。开发者可以根据需求替代相应的中断函数。
上文还提到中断向量表需要放置于闪存起始地址处。这里__attribute__((section(".vectors")))为gcc的特定语法(如果开发者使用IAR或者其他编译器,语法有所不同),目的是告诉编译器在链接所有对象文件(objects)时把_vector[]数组放在链接脚本(linker script)中的.vectors段落(section)。在链接脚本中,.vector段落被定义于闪存起始处。

#ifndef ARMV7M_PERIPHERAL_INTERRUPTS
#  error ARMV7M_PERIPHERAL_INTERRUPTS must be defined to the number of I/O interrupts to be supported
#endif

extern void exception_common(void);
unsigned _vectors[] __attribute__((section(".vectors"))) =
{
   
   
  /* Initial stack */
  IDLE_STACK,
  /* Reset exception handler */
  (unsigned)&__start,
  /* Vectors 2 - n point directly at the generic handler */
  [2 ... (15
ARMv8 异常处理之中断向量表 阅读详情

相关推荐

ARM Cortex-M底层技术(二)Cortex-M启动代码原理分析

写在前面的话: 近些年来ARM Cortex-M阵营各厂商(ST、NXP、ATMEL、Freescale……)发布新产品的节奏越来越快,以及微控制器应用普及程度的加深,越来越多的开发者把更多精力投注在应用层开发上,花在对底层技术上的时间越来越少。小编我希望借助我之前对底层的一些积累,可以帮到大家快速的建立对Cortex-M系列处理器(M0/M0+/M3/M4/M7以及新的M23/M33)的...

LETFLY'S LAB 1284

Linux内核ARM架构异常中断向量表

Linux内核ARM架构异常中断向量表说明ARM中异常中断的种类ARM异常中断向量表内核异常向量表异常向量表跳转vector_srub宏内核启动建立异常向量表   当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。 说明 Kernel版本:4.14.111 ARM处理器,Contex-A7 ARM中异常中断的种类   ARM体系中的异常中断下图所示 ARM异常中断向量表   ARM的异常中断向量表可以是

深海 4283

ARM中的中断向量表

当中断或异常发生的时候,CPU自动将PC指向一个特定的地址,这个地址就是中断向量表。   在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中   断服务例程的功能。例如:   IRQEntry B HandleIRQ ;跳转范围较小   LDR PC,=HandleFIQ   ;LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令四周的存储单元   中,相对偏移小于4KB。该32位数据就是要跳转到的中断服务程序入口地址。   之

ARM架构中断与异常向量表机制解析

探讨了ARM架构中断发生的硬件和软件流程,异常向量表的安装与映射过程,以及相关代码的实现细节。首先,介绍了中断的触发及其处理流程,CPU在检测到中断后,如何借助向量表进行跳转处理并恢复现场。接着,阐述了异常向量表在ARM系统中的两种典型位置(0和0xffff0000)及其应用场景,以及在Linux内核中的初始化和映射过程。本文通过汇编与C代码展示了向量表的复制、内存分配、页表清理、高低向量映射、以及异常处理辅助功能的初始化,帮助读者深入理解异常处理的机制和实现。

caiji0169的博客 2543

ARM Cortex汇编伪指令

ARM架构(尤其是Cortex-M系列MCU)的汇编中,伪指令(Pseudo-Instructions)是由汇编器解释的特殊指令,用于定义数据、符号、代码结构或控制汇编过程。通过合理使用伪指令,可以高效组织代码结构、定义数据和符号,这是编写MCU底层驱动(如启动文件、中断处理)的基础。用于定义数据常量、变量或缓冲区,不生成机器码,仅在汇编时分配内存。用于条件汇编(非运行时流程控制,而是汇编时的代码生成控制)。这些伪指令借用指令名称,但由汇编器处理,用于生成特定操作。用于包含文件、调试或控制汇编器行为。

创新改变世界! 1135

【中断与异常】ARM Cortex-M的中断与异常

前面的符号如NMI_Handler、HardFault_Handler)将被执行弱化处理,如果整个代码在链接时遇到了名称相同的符号(例如与NMI_Handler相同名称的函数),那么代码将使用未被弱化定义的符号(与NMI_Handler相同名称的函数),而与弱化符号相关的代码将被自动丢弃。当系统正在服务一个中断时,如果有一个更高优先级的中断触发,那么处理器同样会打断当前运行的中断服务例程,然后把老的中断服务例程上下文的PSR,R0,R1,R2,R3和R12寄存器自动保存到中断栈中。

qq_38089448的博客 437

ARM cortex-m IAP升级小记

看了一下网上关于arm芯片IAP原理和具体实现的文章比较少,正好之前做过相关的项目,也踩过好多坑,所以简单写篇文章总结一下有关IAP的相关内容。 这篇文章主要针对arm cortex-m3/m4,硬件环境使用STM32F系列,软件环境为Keil mdk5。 硬件浅谈 想要搞通ARM 的IAP升级,首先要搞懂ARM芯片一些硬件原理,ARM芯片采用冯。诺依曼架构,代码和数据存储在相同存储体中(只是存储在逻辑上相同的存储体中,不一定存储在同一个存储体,有一些手段可以实现代码数据分离,这里不对此做过度延伸)。

CSDN1344789841的博客 1315

STM32F030C6 IAP功能APP中断向量表重映射

1、IAP中断向量表重映射 1.1、Coretext-M3与Coretext-M4:    SCB->VTOR = 0X08000000|0X20000;     __set_PRIMASK(0); 在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码...

haidscs的博客 3875

ARM Cortex-M底层技术(二)启动代码原理分析

转载网址:ARM Cortex-M底层技术(二)启动代码原理分析 写在前面的话: 近些年来ARM Cortex-M阵营各厂商(ST、NXP、ATMEL、Freescale……)发布新产品的节奏越来越快,以及微控制器应用普及程度的加深,越来越多的开发者把更多精力投注在应用层开发上,花在对底层技术上的时间越来越少。小编我希望借助我之前对底层的一些积累,可以帮到大家快速的建立对Cortex-M系列处...

zuixin369的博客 754

openvela之ARM Cortex-M 系列中断嵌套

本文深入探讨了openvela系统中ARM Cortex-M架构的中断嵌套实现,重点分析了两种中断嵌套模式:零延迟高优先级中断嵌套和可屏蔽中断嵌套。前者通过精细的栈管理和优先级配置实现即时响应,后者基于BASEPRI寄存器实现动态中断屏蔽。文章详细阐述了中断优先级排布、栈管理方式及关键限制,并提供了新平台移植的注意事项,包括核心配置选项、系统初始化流程、中断优先级配置策略等。针对不同ARM Cortex-M版本和特殊需求(如SMP支持)给出了具体实现建议,为嵌入式实时系统开发者提供了全面的技术参考。

RIVOTEK_OPENVELA的博客 1345

学习KEA之中断系统

这篇 学习KEA之周期中断定时器PIT 已经使用了定时中断,本篇将归纳一下中断系统的操作。 SKEAZN642.h: typedef enum IRQn { /* Core interrupts */ NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ HardFault_IRQn = -13, /**< Cortex-M0

大橙员 1302

[ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表

ARM架构中,异常向量表是一组固定位置的内存地址,它们包含了处理器在遇到异常时需要跳转到的处理程序的入口地址。每个异常类型都有一个对应的向量地址。当异常发生时,处理器会自动跳转到对应的向量地址,并开始执行异常处理程序。

Andy0214的专栏 7083

ARM中断系统】Cortex-A和Cortex-M中断系统异同

CortexA以A7为例,Cortex-A7也有中断向量表中断向量表也是在代码最前面。向量地址中断类型中断模式0x00复位中断(Reset)特权模式(SVC)0x04未定义指令中断(Undefined Instruction)未定义指令终止模式(Undef)0x08软中断(Software Interrupt,SWI)特权模式(SVC)0x0C指令预取中止中断(Prefetch,Abort)中止模式0X10数据访问中止中断(Data Abort)中止模式0X14。

qq_38089448的博客 1360

通过GDK8观察ARM框架下的中断向量表

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。以上是中断在百度百科中些较为浅显的解释,中断实际上是操作系统中较为重要的一种概念及机制,关于中断的一些详细的说明可以在由张银奎老师主讲的《在调试器下理解计算系统》中观看到(视频在nano code中;Nano Code下载上面提到“转入处理新情况的程序”,那么中断后,该如何确定这个新程序呢?

iuu77的博客 1154

ARM中断向量表简介

ARM的异常向量表(如下图所示),为什么FIQ处于 异常向量表的最顶端? —————————————————————————————————— 中断向量地址 | 异常中断类型 | 异常中断模式 | 优先级(6最低) | ———————|——————— -|————————|—————————-| 0x00 | 复位

channel310的专栏 1744

ARM自学笔记】ARM Cortex -A中断系统(原理篇)

前言 本文所描述的为Cortex-A7中断系统 简述 中断是什么? 中断(Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。 通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息

qq_45628620的博客 8847

ARM Linux 中断向量表建立流程

一般编写arm的裸机程序的时候,创建中断向量表就把它放在0x00000000~0x0000001c中,一般都放在这个位置上。但是中断向量表也可以放在0xffff0000~0xffff001c中,知道这是怎么设置的么?开始看到的时候真的有点奇怪,因为在学习arm的时候,根本没去看arm中的协处理器CP15中的c1控制寄存器中的v位来控制,我们一般都使用默认的值0,则必须将中断向量表放在0x00000

海纳百川 8398
上一篇: ARM Cortex-M系列之系统节拍时钟Systick
Yoshiawu
博客等级 码龄6年 5粉丝 3原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值