这是一些带有中断向量的启动文件摘录.

#pragma DATA_SECTION(interruptVectors, ".intvects")
void (* const interruptVectors[])(void) = 
{
 (void (*) (void))((uint32_t)&__STACK_END),
 resetISR,
 nmi_ISR,
 fault_ISR,
 ... /* More interrupt vectors */

void (* const interruptVectors[])(void)-是一个函数指针数组,必须包含函数名,但我无法理解(void (*) (void))((uint32_t)&__STACK_END)语法.

(void (*) (void))看起来像是指向一个函数的指针,该函数不返回任何内容,没有参数,也没有名称.有可能吗?

(uint32_t)&__STACK_END是指针.

提前感谢!

推荐答案

这看起来像ARM处理器或类似处理器的中断向量表.中断向量表包含中断处理程序的地址,因此它本质上是一个函数指针array.

此表的第一项是堆栈指针的初始化值.它显然不是函数指针,而是数据指针,因此需要进行一些类型转换.不是因为处理器关心类型,而是因为C关心类型.

所以&__STACK_END可能是指向堆栈末尾数据地址的指针类型.然后将其转换为普通的32位数字,最后转换为函数指针.

可以跳过第一次转换到uint32_t,直接从数据指针转换到函数指针,但这样做可能是为了确保在给定编译器上正确完成转换.

严格地说,在C标准中,从数据指针到函数指针的这种转换是不合法的,即使在中间有整数强制转换.然而,大多数嵌入式编译器都可以做到这一点,因为这是您需要做的典型事情.

C++相关问答推荐

malloc实现:判断正确的分配对齐

使用单个字节内的位字段

ESP32在vTaskDelay上崩溃

将常量转换为指针会增加.数据大小增加1000字节

使用双指针动态分配和初始化2D数组

C中函数类型的前向声明

为什么未初始化的 struct 的数组从另一个数组获取值?

如何使用唯一数字对整型进行分区

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

我在反转双向链表时遇到问题

C堆栈(使用动态数组)realloc内存泄漏问题

Fprintf正在写入多个 struct 成员,并且数据过剩

C: NULL>;NULL总是false?

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

是什么阻止编译器优化手写的 memcmp()?

快速准确计算double的小数指数

`void foo(int a[static 0]);` 有效吗?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组

如何在C中以0x格式打印十六进制值

如何在Linux上从控制台左上角开始打印文本?