昨天尝试用CubeMx生成FreeRTOS, 使用编译器6.10编译失败,忙活了小半天也没搞出来, 今儿寻思着换个系统用UCOSIII, 终于搞出来了, 以下是移植记录:
1. 为什么非要用6.10呢?
首先是因为快, HAL库我用V5版本全编译一遍要3分钟, 用V6只需要30s
其次是因为超级智能的错误提示, 从下面的例子中就能看出来, 新版本编译器的错误提示简直是神了
2.我用的例程:
是原子H7拓展例程->UCOS拓展例程->例4-1 UCOSIII移植
修改编译器6.10后,出现一些警告和报错,下面一步步解决:
1. 警告解决:
这里发现例程中一个宏定义错误, 新的编译器很智能的提出来了(V5版本就没有)
../HALLIB/STM32H7xx_HAL_Driver/Inc\stm32h7xx_hal_usart.h(39):warning: '__STM32H7xx_HAL_USART_H' is used as a header guard here, followed by#define of a different macro [-Wheader-guard] ../HALLIB/STM32H7xx_HAL_Driver/Inc\stm32h7xx_hal_usart.h(40):note: '__STM3H7xx_HAL_USART_H' is defined here; did you mean'__STM32H7xx_HAL_USART_H'? 观察警告代码发现:
修改为正确的宏定义即可(PS.我发现原子不少的例程中这里的宏定义都是错的, 希望什么时候能改一下)
2. 错误解决:
2.1 编译器语法差别:
观察到错误:
这里涉及到了V5和V6编译器支持的语法不同,
所以需要在options里面把宏定义替换一下:
在Misc Controls中填入:
[mw_shl_code=c,true]-D__align(x)="__attribute__((aligned(x)))" -D__weak="__attribute__((weak))" -D__INLINE="__inline__"[/mw_shl_code]
2.2 printf报错解决:
观察到__FILE出现了重定义错误,本着能用就行的原则, 直接删掉例程中相关的代码即可:
2.3 未定义__isb解决:
再次编译, 报错如下:
..\OBJ\Template.axf:Error: L6218E: Undefined symbol __isb (referred from os_core.o). 搜索Keil官网相关文档(http://www.keil.com/support/man/docs/armclang_mig/armclang_mig_vvi1464869837179.htm),
发现__isb在arm_acle.h中支持,故在报错文件os_cpu.h中添加arm_acle.h即可:
2.4 再次编译
无错误, 无警告, 使用阿波罗核心板测试例程,闪灯无问题, 更多例程将来有机会再测试
|