- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一些带有中断 vector 的启动文件摘录。
#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 处理器或类似处理器的中断 vector 表。中断 vector 表包含中断处理程序的地址,因此它本质上是一个函数指针数组。
该表的第一项是堆栈指针的初始化值。显然不是函数指针,而是数据指针,所以需要进行一些类型转换。不是因为处理器关心类型,而是因为 C 关心。
所以 &__STACK_END
可能是某种指针类型,它指向堆栈末尾的数据地址。然后将其转换为普通的 32 位数字,最后转换为函数指针。
如果编译器支持将其作为扩展,则可以跳过第一次转换为 uint32_t
并直接从数据指针转换为函数指针。但严格来说,在 C 标准中,从数据指针直接转换为函数指针是不合法的,必须强制转换为整数。
还有其他实现定义的问题程序员必须考虑这种转换工作:类型和对齐的大小必须兼容,不能有陷阱表示等。这在使用接近的代码时都是正常的硬件。
关于c++ - 什么是 (void (*) (void))((uint32_t)&__STACK_END)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72786319/
这是一些带有中断 vector 的启动文件摘录。 #pragma DATA_SECTION(interruptVectors, ".intvects") void (* const interrupt
我是一名优秀的程序员,十分优秀!