[keil5]从AC5到AC6的转变

时间:2022-10-31 19:57:20


具体步骤:

可以使用现成的工程修改(注意备份):

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的内联汇编格式不同需要修改为以下形式

[keil5]从AC5到AC6的转变

也可以直接删除,一般我们用不到这些汇编,参考官方文档

[keil5]从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选项卡:

[keil5]从AC5到AC6的转变

建议选择第二项,虽然第四项也是一样的,但是如果你以后MDK版本升级了这个选项还是需要再次修改,不然会报错!

C/C++:

[keil5]从AC5到AC6的转变

Link Time Optimization链接优化,官方文档建议勾选,warnings选择AC5-like warnings没什么警告选ALL warnings警告会相当多

关于Optimization选项选择:

[keil5]从AC5到AC6的转变

新手建议选择不优化即-O0,优化时速度与代码大小是对立的,即速度快代码大,代码小速度慢,O1到O3是优化速度,Oz是纯粹优化代码大小,Os则是平衡优化,二者兼顾一点。



最后,强调一下,你的工程路径里面最好不要有中文,不然无法正确生成browse信息,就是说代码无法跳转,go to def(F12)没有反应。如果你按照如上方式仍然编译后有error,两种方法:
1、按照下面的AC5与AC6不兼容的指令自行修改

[keil5]从AC5到AC6的转变

2、将固件库更新至最新版(官方已经做好了)

如何重定向printf

/* ------------------通过重定向将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;
}

**

keil(ac5+ac6)编译效果

**
没有优化情况:

keil5.29 ac5编译器 :

[keil5]从AC5到AC6的转变


keil5.29 ac6编译器 :

[keil5]从AC5到AC6的转变

使用最高优化级别:

keil5.29 ac5编译器 :level 3

[keil5]从AC5到AC6的转变

keil5.29 ac5编译器 :-Oz

[keil5]从AC5到AC6的转变