You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解ARM Cortex-M中断向量表定义对应的C语言语法

语法拆解

我们可以用C语言声明的右左法则逐层拆解void (* const vectors[])(void)的含义,从最内层的标识符vectors开始分析:

  1. 先看标识符右侧:vectors[],说明vectors首先是一个未指定长度的数组,实际长度由后面的初始化列表元素个数自动推导
  2. 再看标识符左侧括号内的修饰:* const,const在*右侧,说明数组的每一个元素都是常量指针——指针本身的值在初始化后不能被修改
  3. 跳出外层括号看右侧:(void),说明上述指针指向的是没有输入参数的函数
  4. 最后看最左侧的修饰:void,说明该函数的返回值为空

综上,这句话完整的含义是:定义了一个名为vectors的数组,数组中每个元素都是「指向无入参、无返回值函数」的常量指针,数组长度由初始化列表决定。

结合启动代码场景的补充说明

前面的__attribute__ ((used, section(".vectors")))是配合这个数组的GCC扩展属性,作用有两个:

  • used:告诉编译器即使这个数组看起来没有被业务代码主动引用,也不要将其作为冗余代码优化删除
  • section(".vectors"):告诉链接器将这个数组放到链接脚本定义的.vectors段中,这个段的地址对应ARM Cortex-M内核规定的中断向量表起始位置,芯片上电后会自动从这个位置读取初始栈指针和中断入口地址

另外用const修饰指针也符合中断向量表的硬件特性:向量表一般固化在Flash中,运行时不允许修改,const修饰可以避免代码意外修改向量表内容,同时编译器也会自动将这个数组放到只读存储区域。

你看到初始化列表第一个元素是栈顶地址而非函数指针,是因为Cortex-M内核的向量表设计特殊,第一项专门用于存储初始栈指针的值,内核会单独处理这个值的用途,和后面的中断函数指针做了区分,仅在链接时做地址兼容即可。

内容的提问来源于stack exchange,提问作者contiguousCentipede18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 11:45:04