升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
烧录后 Reset And Run 重启失效
存在于 MDK ARM 5.28 之后包括 5.37 的版本. 这些版本即使勾选 Reset And Run, 在烧录后也不会自动重启执行
需要做以下设置
- Debug -> ST-Link Debugger -> Settings
- 切换到 Pack 标签页, 取消勾选 Enable
- 点击 OK 保存
编译器版本判断失效
不能再通过__GNUC__
判断是否为 gnu arm gcc toolchain, 因为 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 5 or 6
#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://chowdera.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 以外的优化等级
安装AC5编译器
如果必须使用AC5, 需要单独安装
- 前往https://developer.arm.com/downloads/view/ACOMP5, 选择Arm Compiler 5.06 update 7 (build 960) Win32下载
- 运行安装包, 安装路径需要改为 C:\Keil_v5\ARM\AC506U7
- 运行Keil MDK5
- 打开 Manage Project Items 对话框, 切换到 Folders / Extensions 对话框, 在 User Arm Compiler 右侧点开浏览按钮, 在弹出的对话框中, 点击 Add Another ARM Compiler Version to List, 定位到刚才安装的路径
- 保存后, 在 Config Target Options 对话框中, 就能看到 Use default compiler version 5 选项了
相关文章
- ChatGPT保姆级教程,一分钟学会使用ChatGPT!
- 乌克兰新闻机构遭俄军事黑客组织攻击
- 宜家EDI IFTMBC运输预定确认详解
- 指导了上百万程序员,《代码大全》之父和你聊聊软件开发素养|独家探访“编程圣经”背后故事
- Salamandra:一款功能强大的麦克风窃听检测工具
- 云与信任——未来安全的战场
- 俄IT巨头源代码被一锅端,公司否认黑客入侵
- 2022 中国开源年度报告来了!带你看懂中国开源过去这一年
- (二)vuex 使用 Ts推断类型
- 浅析AI视频监控能力在老旧小区改造升级中的应用
- 数字化关乎生存,企业如何明晰方向和路径|InfoQ数字化公众号上线啦
- 现代软件越来越大、越来越慢、越来越烂!还有救吗?
- 身价近千亿的谷歌联合创始人在隐退多年后回谷歌写代码
- 雄心勃勃的计划:沃尔沃正在将 Rust 用于其车载软件
- 降本增效大环境下,培养全栈技术能力是测试工程师的“保命符” | 展望测试工程师的 2023
- 微信全面支持“小号”;员工购买公司福利房,被裁员后遭巨额索赔;16岁少年孤身前往深圳腾讯总部解封QQ账号|Q资讯
- 2022年底C# 解压zip文件遇到的一个Bug
- Maui Blazor 使用摄像头实现
- 打通数据价值链,百分点数据科学基础平台实现数据到决策的价值转换 | 爱分析调研
- 一个简单、功能完整的WMS仓库管理系统