平台: 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的函数调用开销有这么大,还是有一些另外的开销在里面呢?
楼主可以看看反汇编代码
再对照Cortex-M3的手册察看指令的运行时间。
谢谢!但还是有不解的地方
首先很感谢版主很及时的回贴!
我特意去查看了汇编代码,没有发现有很大的开销在哪里,就是多了一条参数压栈,跳转指令和返回指令属于多余的开销没有其他的不同.
但是为什么会有7个uS的差别呢?7uS在72MHz的主频下应该有好几百条指令的时间才对啊!
难道CORTEX-M3也会有函数调用时发生页面切换的开销吗?
多了很多操作的!
需要传递两个参数, 需要压5个寄存器栈, 调用, 执行,弹栈,返回
而用寄存器时只有执行这个过程!
ST的Lib大可有选择的使用
对于资源占用很小的模块,且速度要求不高,尽量用Lib吧,开发效率和可维护性
对于要求资源占用和速度敏感的模块,尽量自己coding吧,自己知根知底
在Link的时候,链接器会自动抓取user所使用的Lib而不是抓整个Lib
整体而言,STM32的Lib稳定性和可以移植性还是不错的,但某些函数的效率确实
偏低,这也是代码通用性带来的弊病之一吧,两者的折中有要有个平衡点。
学习了
听楼主这么说,用ST的函数库开销大,我们可以自己做库的吧!
:
楼上说的对,函数调用会产生较大的开销,,从指令上来看的话,调用函数的指令数更多,更致命的是,还要清空流水线,这也是额外的开销呀,返回的时候也要清流水线..函数里面的东西越少,相对来讲效率肯定是很低的..