具体步骤:
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
如何重定向printf
**
keil(ac5+ac6)编译效果
**
没有优化情况:
keil5.29 ac5编译器 :
keil5.29 ac6编译器 :
使用最高优化级别:
keil5.29 ac5编译器 :level 3
keil5.29 ac5编译器 :-Oz
具体步骤:
可以使用现成的工程修改(注意备份):
1、文件更换:将你的CORE文件夹下的cmsis_armcc.h替换为cmsis_armcc_V6.h(路径:STM32Cube_FW_F1_V1.6.0\Drivers\CMSIS\Include,其他固件库路径类似)
2、如果你使用了正点原子的SYSTEM文件夹,则需要修改sys.c和uart.c
sys.c:AC5和AC6的内联汇编格式不同需要修改为以下形式
也可以直接删除,一般我们用不到这些汇编,参考官方文档
uart.c需要注释以下代码或者直接删掉。
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
注意不要注释掉了FILE __stdout; 否则串口无法映射到printf;
如果你想新建个AC6的工程只需要在复制CORE文件夹里的文件时将cmsis_armcc.h替换为cmsis_armcc_V6.h即可。
Options选项卡的修改:
Target选项卡:
建议选择第二项,虽然第四项也是一样的,但是如果你以后MDK版本升级了这个选项还是需要再次修改,不然会报错!
C/C++:
Link Time Optimization链接优化,官方文档建议勾选,warnings选择AC5-like warnings没什么警告选ALL warnings警告会相当多
关于Optimization选项选择:
新手建议选择不优化即-O0,优化时速度与代码大小是对立的,即速度快代码大,代码小速度慢,O1到O3是优化速度,Oz是纯粹优化代码大小,Os则是平衡优化,二者兼顾一点。
最后,强调一下,你的工程路径里面最好不要有中文,不然无法正确生成browse信息,就是说代码无法跳转,go to def(F12)没有反应。如果你按照如上方式仍然编译后有error,两种方法:
1、按照下面的AC5与AC6不兼容的指令自行修改
2、将固件库更新至最新版(官方已经做好了)
/* ------------------通过重定向将printf函数映射到串口1上-------------------*/
#if !defined(__MICROLIB)
//#pragma import(__use_no_semihosting)
__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;
}
struct __FILE
{
int handle;
};
FILE __stdout;
#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
PUTCHAR_PROTOTYPE
{
/* 实现串口发送一个字节数据的函数 */
//serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
**
**
没有优化情况:
keil5.29 ac5编译器 :
keil5.29 ac6编译器 :
使用最高优化级别:
keil5.29 ac5编译器 :level 3
keil5.29 ac5编译器 :-Oz
Copyright © 2021-2022 www.miaokee.com 秒客网 备案号:粤ICP备2021167564号
免责声明:本站文章多为用户分享,部分搜集自互联网,如有侵权请联系站长,我们将在72小时内删除。