当前位置:网站首页>升级 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 以外的优化等级
边栏推荐
- SQLServer下载与安装
- 查询表中开始日期与结束日期
- LeetCode167:有序数组两数之和
- 报错500,“message“: “nested exception is org.apache.ibatis.binding.BindingException: 解决记录
- MySQL详细学习教程(建议收藏)
- 强烈推荐APP破解常用工具集合!
- Promise entry to proficient (1.5w word detailed explanation)
- C陷阱与缺陷 第7章 可移植性缺陷 7.4 字符是有符号数还是无符号数
- 每日一题:两数之和
- .NET 6.0中使用Identity框架实现JWT身份认证与授权
猜你喜欢

Promise入门到精通(1.5w字详解)

torch.optim.Adam() function usage

MySQL索引常见面试题(2022版)
![[极客大挑战 2020]Roamphp1-Welcome](/img/3b/2fa91f7478b8abf6efe0feafd24e58.png)
[极客大挑战 2020]Roamphp1-Welcome

Discuz magazine/news report template (jeavi_line) UTF8-GBK template

LeetCode318: Maximum product of word lengths

Web 3.0入门教程

FP6606ACAW4 TQFN-20L (3mmx3mm) USB双端口充电控制器 百盛电子代理

esp32系列(5):esp32 蓝牙架构学习

代码越写越乱?那是因为你没用责任链
随机推荐
LeetCode318: Maximum product of word lengths
Deep Feedback Network for Recommendation
优酷视频元素内容召回系统:多级多模态引擎探索
SQLServer下载与安装
FP6600QSO SOP-8 USB专用充电端口控制器 用于快充电协议和QC2.0/3.0
Metaverse Web 3.0 和 DeFi大师班
MySQL索引常见面试题(2022版)
Discuz magazine/news report template (jeavi_line) UTF8-GBK template
一篇文 带你搞懂,虚拟内存、内存分页、分段、段页式内存管理(超详细)
链表Oj练习题 纯C语言
字符串复制、拼接、比较以及分割函数总结(一)
升级Win11后不喜欢怎么退回Win10系统?
Shell implementation based on stm32
论文阅读之《Underwater scene prior inspired deep underwater image and video Enhancement (UWCNN)》
如何让 JOIN 跑得更快?
你是这样的volatile,出乎意料
Promise entry to proficient (1.5w word detailed explanation)
(17)[系统调用]追踪系统调用(0环)
华为云数据治理生产线DataArts,让“数据'慧'说话”
weiit新零售小程序如何探索数字化门店的破局之路
