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

guoyaru123   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的函数调用开销有这么大,还是有一些另外的开销在里面呢?

回复评论 (6)

楼主可以看看反汇编代码

                                 再对照Cortex-M3的手册察看指令的运行时间。
点赞  2009-7-5 10:49

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

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

多了很多操作的!

需要传递两个参数, 需要压5个寄存器栈, 调用, 执行,弹栈,返回
而用寄存器时只有执行这个过程!
点赞  2009-7-5 15:59

ST的Lib大可有选择的使用

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

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

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

学习了

                                 听楼主这么说,用ST的函数库开销大,我们可以自己做库的吧!
点赞  2009-7-5 22:31

:

                                 楼上说的对,函数调用会产生较大的开销,,从指令上来看的话,调用函数的指令数更多,更致命的是,还要清空流水线,这也是额外的开销呀,返回的时候也要清流水线..函数里面的东西越少,相对来讲效率肯定是很低的..
点赞  2009-7-8 15:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复