[开发工具] 请教: STM32的函数调用到底有多大的开销?

[复制链接]
6312|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个寄存器栈, 调用, 执行,弹栈,返回
而用寄存器时只有执行这个过程!
McuPlayer 发表于 2009-7-5 21:22 | 显示全部楼层

ST的Lib大可有选择的使用

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

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

整体而言,STM32的Lib稳定性和可以移植性还是不错的,但某些函数的效率确实
偏低,这也是代码通用性带来的弊病之一吧,两者的折中有要有个平衡点。
yzl624358 发表于 2009-7-5 22:31 | 显示全部楼层

学习了

听楼主这么说,用ST的函数库开销大,我们可以自己做库的吧!
mylovetus 发表于 2009-7-8 08:30 | 显示全部楼层

其实这个跟库无关的

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

:

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

本版积分规则

16

主题

172

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部