导入MDK工程后程序运行与期望不符:变量初始化赋值行为与MDK中不同。
使用CubeMX生成含有FreeRTOS组件的MDK工程代码,并使用Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3替换Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3文件夹。
Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3
Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3
使用MDK打开,修改编译器为armclang V6.19,修改优化等级为O1,编译烧录。进入调试,运行一段时间后暂停,观察可知程序运行正常。
使用EIDE导入MDK工程,添加构建后任务将axf转化为elf文件,指定调试器为OpenOCD,interface选择cmsis-dap.cfg,编译烧录。进入调试,运行一段时间后暂停,观察发现程序卡死在如下函数中:(此处还有一个小问题,EIDE无法自动进入Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c中,需要手动打开源文件)
cmsis-dap.cfg
Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c
void vPortExitCritical( void ) { configASSERT( uxCriticalNesting ); //卡死在此处 uxCriticalNesting--; if( uxCriticalNesting == 0 ) { portENABLE_INTERRUPTS(); } }
进一步观察,发现uxCriticalNesting被初始化为0xffffffff。在vPortEnterCritical函数中,uxCriticalNesting被加一造成值溢出,进而卡死在上述断言中。 然而正常情况下,uxCriticalNesting的初始化值应为0xaaaaaaaa,在MDK中证实了这一点。
uxCriticalNesting
vPortEnterCritical
以下是工程文件的压缩包,包含预构建的二进制文件:
uxCriticalNesting初始化为0xaaaaaaaa,初始化行为与MDK一致。
arrio464
由 Keil 链接器生成的 AXF 文件有一个基本问题,它不与 GDB 兼容。如果用 GDB 加载它,全局变量的值将是-1,而不是正常的初始值
这个插件有一个 axf 转 elf 功能,但仅在 ac5 上做过少量测试,可能并不适用 armclang
如果有此类问题,那么你只能使用 keil 在线调试
admin 尝试启用插件的axf to elf后解决问题。 事实证明axf的格式与elf存在差异,仅修改文件后缀会导致上述问题。
axf to elf