eric2013 发表于 2020-8-25 09:09:46

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

这两个都是坑,一般隐藏比较深,不容易发现。

static/image/hrline/4.gif


问题1:

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


问题2:

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

这坑也非常容易遇到。
https://img.anfulai.cn/dz/attachment/forum/202008/24/194254hck32twy3pnklgw5.png

问题3:




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



ddyyxpg 发表于 2020-8-25 09:14:47

有什么坑啊,正在学习使用中,

eric2013 发表于 2020-8-25 09:43:30

ddyyxpg 发表于 2020-8-25 09:14
有什么坑啊,正在学习使用中,

已经更新。

wdliming 发表于 2020-8-25 09:49:07

基本上就是-balance,或者-osize,就行

eric2013 发表于 2020-8-25 10:02:31

wdliming 发表于 2020-8-25 09:49
基本上就是-balance,或者-osize,就行

还有-fast

calvinxxw 发表于 2020-8-25 10:09:30

Embedded Studio的SEGGER编译器解决了这个问题,水平高了一筹。但0级优化,直接等于不优化,代码尺寸巨大。而AC5的0级已经做了优化,完全不需要进一步优化,调试也非常友好。这个半吊子AC6就想出来迭代,貌似太草率。

wdliming 发表于 2020-8-25 12:36:44

calvinxxw 发表于 2020-8-25 10:09
Embedded Studio的SEGGER编译器解决了这个问题,水平高了一筹。但0级优化,直接等于不优化,代码尺寸巨大。 ...

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

myxiaonia 发表于 2020-8-25 14:37:32

wdliming 发表于 2020-8-25 12:36
你去看看ac5,也有bug的,人家都放弃了,你难道比arm还牛逼?

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

`dc2018 发表于 2020-8-25 17:47:03

第二个坑遇到过。

eric2013 发表于 2020-8-25 18:09:05

calvinxxw 发表于 2020-8-25 10:09
Embedded Studio的SEGGER编译器解决了这个问题,水平高了一筹。但0级优化,直接等于不优化,代码尺寸巨大。 ...

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

barryzxy 发表于 2020-9-27 22:30:12

eric2013 发表于 2020-8-25 10:02
还有-fast

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

eric2013 发表于 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


sy2009 发表于 2020-9-29 07:41:06


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

JIKIMO 发表于 2020-9-29 15:41:23

sy2009 发表于 2020-9-29 07:41
ac6编译器模式选择-O0-O2-O3 stm32h750的adc库的初始化都能够正常但是选择-Oz image size模式的 ...

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

eric2013 发表于 2022-10-23 13:21:59

更新个问题3.

GorgonMeducer 发表于 2022-11-22 23:05:33

问题3……我怎么说呢
当你使用在线汇编的时候,编译器是不知道你做了什么的……换句话说,你中间通过在线汇编更新了MSP,编译器是不知道的——它以为它自己掌控着整个栈的地址。
我觉得你换个编译器,比如其它 clang,gcc,armcc,甚至是IAR,你这么做都会引起问题。

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

kingdjh 发表于 2022-11-23 09:41:43

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

eric2013 发表于 2022-11-23 10:19:12

kingdjh 发表于 2022-11-23 09:41
问题1可以通过keil生成的callgraph看到每个函数的栈情况。
问题2可能要通过卡住的时候,接上jlink,用ozon ...

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

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

xingstone 发表于 2024-2-5 11:08:09

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

eric2013 发表于 2024-2-6 09:58:12

xingstone 发表于 2024-2-5 11:08
硬汉兄,我这里也碰到了关于编译器优化的BUG。我用stm32cubeMX生成了两个平台的工程(keil和stm32cubeIDE), ...

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

Edmund1964 发表于 2024-2-6 20:43:32

多年以来形成的习惯,用C做的就不动SP, 要动SP就用汇编里做。

sz-afa 发表于 2024-2-21 09:53:56

https://mp.weixin.qq.com/s/uVktPkcbh2XAVo2QAluxnA   这篇文章有提到你说的这种情况跟你一样也是boot跳转app的。
页: [1]
查看完整版本: 初步确诊MDK AC6的0级优化是个大坑,玩不顺手的话,慎用(2022-10-23)