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函数,启动应用程序逻辑

相关推荐
硅基手札42 分钟前
【Linux 内核专栏 18】进程间通信 IPC(下)— Socket·Netlink·fd 三件套·futex·线程同步
linux·运维·驱动开发·单片机·嵌入式硬件·mcu·架构
无敌贵点大王15 小时前
嵌入式软件面试经(自用)
c语言·stm32·单片机·学习·mongodb·面试·职场和发展
我是海飞16 小时前
使用杰理 AC7925B 实现 Windows电脑 USB 副屏
windows·单片机·电脑·嵌入式·杰理
我是海飞17 小时前
杰理 JL703N SDK 实现 AI 自动化调试:自动进入下载模式、下载、重启与日志抓取
人工智能·单片机·自动化·音视频·杰理
Zwawa17 小时前
PID 的三个参数之外:位置式、增量式和反馈控制
c语言·单片机·嵌入式
创界工坊工作室17 小时前
29-基于单片机的万年历设计
stm32·单片机·嵌入式硬件·proteus
木由里予17 小时前
NAND 这门生意
运维·服务器·网络·单片机
沐欣工作室_lvyiyi18 小时前
基于STM32的社区养老控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·社区养老控制系统·保定理工学院·华德学院·淮南师范学院
snow@li18 小时前
单片机:全景梳理核心原理与体系深度分析
单片机·嵌入式硬件
创界工坊工作室19 小时前
26-基于51单片机的智能热水器控制系统设计
stm32·单片机·嵌入式硬件·毕业设计·51单片机·proteus