当前位置:网站首页>升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
2022-07-30 17:21:00 【IOsetting】
烧录后 Reset And Run 重启失效
存在于 MDK ARM 5.28 之后包括 5.37 的版本. 需要做以下设置
- Debug -> ST-Link Debugger -> Settings
- 切换到 Pack 标签页, 取消勾选 Enable
- 点击 OK 保存
判断编译器版本
Arm Compiler 6 默认定义了 __GNUC__ , 如果用这个做宏判断, 会造成错误的代码被编译. 参考 CMSIS 的做法用 __ARMCC_VERSION 来判断
#if defined __CC_ARM
// Arm Compiler 5
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
// Arm Compiler 6
#elif defined __GNUC__
// Normal GCC
或者
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
// Arm Compiler
#elif defined __GNUC__
// Normal GCC
#endif
关于 printf 串口输出的 retarget
用 Arm Compiler 6 的时候, printf retarget 和 Arm Compiler 5 的做法是一样的
int fputc(int ch, FILE *f)
{
return uartSendChar(ch);
}
int fgetc(FILE *f)
{
return uartReceiveChar();
}
选择 Use MicroLIB 编译报错
如果勾选 MicroLIB 后 build 报错:
.\Objects\xxx.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_stm32f40_41xxx.o).
.\Objects\xxxaxf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).
重新完全 rebuild 一下就好了, 具体原因查看这篇 https://yzsam.com/2022/02/202202011447342750.html
因为 keil 在你点击编译的时候只会编译内容有变动的部分(指预处理后的部分). 当你选择使用 MicroLIB 的时候, 编译器会自动添加宏定义
__MICROLIB,相对应的,头文件中的内容就会有所改变, 导致包含了头文件的 .c 文件内容改变. 而 startup 中处存在的条件汇编语句却没有得到预处理和汇编: 被抛弃的部分是堆栈的初始化处理程序, 可以看出定义了__MICROLIB宏和没有定义时堆栈的初始化是交由不同的函数处理的. 但是编译的时候没改变这里的条件汇编, 结果没有初始化的程序了, 因此报错"符号未定义". 解决方式同样很简单, 点击重新编译即可.
编译参数变化
Language C
使用 C99
Language C++
使用 C++03
Optimization
选择 –Oz
如果选择了 AC5 的默认优化等级-O0 会导致代码执行效率低. AC6 编译器 –O0 优化等级时, n 级条件表达式可能会产生巨大的栈需求. 需要调整为–O0 以外的优化等级
边栏推荐
猜你喜欢

Weka 3.8.6安装与Weka 3.8.6功能介绍

swagger使用教程——快速使用swagger

一篇文 带你搞懂,虚拟内存、内存分页、分段、段页式内存管理(超详细)

JMeter Notes 3 | JMeter Installation and Environment Instructions

Moralis去中心化Web3应用开发教程

C# 连接SQL Sever 数据库与数据查询实例 数据仓库
![[HarekazeCTF2019] Avatar Uploader 1](/img/2c/6dde7b8d34ba0deb334b4283e1e30e.png)
[HarekazeCTF2019] Avatar Uploader 1

MySQL详细学习教程(建议收藏)

ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)Solution

MySQL索引常见面试题(2022版)
随机推荐
Daily practice------Generate 13-digit bar, Ean-13 code rule: The thirteenth digit is the check code obtained by the calculation of the first twelve digits.
C陷阱与缺陷 第7章 可移植性缺陷 7.1 应对C语言标准变更
京东获取推荐商品列表 API
C陷阱与缺陷 第6章 预处理器
Excel导入和导出
C陷阱与缺陷 第6章 预处理器 6.3 宏并不是语句
Valid bracketed strings [greedy exercise]
Deep Feedback Network for Recommendation
牛客网刷题——运算符问题
JMeter笔记4 | JMeter界面介绍
向量检索基础方法总结
bert-base调试心得
[MRCTF2020]Ezaudit
bean的生命周期
Error occurred while trying to proxy request项目突然起不来了
华为云数据治理生产线DataArts,让“数据‘慧’说话”
952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题
[NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍
微信小程序picker滚动选择器使用详解
全球架构师峰会
