搜索
bottom↓
回复: 20

stm32工程gcc编译。keil和vscode下为什么执行速度不同?

[复制链接]

出10入4汤圆

发表于 2023-4-6 11:49:38 | 显示全部楼层 |阅读模式
在写一个stm32的工程。因为有些原因必须用arm-none-eabi-gcc编译。
尝试了两个环境,分别是keil+gcc,vscode+gcc。
因为keil+gcc配置很麻烦,所以想用vscode+gcc。
但是发现同样一段算法,vscode+gcc里面执行好慢,感觉速度能差10倍左右。
因为都是用的一个gcc所以想不通为什么。
能想到的区别是keil+gcc不用写makefile,直接配置 -mthumb -mcpu=cortex-m4 -mfloat-abi=hard  -mfpu=fpv4-sp-d16  -specs=nano.specs -specs=nosys.specs等参数。
vscode+gcc是直接在makefile里面更改的参数。
有没有大佬给点思路啊,是在是不清楚编译原理。

出1310入193汤圆

发表于 2023-4-6 13:32:05 | 显示全部楼层
设置有技巧吗?
vscode+gcc  坛友大佬是有推荐 的
优点多多

出10入4汤圆

 楼主| 发表于 2023-4-6 15:22:33 | 显示全部楼层
lb0857 发表于 2023-4-6 13:32
设置有技巧吗?
vscode+gcc  坛友大佬是有推荐 的
优点多多
(引用自2楼)

谢谢,看了下大佬们的帖子,没有提到遇到这种问题,可能我哪里设置有问题吧

出105入79汤圆

发表于 2023-4-6 16:02:44 | 显示全部楼层
优化等级一样吗?
速度和优化等级关系最大,其次和微库,gcc版本,I D cache 配置有关。

出10入4汤圆

 楼主| 发表于 2023-4-6 17:00:53 | 显示全部楼层
qwe2231695 发表于 2023-4-6 16:02
优化等级一样吗?
速度和优化等级关系最大,其次和微库,gcc版本,I D cache 配置有关。 ...
(引用自4楼)


哇,看过您的帖子,大佬啊。
优化等级,gcc版本都试过了。ID cache都没开。

微库这个是怎么设置啊。

出0入442汤圆

发表于 2023-4-6 17:03:01 来自手机 | 显示全部楼层
那个快10倍的应该是并行编译。。。。

出10入4汤圆

 楼主| 发表于 2023-4-6 17:31:33 | 显示全部楼层
wye11083 发表于 2023-4-6 17:03
那个快10倍的应该是并行编译。。。。
(引用自6楼)

又是大佬啊。
看了一下,因为不怎么用gcc,没太懂并行编译是什么,是怎么影响的执行效率的。求大佬解惑

出0入31汤圆

发表于 2023-4-6 17:51:27 | 显示全部楼层
看看汇编内容,也许能查到一点蛛丝马迹,会不会慢的那个浮点协处理器没开?

出0入22汤圆

发表于 2023-4-6 17:55:40 来自手机 | 显示全部楼层
可以试试官方的stm32cubeide

出10入4汤圆

 楼主| 发表于 2023-4-6 18:15:25 | 显示全部楼层
zchong 发表于 2023-4-6 17:51
看看汇编内容,也许能查到一点蛛丝马迹,会不会慢的那个浮点协处理器没开? ...
(引用自8楼)

刚才试了一下连乘
        for(;x<1000000;x++)
        {
                y*=1.1;
        }
vscode下22s左右,keil下面18s左右。
基本耗时是在一个数量级。
看来要好好测试一下那一段算法了。到底哪里差了这么多

出10入4汤圆

 楼主| 发表于 2023-4-6 18:16:39 | 显示全部楼层
zxq6 发表于 2023-4-6 17:55
可以试试官方的stm32cubeide
(引用自9楼)

工程是用的stm32cube自动生成的

出20入30汤圆

发表于 2023-4-6 19:08:37 来自手机 | 显示全部楼层
如果用的M4F内核,涉及到浮点运算,开浮点处理单元与不开的耗时差别是很大的,应该重点检查这部分。

出10入4汤圆

 楼主| 发表于 2023-4-6 19:20:12 | 显示全部楼层
我感觉我找到原因了,fabs函数在vscode这个工程下耗时特别大,这应该就是微库导致的吧。自己试了一下if else写,也是好慢。有没有大佬发我一个优化的函数。我去看看这个微库怎么配置!

出0入442汤圆

发表于 2023-4-6 20:08:47 来自手机 | 显示全部楼层
achild 发表于 2023-4-6 17:31
又是大佬啊。
看了一下,因为不怎么用gcc,没太懂并行编译是什么,是怎么影响的执行效率的。求大佬解惑 ...

(引用自7楼)

所以你说的是在单片机上执行速度不一样。。

(1)开 -O2,(2)库没办法,试一下nano库怎样,(3)自己编译编译器,去掉exception之类的东西,(4)代码里面指定用(float)型,能不用double就不要用,但是注意gcc有个bug,整型转float默认会先转double再转float,这个需要自己去改libgcc.c了。

出0入25汤圆

发表于 2023-4-7 03:39:23 | 显示全部楼层
建议用cmake,生成ninja后编译飞快。

出10入4汤圆

 楼主| 发表于 2023-4-7 09:14:29 | 显示全部楼层
wye11083 发表于 2023-4-6 20:08
所以你说的是在单片机上执行速度不一样。。

(1)开 -O2,(2)库没办法,试一下nano库怎样,(3)自己 ...
(引用自14楼)

好的,我去试一下

出10入4汤圆

 楼主| 发表于 2023-4-7 09:15:26 | 显示全部楼层
cy18 发表于 2023-4-7 03:39
建议用cmake,生成ninja后编译飞快。
(引用自15楼)

和运行速度没关系吧,编译的话,小工程,没什么影响

出0入25汤圆

发表于 2023-4-7 10:35:58 | 显示全部楼层
achild 发表于 2023-4-7 09:15
和运行速度没关系吧,编译的话,小工程,没什么影响
(引用自17楼)


没仔细看帖子- -我以为你说编译速度差很多- -
如果fabs差异很大的话,像是浮点数配置的问题。但你用的硬件浮点数,即使运行库不一样,对速度应该也没啥影响。
mdk跟Makefile都可以看到具体运行的编译命令的,把两个环境下的编译跟链接命令都找出来对比下看看有啥区别。

出0入0汤圆

发表于 2023-4-7 10:51:44 | 显示全部楼层
自己写一个exe程序,替换掉arm-none-eabi-gcc.exe。这个exe什么都不干,就把执行参数打印出来,看看是不是两个编译环境实际的编译参数不一样。

出10入4汤圆

 楼主| 发表于 2023-4-7 15:40:08 | 显示全部楼层
最终问题定位到,当一个float变量跟一个float常数项比大小的时候,特别慢。而并不是fabs的问题。而且不论是一个整形变量跟float常数项比大小或者一个float变量跟一个整形常数项比大小。甚至一个float变量和一个float变量比大小都不会明显的影响速度。比如每次比较之前先定义一个float临时变量然后赋值为float常数项的大小。再去比较就不会出现非常慢的现象了。真的是神奇

出0入0汤圆

发表于 2023-9-13 16:15:43 | 显示全部楼层
这个确实比较神奇
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 04:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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