硬汉嵌入式论坛

 找回密码
 立即注册
查看: 12035|回复: 43
收起左侧

[MDK] 近来才弄清楚,MDK的编译BUG问题

  [复制链接]

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2020-8-15 16:46:27 | 显示全部楼层 |阅读模式
本帖最后由 laofa 于 2020-8-22 00:25 编辑

在ST的F103和H750中我都碰到了可以在线DEBUG,但不能脱机运行问题,最中发现原因是优化级别影响的,设置不同的优化级别对程序影响非常大,有时在-O0可以工作,有时在default可以工作,有时是-O1可以工作,太鸡扒了!
所以当大家肯定自己的代码没有问题时,出现一些离奇的情况下,可以考虑切换不同的优化级别看,可能会有惊喜。

为了方便说明,本例子很简单,我手工码入的代码只有一个任务ThreadMain,这个任务就是闪灯,其他部分代码全部是ST的工具自动生成,RTOS是经过RTOS2封装的RTX5,用内部RC、PLL、主频400MHz
通过PA2输出点灯周期为0.5S。

编译用AC6,目前在脱机情况下default、-O0跑不动,其他的全部能跑,AC5下是不能编译通过的,所以不用在AC5下测试

Radio.rar

36.58 MB, 下载次数: 10

这是测试工程

回复

使用道具 举报

12

主题

75

回帖

111

积分

初级会员

积分
111
发表于 2020-8-15 23:41:10 | 显示全部楼层
之前吃过这个亏
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-16 01:02:48 | 显示全部楼层
谢谢楼主分享。

不过这个不是MDK的bug,是代码的耐优化性还有提升空间,好的代码可以做到所有优化等级通吃。
回复

使用道具 举报

73

主题

1198

回帖

1417

积分

至尊会员

积分
1417
发表于 2020-8-16 09:07:01 | 显示全部楼层
应该是代码问题。
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-16 13:36:23 | 显示全部楼层
eric2013 发表于 2020-8-16 01:02
谢谢楼主分享。

不过这个不是MDK的bug,是代码的耐优化性还有提升空间,好的代码可以做到所有优化等级通 ...

可以确定是MDK的BUG,不然你告诉我如何写代码才正常了?因为我不优化都没办法跑起来,反而是更高的优化可以跑起来,这样的离奇情况不是只出现少数,而是多数情况是这样的。

我经常碰到在不优化下跑不起来,在有优化的情况下能跑起来,如果说是堆栈不够,那我加了数倍甚至加到最大都无法跑。MDK共有5级优化,分别是default、-O0、-O1、-O2、-O3,我的好多程序只能在其中一个级别里正常跑,与级别高低没有关系,这不能说明是我程序问题。在线调试一点问题没有,离开仿真器就不行了,经常出现这样的问题,然后通过换不同的优化选项就OK了,但并不是说越低越稳定,在MDK中没有这个说法。
回复

使用道具 举报

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2020-8-16 16:22:33 | 显示全部楼层
向楼主学习,楼主有实锤吗,汇编层面的证明编译器错误地处理了某行代码?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-16 16:56:09 | 显示全部楼层
laofa 发表于 2020-8-16 13:36
可以确定是MDK的BUG,不然你告诉我如何写代码才正常了?因为我不优化都没办法跑起来,反而是更高的优化可 ...

其实这就说到了一个痛点

很多人喜欢在线调试程序,就容易遇到这种问题,像我这里很少喜欢在线调试,但比较喜欢把工程代码实现所有优化等级通吃来排查程序中存在的隐含bug。

以我的二代示波器为例,当时是用MDK4.7X整的,所有优化等级通吃,开启时间优化。

【二代示波器】事隔三年后开启二代示波器的设计工作,性能将更强劲,向专业示波器设计靠拢,已经发布
http://www.armbbs.cn/forum.php?mod=viewthread&tid=45785

个人看法,仅供参考


回复

使用道具 举报

6

主题

640

回帖

658

积分

金牌会员

积分
658
QQ
发表于 2020-8-16 18:28:45 | 显示全部楼层
虽然也遇到楼主这样的问题,但是我还是不能同意楼主的观点,还是承认自己代码的编写水平有问题吧
为什么别人写 的代码能经得起优化,自己写的为什么不行
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2020-8-16 22:56:16 | 显示全部楼层
我以前也遇到过这种问题,出现这种问题绝大多数是因为开启优化选项后,编译器将一些软件空操作实现的软件延时会优化掉,从而失去延时的作用,进而导致系统或者总线时序错误。DEBUG时程序运行感觉会比正常时运行速度要慢一些,所以这种情况DEBUG时有可能好使而正常运行时就不好使了。使用IAR这种问题的解决办法是在这种不想让编译器优化的函数前加#pragma optimize=[goal][level][no_optimization...]参数防止优化。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-8-17 15:55:56 | 显示全部楼层
不是编译器优化得到的问题,你看看的代码是不是调用printf函数,没有处理好会出现这样的问题
回复

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
发表于 2020-8-17 16:07:48 | 显示全部楼层
之前用NXP的LPC用官方库的SPI驱动时,会遇到楼主这种情况,后来和他们fae沟通,sdk版本升级后就修复了这问题,这种问题个人感觉是可以通过调整代码解决的
回复

使用道具 举报

3

主题

66

回帖

75

积分

初级会员

积分
75
发表于 2020-8-17 17:05:36 | 显示全部楼层
自己写汇编 不需要优化
真是mdk的bug,早就有issue了,还等到现在
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2020-8-17 18:14:11 | 显示全部楼层
这种一般就是个人代码问题,与MDK关系不大。
回复

使用道具 举报

8

主题

78

回帖

102

积分

初级会员

积分
102
发表于 2020-8-19 09:03:03 | 显示全部楼层
eric2013 发表于 2020-8-16 16:56
其实这就说到了一个痛点

很多人喜欢在线调试程序,就容易遇到这种问题,像我这里很少喜欢在线调试,但 ...

求大神指导调试方法!eric大神能不能出个调试的教程?
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2020-8-19 14:33:23 | 显示全部楼层
还遇到过RT1052工程旧版没问题keil更新了一个版本后 工程异常 把宏定义检查关掉才可以  关键那个宏定义我哪里都找不到我启用了  全局搜索没有 c++设置里面也没有  后来难得折腾了 放在同事旧版的又可以  哈哈哈
回复

使用道具 举报

3

主题

62

回帖

71

积分

初级会员

积分
71
发表于 2020-8-19 18:25:48 | 显示全部楼层
按一般道理来说,优化越高,优化引发的问题应该更多。而这确实是O0不行,O1行,甚至选择fast加link time优化都正常。现在看起来就是在main之前就挂了,个人觉得不能简单说是代码经不起优化
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-20 01:59:05 | 显示全部楼层
he2002512 发表于 2020-8-19 09:03
求大神指导调试方法!eric大神能不能出个调试的教程?

之前分享过一个:

关键时候,又拿出了我的独门绝技,MDK不同优化等级导致异常的解决思路
http://www.armbbs.cn/forum.php?m ... 8479&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

8

主题

78

回帖

102

积分

初级会员

积分
102
发表于 2020-8-20 16:51:30 | 显示全部楼层
ruboss 发表于 2020-8-19 18:25
按一般道理来说,优化越高,优化引发的问题应该更多。而这确实是O0不行,O1行,甚至选择fast加link time优 ...

可以反汇编看看,main之前也没几行代码。
回复

使用道具 举报

59

主题

284

回帖

461

积分

高级会员

积分
461
发表于 2020-8-20 20:56:34 | 显示全部楼层
只通过函数指针调用的函数会不会被优化掉?
回复

使用道具 举报

5

主题

179

回帖

194

积分

初级会员

积分
194
发表于 2020-8-20 20:58:50 | 显示全部楼层
arm公司的嵌入式大佬建议使用ac6, ac5确实有部分bug!,而且也不再更新。看了上面的评论,大家不要迷信编译器,也不要迷信个人代码。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-21 00:22:00 | 显示全部楼层
soga238 发表于 2020-8-20 20:58
arm公司的嵌入式大佬建议使用ac6, ac5确实有部分bug!,而且也不再更新。看了上面的评论,大家不要迷信编译 ...

这不是迷信,而是再高安全等级的编译器,也有触摸不到的天花板。

但是我们可以让程序代码在所有优化等级下都通吃来检查各种奇葩问题,是一种非常有效的检测手段。以前我做各种综合Demo就非常喜欢这么玩,现在进入AC6依然是这样的。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
QQ
发表于 2020-8-21 18:46:49 | 显示全部楼层
对于优化等级问题 有些是可以通过排查汇编代码查到的,可以在代码中限制一分部代码的优化等级。或者选中个别代码文件,单独设置这个代码文件的优化等级。当然,如果真的是编译器的问题,也是可以发给KEIL邮件指明的。

#pragma SAVE
#pragma OPTIMIZE(0)
// code here ...
#pragma RESTORE
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-22 00:30:11 | 显示全部楼层
我实在是受不了大家的质疑,所以索性搞了个工程上来,欢迎大家一起来测试,我测试的编译环境是MDK V5.31 AC6
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-22 08:16:05 | 显示全部楼层
laofa 发表于 2020-8-22 00:30
我实在是受不了大家的质疑,所以索性搞了个工程上来,欢迎大家一起来测试,我测试的编译环境是MDK V5.31 AC ...

谢谢楼主上传。

不知道你的问题是不是这个原因:

最新的MDK AC6.14使用0级优化编译HAL库的n级条件表达式会产生巨大的栈需求,使用0以外优化等级即可解决
http://www.armbbs.cn/forum.php?m ... 7601&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2020-8-22 09:43:44 | 显示全部楼层
davidlau 发表于 2020-8-21 18:46
对于优化等级问题 有些是可以通过排查汇编代码查到的,可以在代码中限制一分部代码的优化等级。或者选中个 ...

这个非常实用,感谢!
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-22 12:49:30 | 显示全部楼层
eric2013 发表于 2020-8-22 08:16
谢谢楼主上传。

不知道你的问题是不是这个原因:

刚刚试了,所有都开到4KB以上都不行,还是故障依旧。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-22 15:51:53 | 显示全部楼层
laofa 发表于 2020-8-22 12:49
刚刚试了,所有都开到4KB以上都不行,还是故障依旧。

周一了我测试下你上传的这个例子。
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2020-8-22 17:44:33 | 显示全部楼层
keil我碰到过另一个问题,还不止一次:某段代码下载到芯片执行不正确,在线调试后执行到这段代码又是对的,再结束在线调试后下载到芯片执行又成功了。也就是说,某段代码必须在线调试执行一次,否则怎么都不正确。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-24 19:35:58 | 显示全部楼层
花了点时间解决了楼主的问题,坑隐藏的的确比较深。

坑1:
对于我们这种外置晶振的板子,设置为100ms小了点,有时候会造成启动失败,最好设置为1000以上,我这里一直用的5000。
QQ截图20200824200045.png



坑2:

针对楼主的工程,这个是关键,如果用AC6的优化等级0,没有选择使用微库的话,会造成脱机执行失败,将微库勾上即可解决:

1.png




回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-24 21:24:19 | 显示全部楼层
eric2013 发表于 2020-8-24 19:35
花了点时间解决了楼主的问题,坑隐藏的的确比较深。

坑1:

牛逼,这都被你发现了,对于坑1:是ST的HAL工具生成的,除非每次都改,不然再次配置时就会消失了,
对于坑2,确实我没有发现这个原因,之前有帮同事调试STM32F103时发现要打勾才能用,没想到竟然在所有的系列里都有这个毛病。
还有,我无论用外部晶振或内部RC都存在这些问题。
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-24 21:32:25 | 显示全部楼层
本帖最后由 laofa 于 2020-8-24 21:43 编辑

勾选上microlib后又多了如下问题,真是难玩了,
Build started: Project: Radio
*** Using Compiler 'V6.14', folder: 'D:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'Target 1'
.........
linking...
.\Objects\Radio.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_stm32h750xx.o).
.\Objects\Radio.axf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 2 error messages.
".\Objects\Radio.axf" - 2 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:04
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-24 21:34:11 | 显示全部楼层
laofa 发表于 2020-8-24 21:32
勾选上microlib后又多了如下问题,真是难玩了,
Build started: Project: Radio
*** Using Compiler 'V6. ...

打开xxx.S文件,单独编译就可以解决了。

我测试你楼主位的例子时也遇到了。
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-25 08:59:39 | 显示全部楼层
eric2013 发表于 2020-8-24 21:34
打开xxx.S文件,单独编译就可以解决了。

我测试你楼主位的例子时也遇到了。

我在5.31上试了这个方法,发现不行,
而且现在用dsp库中的fft_fast_f32之后,更不行吧,根本跑不起来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-25 09:40:52 | 显示全部楼层
laofa 发表于 2020-8-25 08:59
我在5.31上试了这个方法,发现不行,
而且现在用dsp库中的fft_fast_f32之后,更不行吧,根本跑不起来

剩下问题就不帮你测试了

回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-25 10:56:44 | 显示全部楼层
eric2013 发表于 2020-8-25 09:40
剩下问题就不帮你测试了

已经帮了好多了,非常感谢!
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-25 14:15:33 | 显示全部楼层
刚刚中午又建了个不带HAL的工程,只用cmsis-rtos2和startup.s 发现很正常,用哪个级别都没问题,fft没有时间试了,晚上再试。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-25 15:17:55 | 显示全部楼层
laofa 发表于 2020-8-25 10:56
已经帮了好多了,非常感谢!

回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
 楼主| 发表于 2020-8-26 09:09:06 | 显示全部楼层
laofa 发表于 2020-8-25 08:59
我在5.31上试了这个方法,发现不行,
而且现在用dsp库中的fft_fast_f32之后,更不行吧,根本跑不起来

经过几番测试,发现问题在于rom空间不够,然后我把H750的128KB划大后人不可靠造成的,昨晚通过直接在SRAM中调试通过证实是因为扩容片内flash引起的。

以后还是不能指望那点小便宜了。
回复

使用道具 举报

3

主题

62

回帖

71

积分

初级会员

积分
71
发表于 2020-8-26 13:53:44 | 显示全部楼层
eric2013 发表于 2020-8-24 19:35
花了点时间解决了楼主的问题,坑隐藏的的确比较深。

坑1:

大佬,坑2里说的脱机运行失败,有没有一些关于脱机运行的知识点,想学习一下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2020-8-26 15:11:40 | 显示全部楼层
ruboss 发表于 2020-8-26 13:53
大佬,坑2里说的脱机运行失败,有没有一些关于脱机运行的知识点,想学习一下

我留意一下,有好资源了给大家分享下。手头还真没,我就是调试的时候发现了这么个问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 12:35 , Processed in 0.422415 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表