函数指针初始化为 NULL,但计算结果为 0xffffffff

问题描述 投票:0回答:1

我正在尝试在 vscode 中使用 ARMCC Keil 工具链和 CMake。我从工作中的 Keil 项目复制了 asm/compiler/linker 标志,但我不在任何地方使用 .crf 和 .d 文件。

在 vscode 中使用 Cortex-debug 扩展进行调试时,我有一个奇怪的行为。它可以编译、链接,但我注意到当函数指针初始化为 NULL 时,其值的计算结果为 0xffffffff。

为了更准确地见证这一点(我试图构建的应用程序相当大),我在 main 的最开始添加了代码:

typedef void (*function_pointer)(void); 
static function_pointer function = NULL;  

/* ------------------------------------------------------------------- */ 
/**.  * @brief Function for application main entry.  */   

int main(void) { 
    if(function != NULL)    
    {       
        function = (function_pointer)NULL;
        function();
    }  
. 
. 
.  

调试器在 if 语句中中断(因此函数确实不为 NULL,而它应该为 NULL) NULL 赋值后,函数未赋值。

当我添加预处理标志时,我可以确定 NULL 会扩展为 0 :

typedef void (*function_pointer)(void); 
static function_pointer function = 0;  
int main(void) {
    if(function != 0)
    {
        function = (function_pointer)0;
        function();
    }  

请注意,我使用 CMake 生成了 .elf 文件,但 Keil 生成了 .axf 文件(应该是相同的,因为 ELF 文件是标准文件)。

我尝试生成 .crf 文件和 .d 文件,但我不确定 Cortex-debug vscode 扩展是否需要它们。

此外,我注意到无论是通过 Keil 还是通过 vscode 编程,编程行为都会发生变化。在 vscode 中花费的时间要少得多,而且我的调试板上的 LED 有时在 Keil 中闪烁,但在 vscode 中却不会亮。

我可以提供所有详细信息(CMake 生成/编译器/链接器命令、分散文件、调试启动命令等...)。只是我想让问题清楚,而不是提供 100 多行代码,但随意问任何问题

谢谢您的帮助

c debugging cmake function-pointers armcc
1个回答
0
投票

我在 GDB 输出中收到警告:可加载部分“IRAM1”位于 elf 部分之外。我调整了分散文件并操纵了 elf 来取悦 GDB,它就可以了。 GDB 没有找到 ZI 数据,所以我认为它在尝试评估它们时是在胡说八道。

© www.soinside.com 2019 - 2024. All rights reserved.