由于目前有个项目,需要将GCC编译工具链,转换移植到IAR工程里面,遇到以下问题,以此记录解决过程。使用GCC编译工具链时,void HardFault_Handler(void)函数,是放在exceptions.c文件里面,使用函数实现的。
void HardFault_Handler(void)
{
/* get current context */
ASM_KEYWORD("tst lr, #4");
ASM_KEYWORD("ite eq");
ASM_KEYWORD("mrseq r0, msp");
ASM_KEYWORD("mrsne r0, psp");
ASM_KEYWORD("ldr r1, [r0, #24]");
ASM_KEYWORD("bl prvGetRegistersFromStack");
while(TRUE)
{
;
};
}
问题一:首先编译提示,识别不到tst,ite等汇编指令的定义说明。
经过确认,该问题是由于使用的IAR IDE的版本问题,使用IAR IDE版本大于7.0以上的版本,上面内联汇编语言的格式不满足识别的条件。需要修改成以下换行的方式实现。
/* get current context */
ASM_KEYWORD("tst lr, #4\n");
ASM_KEYWORD("ite eq\n" \
"mrseq r0, MSP\n" \
"mrsne r0, PSP\n");\
ASM_KEYWORD("ldr r1, [r0, #24]");
ASM_KEYWORD("bl prvGetRegistersFromStack");
问题二:提示外部引入的函数prvGetRegistersFromStack,找不到其实现定义?
经过查找,需要使用以下方式转换,即可实现。
void HardFault_Handler(void)
{
/* get current context */
ASM_KEYWORD("tst lr, #4\n");
ASM_KEYWORD("ite eq\n" \
"mrseq r0, MSP\n" \
"mrsne r0, PSP\n");\
ASM_KEYWORD("ldr r1, [r0, #24]");
ASM_KEYWORD("ldr r2, =prvGetRegistersFromStack");
ASM_KEYWORD("bx r2 ");
while(TRUE)
{
;
};
}
以上经验,参照文档如下:文章来源:https://www.toymoban.com/news/detail-510755.html
Debugging a ARM Cortex-M Hard Fault - #10 by jefftenney - IAR - FreeRTOS Community Forums文章来源地址https://www.toymoban.com/news/detail-510755.html
到了这里,关于IAR工具链编译与GCC工具链编译转换问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!