CPU中断异常

一、中断、异常

1.什么是中断,什么是异常

  • 内核与总线以及外设
  • ARM Cortex-M4:32 位高性能嵌入式处理器内核,支持 Thumb-2 指令集,具备 100MHz 主频和可选的浮点运算单元(FPU),适用于需要数字信号处理(DSP)和实时控制的场景,如工业自动化、电机控制等。

  • JTAG & SW + ETM:JTAG(联合测试行动小组)和 SW(串行线调试)是调试接口,用于程序下载与硬件调试;ETM(嵌入式跟踪宏单元)则提供指令执行的实时跟踪功能,帮助开发者分析程序运行流程。

  • MPU(存储器保护单元):可选组件,可将存储器划分为多个区域并设置访问权限,防止程序非法访问关键内存,提升系统安全性。

  • NVIC(嵌套向量中断控制器):负责中断的优先级管理与嵌套处理,支持最多 240 个外部中断,能快速响应并执行中断服务程序,保障系统的实时性。

  • 总线(D-BUS、I-BUS、S-BUS):采用哈佛架构的总线设计,D-BUS 用于数据访问,I-BUS 用于指令取址,S-BUS 用于系统外设访问,实现指令和数据的并行传输,提升处理效率。

以上所述(内核)都是由ARM公司提供,其他元件都属于片上外设。 而连接cpu与外设的就是 AHB bus-matrix总线(可以总裁)

  • 异常是发生在内核里,打断执行流,一切都是异常。

  • 而中断是CPU外部的突发事件(比如各种片上总线,AHB\APB等)促使内部发生异常的,叫做中断。它先找到NVIC,NVIC再造成cpu内部异常

  • CPU内部的异常时和CPU同步的,但是外部的中断,比如串口,是和COU异步的。

2.同步异常和异步异常

一、同步异常

  • 触发时机 :与指令 执行同步,即异常在指令执行过程中或执行完毕时立即触发。

  • 触发源 :主要来自CPU 内部程序行为,如:

    • 图中CPU 的 "exception or trap":例如除法溢出、未定义指令、程序访问越界(需 MPU 配合检测)等,是程序执行逻辑导致的异常。

    • 图中MPU 的 "fault":存储器保护单元检测到非法内存访问(如权限不足、地址越界)时,同步触发异常。

  • 处理逻辑:通常由操作系统或运行时环境捕获后,进行错误修复、程序调试或异常终止等处理。

二、异步异常

  • 触发时机 :与指令 执行异步,即异常可在任意时刻(与当前执行的指令无关)由外部事件触发。

  • 触发源 :主要来自外部硬件,如图中的 **"Hardware interrupts"**(UART、IIC、SPI 等外设产生的中断),典型场景如:

    • 外设数据收发完成(UART 接收中断)。

    • 定时器超时(如系统调度时钟)。

    • 外部中断引脚触发(如按键输入)。

  • 处理逻辑 :操作系统通过中断控制器(如 NVIC)管理优先级,触发对应的中断服务程序(ISR),完成数据处理、事件响应等操作。

3.NVIC控制器

  • 内核外设地址
一、NVIC 寄存器访问权限说明
  • 权限分级 :ARM Cortex-M4 采用 ** 特权级(Privileged Mode)用户级(User Mode)** 的权限架构:

    • 多数 NVIC 寄存器仅能在特权级下访问,防止用户程序(非特权)非法修改中断配置,保障系统稳定性。

    • 少数寄存器(如NVIC_STIR)允许用户级访问,为特定场景下的用户程序触发中断提供了灵活度。

  • 参考依据:《ARM® Cortex®-M4 Devices Generic User Guide》《Cortex®-M4 Technical Reference Manual》中 "NVIC registers and privilege access" 章节详细列举了各寄存器的访问权限,是开发中权限管理的权威依据。

4.中断向量表的圆整

一、定义:地址对齐的要求

中断向量表是存储中断服务程序 入口地址 的连续内存区域,"圆整" 指将其起始地址对齐到特定的字节边界 (如 256 字节、1024 字节等),本质是地址对齐(Address Alignment)

假设内部异常中断加上外部中断有103个,每个占四字节,则需要412个字节,圆整就需要2的整次幂,则需要取512字节

二、中断向量表

1、向量表是什么

向量的表格,向量实际上表示的是一个地址,向量表包含了各种异常处理器异常处理的表格

(补充知识:函数是有地址的,函数名就是他的地址)

2、为什么需要向量表

  1. 加速中断响应当硬件(如键盘、定时器、网卡)触发中断时,CPU 需要立即知道该执行哪个处理程序(中断服务程序,ISR)。如果没有向量表,CPU 可能需要逐个查询所有硬件设备 "是谁触发了中断",效率极低(类似 "大海捞针")。而向量表通过 **"中断号→地址" 的直接映射 **,让 CPU 只需用中断号作为索引,直接从表中读取处理程序的入口地址,瞬间定位目标代码,大幅缩短响应时间(这也是 "向量" 一词的由来 ------ 像 "箭头" 一样直接指向目标)。

  2. 统一硬件与软件的交互标准不同硬件设备的中断触发逻辑不同(比如键盘中断和硬盘中断的触发信号完全不同),但向量表为所有中断源分配了唯一的 "中断号"(索引),软件只需根据中断号处理,无需关心硬件细节。例如,x86 架构中 "0 号中断" 固定对应 "除零异常","1 号中断" 对应 "调试异常",这种标准化让操作系统和应用程序能统一处理各类事件。

3、向量表储存在哪

这段链接器脚本通过以下配置揭示了中断向量表的存储位置:

  • 脚本中明确将中断向量表(KEEP(*(.isr_vector)))归属于 .text 代码段。

  • 同时指定 .text 段存储在 FLASH 中(} > FLASH)。

  • 按照设计规范,向量表必须位于程序开始的地方,就像上表所示,代码一开始就要执行它

根据这张 ARM Cortex-M 系列的中断向量表,

复位后会执行以下流程:

  1. 初始化栈指针 :CPU 首先读取向量表第一个条目__initial_sp,将栈指针(SP)设置到栈顶地址,为程序运行分配栈空间。

  2. 执行复位处理函数 :接着跳转到第二个条目Reset_Handler,该函数会完成系统初始化(如硬件外设、时钟配置、全局变量初始化等),最终跳转到main函数,启动应用程序逻辑

相关推荐
SystickInt5 小时前
32 DMA实现ROM与RAM通信
stm32·单片机·嵌入式硬件
俊昭喜喜里7 小时前
STM32开发板电源设计( DCDC 电路和 LDO 电路 )
stm32·单片机·嵌入式硬件
m0_555762907 小时前
方案再再对比
单片机
boneStudent8 小时前
Day20:串口基本配置与收发
stm32·单片机·嵌入式硬件
紫阡星影8 小时前
基于Arduino模拟烟雾监测系统
单片机·嵌入式硬件·arduino
HIZYUAN9 小时前
嵌入式开发踩坑记: AG32硬件设计指南(一)
stm32·单片机·嵌入式硬件·fpga开发·硬件设计·最小系统·agm ag32
三佛科技-1341638421210 小时前
BP85958D输出12V400MA智能家居电源芯片(典型应用电路、替代型号HN32512)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
海涛高软10 小时前
axi-gpio
单片机·嵌入式硬件
youcans_10 小时前
【动手学STM32G4】(2)USB 虚拟串口通信
stm32·单片机·嵌入式硬件·串口通信·通信协议
绵山介子推10 小时前
STM32硬件错误(HardFault_Handler)一些心得体会
stm32·单片机·嵌入式硬件