打印
[开发工具]

请教: STM32的函数调用到底有多大的开销?

[复制链接]
5095|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MYLOVETUS|  楼主 | 2009-7-5 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
平台: IAR5.30 ST-LINK 使用3IN1的板子和STM32的FWLIB.
系统工作于72MHz下,初始化GPIO速度为50MHz,没有开任何的中断.


while (1)
{
    //GPIO_LED->BSRR = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
    GPIO_SetBits(GPIO_LED, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);
    Delay(500);
        
     //GPIO_LED->BRR = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
     GPIO_ResetBits(GPIO_LED, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);
     Delay(500);
}
这样的话,在示波器上测量到的(一个翻转)时间间隔为91uS

while (1)
{
    GPIO_LED->BSRR = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
    //GPIO_SetBits(GPIO_LED, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);
    Delay(500);
        
     GPIO_LED->BRR = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
     //GPIO_ResetBits(GPIO_LED, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);
     Delay(500);
}
如果直接操作寄存器的话,则只需要84uS,足足有7个uS的差别,可是查看FWLIB中的GPIO_SetBits和GPIO_ResetBits却很简单的也只是操作了寄存器而已,
难道STM32的函数调用开销有这么大,还是有一些另外的开销在里面呢?
沙发
香水城| | 2009-7-5 10:49 | 只看该作者

楼主可以看看反汇编代码

再对照Cortex-M3的手册察看指令的运行时间。

使用特权

评论回复
板凳
MYLOVETUS|  楼主 | 2009-7-5 11:03 | 只看该作者

谢谢!但还是有不解的地方

首先很感谢版主很及时的回贴!
我特意去查看了汇编代码,没有发现有很大的开销在哪里,就是多了一条参数压栈,跳转指令和返回指令属于多余的开销没有其他的不同.
但是为什么会有7个uS的差别呢?7uS在72MHz的主频下应该有好几百条指令的时间才对啊!
难道CORTEX-M3也会有函数调用时发生页面切换的开销吗? 

使用特权

评论回复
地板
lianshumou| | 2009-7-5 15:59 | 只看该作者

多了很多操作的!

需要传递两个参数, 需要压5个寄存器栈, 调用, 执行,弹栈,返回
而用寄存器时只有执行这个过程!

使用特权

评论回复
5
McuPlayer| | 2009-7-5 21:22 | 只看该作者

ST的Lib大可有选择的使用

对于资源占用很小的模块,且速度要求不高,尽量用Lib吧,开发效率和可维护性
对于要求资源占用和速度敏感的模块,尽量自己coding吧,自己知根知底

在Link的时候,链接器会自动抓取user所使用的Lib而不是抓整个Lib

整体而言,STM32的Lib稳定性和可以移植性还是不错的,但某些函数的效率确实
偏低,这也是代码通用性带来的弊病之一吧,两者的折中有要有个平衡点。

使用特权

评论回复
6
yzl624358| | 2009-7-5 22:31 | 只看该作者

学习了

听楼主这么说,用ST的函数库开销大,我们可以自己做库的吧!

使用特权

评论回复
7
mylovetus| | 2009-7-8 08:30 | 只看该作者

其实这个跟库无关的

看来没有人真正关心这个问题, 这个问题我觉得根本就不是库的效率问题,因为库里面只是用了一个函数封装一下而已,并没有做其他的什么事情.
而这样,却产生很大的调用开销,我觉得是不是STM32(或者说CORTEX M3)在进行函数调用时会产生很多的不能受控的附加开销!

使用特权

评论回复
8
hotyong| | 2009-7-8 15:01 | 只看该作者

:

楼上说的对,函数调用会产生较大的开销,,从指令上来看的话,调用函数的指令数更多,更致命的是,还要清空流水线,这也是额外的开销呀,返回的时候也要清流水线..函数里面的东西越少,相对来讲效率肯定是很低的..

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

171

帖子

0

粉丝