achild 发表于 2023-4-6 11:49:38

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

在写一个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里面更改的参数。
有没有大佬给点思路啊,是在是不清楚编译原理。

lb0857 发表于 2023-4-6 13:32:05

设置有技巧吗?
vscode+gcc坛友大佬是有推荐 的
优点多多

achild 发表于 2023-4-6 15:22:33

lb0857 发表于 2023-4-6 13:32
设置有技巧吗?
vscode+gcc坛友大佬是有推荐 的
优点多多
(引用自2楼)

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

qwe2231695 发表于 2023-4-6 16:02:44

优化等级一样吗?
速度和优化等级关系最大,其次和微库,gcc版本,I D cache 配置有关。

achild 发表于 2023-4-6 17:00:53

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

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

微库这个是怎么设置啊。

wye11083 发表于 2023-4-6 17:03:01

那个快10倍的应该是并行编译。。。。

achild 发表于 2023-4-6 17:31:33

wye11083 发表于 2023-4-6 17:03
那个快10倍的应该是并行编译。。。。
(引用自6楼)

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

zchong 发表于 2023-4-6 17:51:27

看看汇编内容,也许能查到一点蛛丝马迹,会不会慢的那个浮点协处理器没开?

zxq6 发表于 2023-4-6 17:55:40

可以试试官方的stm32cubeide

achild 发表于 2023-4-6 18:15:25

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

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

achild 发表于 2023-4-6 18:16:39

zxq6 发表于 2023-4-6 17:55
可以试试官方的stm32cubeide
(引用自9楼)

工程是用的stm32cube自动生成的

HXDZ-AAA 发表于 2023-4-6 19:08:37

如果用的M4F内核,涉及到浮点运算,开浮点处理单元与不开的耗时差别是很大的,应该重点检查这部分。

achild 发表于 2023-4-6 19:20:12

我感觉我找到原因了,fabs函数在vscode这个工程下耗时特别大,这应该就是微库导致的吧。自己试了一下if else写,也是好慢。有没有大佬发我一个优化的函数。我去看看这个微库怎么配置!

wye11083 发表于 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了。

cy18 发表于 2023-4-7 03:39:23

建议用cmake,生成ninja后编译飞快。

achild 发表于 2023-4-7 09:14:29

wye11083 发表于 2023-4-6 20:08
所以你说的是在单片机上执行速度不一样。。

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

好的,我去试一下

achild 发表于 2023-4-7 09:15:26

cy18 发表于 2023-4-7 03:39
建议用cmake,生成ninja后编译飞快。
(引用自15楼)

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

cy18 发表于 2023-4-7 10:35:58

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

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

xy3dg12 发表于 2023-4-7 10:51:44

自己写一个exe程序,替换掉arm-none-eabi-gcc.exe。这个exe什么都不干,就把执行参数打印出来,看看是不是两个编译环境实际的编译参数不一样。

achild 发表于 2023-4-7 15:40:08

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

bigharpoon 发表于 2023-9-13 16:15:43

这个确实比较神奇
页: [1]
查看完整版本: stm32工程gcc编译。keil和vscode下为什么执行速度不同?