|
Questions:在使用ARMCompiler version 6(AC6)时,可能会出现如下情形之一: n 情形一 代码执行效率低 n 情形二 堆栈需求增加 n 情形三 脱机运行失败 n 情形四 printf无法打印 Answer: n 情形一 代码执行效率低 可能是没有选择AC6默认优化等级 –Oz image size,而手动选择了AC5的默认优化等级-O0导致,调整为默认优化等级可解决。 n 情形二 堆栈需求增加 使用AC6编译器 –O0优化等级时,n级条件表达式可能会产生巨大的栈需求。 调整为–O0以外的优化等级可解决。 n 情形三 脱机运行失败 使用AC6编译器 –O0优化等级时,未选择微库,偶尔会造成脱机运行失败(调试仿真下可使用,拔掉下载器运行就失败)。 将微库选项勾起可解决。 n 情形四 printf无法打印 这是由于AC6对printf初始化与AC5有区别导致。 修改方法:以AT32BSP的printfexample举例。 注意:雅特力官网最新版BSP无此问题。printf路径:\project\at32f403a_407_board\at32f403a_407_board.c。 在BSP路径\project\at_start_f403a\examples\usart\printf找到at32_board.c,原代码写法如下: | /* Suport printf function, useMicroLib is unnecessary */ #ifdef __CC_ARM #pragma import(__use_no_semihosting) struct __FILE { int handle; }; FILE __stdout; void _sys_exit(int x) { x = x; } #endif #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ |
修改后代码如下,该修改方式使得AC5,AC6编译器都可以正常使用printf函数: | /* suport printf function, usemicrolib is unnecessary */ #if (__ARMCC_VERSION > 6000000) __asm (".global __use_no_semihosting\n\t"); void _sys_exit(int x) { x = x; } /* __use_no_semihosting was requested, but _ttywrch was */ void _ttywrch(int ch) { ch = ch; } FILE __stdout; #else #ifdef __CC_ARM #pragma import(__use_no_semihosting) struct __FILE { int handle; }; FILE __stdout; void _sys_exit(int x) { x = x; } #endif #endif #if defined ( __GNUC__ ) && !defined (__clang__) #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif |
类型:MCU应用 适用型号:AT32全系列 主功能:AC6编译器
|