硬汉嵌入式论坛

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

[开发工具] 初步确诊MDK AC6的0级优化是个大坑,玩不顺手的话,慎用(2022-10-23)

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2020-8-25 09:09:46 | 显示全部楼层 |阅读模式
这两个都是坑,一般隐藏比较深,不容易发现。




问题1:

最新的MDK AC6.14使用0级优化编译HAL库的n级条件表达式会产生巨大的栈需求,使用0以外优化等级即可解决
http://www.armbbs.cn/forum.php?mod=viewthread&tid=97601


问题2:

如果用AC6的优化等级0,没有选择使用微库的话(底层做了C标准库重定向),偶尔会造成脱机(调试仿真下可以使用,拔掉下载器运行就失败)执行失败,将微库勾上即可解决:

这坑也非常容易遇到。


问题3:

image.png


所以当前MDK AC6创建的工程,默认使用其它的几个优化等级是有道理的。



回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
发表于 2020-8-25 09:14:47 | 显示全部楼层
有什么坑啊,正在学习使用中,
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2020-8-25 09:43:30 | 显示全部楼层
ddyyxpg 发表于 2020-8-25 09:14
有什么坑啊,正在学习使用中,

已经更新。
回复

使用道具 举报

75

主题

1257

回帖

1482

积分

至尊会员

积分
1482
发表于 2020-8-25 09:49:07 | 显示全部楼层
基本上就是-balance,或者-osize,就行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2020-8-25 10:02:31 | 显示全部楼层
wdliming 发表于 2020-8-25 09:49
基本上就是-balance,或者-osize,就行

还有-fast
回复

使用道具 举报

5

主题

100

回帖

115

积分

初级会员

积分
115
发表于 2020-8-25 10:09:30 | 显示全部楼层
Embedded Studio的SEGGER编译器解决了这个问题,水平高了一筹。但0级优化,直接等于不优化,代码尺寸巨大。而AC5的0级已经做了优化,完全不需要进一步优化,调试也非常友好。这个半吊子AC6就想出来迭代,貌似太草率。
回复

使用道具 举报

75

主题

1257

回帖

1482

积分

至尊会员

积分
1482
发表于 2020-8-25 12:36:44 | 显示全部楼层
calvinxxw 发表于 2020-8-25 10:09
Embedded Studio的SEGGER编译器解决了这个问题,水平高了一筹。但0级优化,直接等于不优化,代码尺寸巨大。 ...

你去看看ac5,也有bug的,人家都放弃了,你难道比arm还牛逼?
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2020-8-25 14:37:32 | 显示全部楼层
wdliming 发表于 2020-8-25 12:36
你去看看ac5,也有bug的,人家都放弃了,你难道比arm还牛逼?

毕竟ac5用维护这么长时间,某些地方还是有可取之处,只不过历史潮流来了,不得不上而已
回复

使用道具 举报

10

主题

93

回帖

123

积分

初级会员

积分
123
发表于 2020-8-25 17:47:03 | 显示全部楼层
第二个坑遇到过。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2020-8-25 18:09:05 | 显示全部楼层
calvinxxw 发表于 2020-8-25 10:09
Embedded Studio的SEGGER编译器解决了这个问题,水平高了一筹。但0级优化,直接等于不优化,代码尺寸巨大。 ...

MDK AC6的0级优化,我感觉应该砍掉,有点多余。
回复

使用道具 举报

8

主题

21

回帖

45

积分

新手上路

积分
45
发表于 2020-9-27 22:30:12 | 显示全部楼层

stm32 模拟IIC  用balance 优化直接没有反应,只有default和O0可以,AC6优化的东西太多了,还不确定哪有坑。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2020-9-28 08:14:41 | 显示全部楼层
barryzxy 发表于 2020-9-27 22:30
stm32 模拟IIC  用balance 优化直接没有反应,只有default和O0可以,AC6优化的东西太多了,还不确定哪有 ...

没问题,我发布的ThreadX GUIX的触摸IC就是模拟I2C,其它优化没问题
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100212


回复

使用道具 举报

1

主题

29

回帖

32

积分

新手上路

积分
32
发表于 2020-9-29 07:41:06 | 显示全部楼层

ac6编译器模式  选择-O0  -O2  -O3 stm32h750的adc库的初始化都能够正常  但是选择-Oz image size模式的时候 初始化失败  adc读出来的值为0 没有值
回复

使用道具 举报

7

主题

85

回帖

111

积分

初级会员

积分
111
发表于 2020-9-29 15:41:23 | 显示全部楼层
sy2009 发表于 2020-9-29 07:41
ac6编译器模式  选择-O0  -O2  -O3 stm32h750的adc库的初始化都能够正常  但是选择-Oz image size模式的 ...

选择高级别优化,勾选Link-Time Optimization试试
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2022-10-23 13:21:59 | 显示全部楼层
更新个问题3.
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-11-22 23:05:33 | 显示全部楼层
问题3……我怎么说呢
当你使用在线汇编的时候,编译器是不知道你做了什么的……换句话说,你中间通过在线汇编更新了MSP,编译器是不知道的——它以为它自己掌控着整个栈的地址。
我觉得你换个编译器,比如其它 clang,gcc,armcc,甚至是IAR,你这么做都会引起问题。

这里是一个信息差的问题。你以为你用在线汇编操作了MSP——代码写在这里编译器怎么不知道?问题是编译器也没在文档里说过它会去分析你做了什么啊。
回复

使用道具 举报

3

主题

69

回帖

78

积分

初级会员

积分
78
发表于 2022-11-23 09:41:43 | 显示全部楼层
问题1可以通过keil生成的callgraph看到每个函数的栈情况。
问题2可能要通过卡住的时候,接上jlink,用ozone的attach看看堆栈。
问题3就不是问题,标准就是局部变量是放在栈里的,所以通过SP寻址,gcc、clang都是这样做的。
O0是不做任何优化,所以你可以看到最原始的编译器行为。
如果想要避免这种情况,可以把相关变量用参数的形式传入,ARM规定前4个参数是通过寄存器传入的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2022-11-23 10:19:12 | 显示全部楼层
kingdjh 发表于 2022-11-23 09:41
问题1可以通过keil生成的callgraph看到每个函数的栈情况。
问题2可能要通过卡住的时候,接上jlink,用ozon ...

这个是站在知道问题原因的情况下问题排查方法。

而不知道问题原因情况下,排查过程是极度消耗精力的。楼主位的几个问题就是这样。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-2-5 11:08:09 | 显示全部楼层
硬汉兄,我这里也碰到了关于编译器优化的BUG。我用stm32cubeMX生成了两个平台的工程(keil和stm32cubeIDE),程序上就三个定时器主从模式实现同步启动(定时器3启动带动控制定时器1启动,定时器1启动带动控制定时器8启动)+指示灯闪烁功能。通过在ac5和ac6上各种编译优化选项测试,只有一两项可以正常运行(没优化等级的选项完全不行)。然后同样的程序在stm32cubeIDE平台上跑,情况也一样。不同优化选项出来的效果完全不同。如果大家想看看,我把程序发上来。我想问下是不是不同平台用的编译器其功能原理都差不多?

keil平台

keil平台

stm32cubeIDE平台

stm32cubeIDE平台
3.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2024-2-6 09:58:12 | 显示全部楼层
xingstone 发表于 2024-2-5 11:08
硬汉兄,我这里也碰到了关于编译器优化的BUG。我用stm32cubeMX生成了两个平台的工程(keil和stm32cubeIDE), ...

AC5也不行吗,那可能确实有点问题了。
回复

使用道具 举报

0

主题

129

回帖

129

积分

初级会员

积分
129
发表于 2024-2-6 20:43:32 | 显示全部楼层
多年以来形成的习惯,用C做的就不动SP, 要动SP就用汇编里做。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-2-21 09:53:56 | 显示全部楼层
https://mp.weixin.qq.com/s/uVktPkcbh2XAVo2QAluxnA   这篇文章有提到你说的这种情况跟你一样也是boot跳转app的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-1 07:11 , Processed in 0.339498 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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