当前位置:网站首页>升级 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 以外的优化等级
边栏推荐
猜你喜欢

OpenCV形状检测

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

如何让 JOIN 跑得更快?
![有效的括号字符串[贪心练习]](/img/1c/5cefb53bc4aba54dd79b0cc9b09b0d.png)
有效的括号字符串[贪心练习]

JMeter Notes 4 | JMeter Interface Introduction

un7.30:Linux——如何在docker容器中显示MySQL的中文字符?

论文阅读之《Color Constancy Using CNNs》

每日练习------生成13位条形, Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码。

Wanhua chemical fine chemical industry innovation product assembly

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
随机推荐
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
如何让 JOIN 跑得更快?
C陷阱与缺陷 第7章 可移植性缺陷 7.5 移位运算符
《痞子衡嵌入式半月刊》 第 59 期
【云商店公告】关于7月30日帮助中心更新通知
Navisworks切换语言
Web 3.0入门教程
SQLServer下载与安装
[极客大挑战 2020]Roamphp1-Welcome
Shell implementation based on stm32
WeChat applet picker scroll selector use detailed explanation
[HarekazeCTF2019] Avatar Uploader 1
FP6606CMP5 CPC-16L USB类型-C和PD充电控制器 百盛电子代理商
C陷阱与缺陷 第6章 预处理器
KDD 2020 | 深入浅出优势特征蒸馏在淘宝推荐中的应用
shell快速移植
Valid bracketed strings [greedy exercise]
swagger使用教程——快速使用swagger
MySQL详细学习教程(建议收藏)
你是这样的volatile,出乎意料
