C++ 什么';这部分代码的意思是什么?
有人能说出这个密码是什么意思吗C++ 什么';这部分代码的意思是什么?,c++,c,C++,C,有人能说出这个密码是什么意思吗 void (* const rvt[])(void) = { (void (*) (void))((unsigned long)&__STACK_END), // The initial stack pointer xkg_som, // The reset handler xnt_ISR, // The NMI
void (* const rvt[])(void) = {
(void (*) (void))((unsigned long)&__STACK_END), // The initial stack pointer
xkg_som, // The reset handler
xnt_ISR, // The NMI handler
FaultISR, // The hard fault handler
IntDefaultHandler, // The MPU fault handler
bgs_stm, // The bus fault handler
IntDefaultHandler, // The usage fault handler
0, // Reserved
0, // Reserved
IntDefaultHandler, // The MPU fault handler
};
实际上我不理解它。它定义了一个指向函数的指针数组,该数组不接受任何参数并返回void。然后用内存中一些寄存器的地址初始化数组,这些寄存器被转换为函数指针
它看起来像是用于嵌入式编程的中断向量表。它定义了一个指向函数的指针数组,这些函数不带参数,返回void。然后用内存中一些寄存器的地址初始化数组,这些寄存器被转换为函数指针
void (* const rvt[])(void)
它看起来像用于嵌入式编程的中断向量表
void (* const rvt[])(void)
这定义了一个名为“rvt”的常量数组。它的元素是指向没有参数的void函数的指针
然后使用大括号初始化器列表初始化该数组。所以所有其他行都是这个数组的元素。第一个是指向_STACK_END的指针,它显然是错误的类型,因此需要转换为正确的类型(它将首先转换为unsigned long,然后转换为正确的函数类型指针)
顺便说一句:代码不完整,因为大括号没有闭合,或者可能是您的格式错误,因为最后一条注释包含闭合大括号
这定义了一个名为“rvt”的常量数组。它的元素是指向没有参数的void函数的指针
然后使用大括号初始化器列表初始化该数组。所以所有其他行都是这个数组的元素。第一个是指向_STACK_END的指针,它显然是错误的类型,因此需要转换为正确的类型(它将首先转换为unsigned long,然后转换为正确的函数类型指针)
顺便说一句:代码不完整,因为大括号没有闭合,或者可能是您的格式错误,因为最后一条注释包含闭合大括号
方式(由提供):
将rvt声明为返回void的函数(void)的常量指针数组
这是数组的[1]。此外,这意味着
rvt
的声明是一个定义
addresof运算符获取变量的内存地址 地址被强制转换为
无符号长
类型
转换后的值再次转换为返回void的函数指针(void),void是存储在数组中的函数指针的类型
数组的其余初始化值可以是函数名、函数指针或可以隐式转换为函数指针(如lambdas)的内容 方式(由提供): 将rvt声明为返回void的函数(void)的常量指针数组
这是数组的[1]。此外,这意味着
rvt
的声明是一个定义
addresof运算符获取变量的内存地址 地址被强制转换为
无符号长
类型
转换后的值再次转换为返回void的函数指针(void),void是存储在数组中的函数指针的类型
数组的其余初始化值可以是函数名、函数指针或可以隐式转换为函数指针(如lambdas)的东西。这似乎是ARM Cortex M微控制器的中断向量表 与大多数其他MCU相比,ARM Cortex的一个特点是,它在程序启动之前设置了堆栈指针。其他MCU倾向于在运行时设置它 因此,表中的第一个条目是程序启动时堆栈指针应设置的值
\uuu STACK\u END
可能是从链接器获得的某个常量。强制转换(void(*)(void))
将其转换为函数指针。从指针转换为int到函数指针有点可疑,但它可能适用于大多数嵌入式C编译器,尽管C标准对此表示不满
其余条目是中断服务例程(函数)的函数地址。也就是说,它们与函数指针是一样的。您可以通过为函数指针指定函数名来初始化它
因此,整个向量表被声明为函数指针数组,其中每个函数都有签名void func(void)
。*const
声明意味着函数指针本身是只读的。这意味着它们将在flash中分配,这对于向量表来说是合适的。在闪存中,向量表通常分配在固定的保留地址
编写相同代码的更好方法是:
typedef void (isr_t)(void);
isr_t* const [] = {
(isr_t* const)((uintptr_t)&__STACK_END), // The initial stack pointer
...
uintpttr\u t
是一个足够大的整数类型,保证能够保存地址,不像无符号长
这似乎是ARM Cortex M微控制器的中断向量表
与大多数其他MCU相比,ARM Cortex的一个特点是,它在程序启动之前设置了堆栈指针。其他MCU倾向于在运行时设置它
因此,表中的第一个条目是程序启动时堆栈指针应设置的值\uuu STACK\u END
可能是从链接器获得的某个常量。强制转换(void(*)(void))
将其转换为函数指针。从指针转换为int到函数指针有点可疑,但它可能适用于大多数嵌入式C编译器,尽管C标准对此表示不满
其余条目是中断服务例程(函数)的函数地址。也就是说,它们与函数指针是一样的。您可以通过为函数指针指定函数名来初始化它
因此,整个向量表被声明为函数指针数组,其中每个函数都有签名void func(void)
。*const
&__STACK_END
(unsigned long)&__STACK_END)
(void (*) (void))((unsigned long)&__STACK_END)
typedef void (isr_t)(void);
isr_t* const [] = {
(isr_t* const)((uintptr_t)&__STACK_END), // The initial stack pointer
...