打印
[STM32F1]

keilmdk 使用全局变量与局部变量程序的执行时间差别?

[复制链接]
1505|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
anvy178|  楼主 | 2015-6-11 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 anvy178 于 2015-6-11 16:20 编辑

      函数主循环什么都不干 ,只是单单点亮LED,关掉LED。
    while (1)
        {
        GPIO_SetBits(GPIOF, GPIO_Pin_6);
        vmsDelay(0x2ffff);
        GPIO_ResetBits(GPIOF, GPIO_Pin_6);
        vmsDelay(0x2ffff);
    }
然后这个延时函数  就这么写的  如下
static void vmsDelay (uint32_t time)
{
      uint32_t  temp   ;   
   for (temp = time ;temp>0;temp--)
    {
        ;
    }
}


如果把这个temp 设置成全局变量的话 ,运行速度好像慢一倍不止(就是看闪灯的间隔) , 为啥?


看了一下 延时函数static void vmsDelay (uint32_t time)的汇编代码 ,用局部变量与用全局变量的区别如下
用局部变量的汇编如下
0x08000A10 4601      MOV      r1,r0
0x08000A12 E000      B        0x08000A16
0x08000A14 1E49      SUBS     r1,r1,#1
0x08000A16 2900      CMP      r1,#0x00
0x08000A18 D1FC      BNE      0x08000A14

用全局变量的汇编如下
0x08000A10 4906      LDR      r1,[pc,#24]  ; @0x08000A2C
0x08000A12 6008      STR      r0,[r1,#0x00]
0x08000A14 E004      B        0x08000A20
0x08000A16 4905      LDR      r1,[pc,#20]  ; @0x08000A2C
0x08000A18 6809      LDR      r1,[r1,#0x00]
0x08000A1A 1E49      SUBS     r1,r1,#1
0x08000A1C 4A03      LDR      r2,[pc,#12]  ; @0x08000A2C
0x08000A1E 6011      STR      r1,[r2,#0x00]
0x08000A20 4902      LDR      r1,[pc,#8]  ; @0x08000A2C
0x08000A22 6809      LDR      r1,[r1,#0x00]
0x08000A24 2900      CMP      r1,#0x00
0x08000A26 D1F6      BNE      0x08000A16

用全局变量的汇编多了不少啊 ,操作完了还要往内存写   ,全局变量真的是 慎用啊 !!!!
沙发
yinhaix| | 2015-6-11 16:05 | 只看该作者
同求,,,,,

使用特权

评论回复
板凳
airwill| | 2015-6-11 20:00 | 只看该作者
楼主很用心。用局部变量,循环才三条指令,全局变量要9条指令,当然比前者慢了很多。
不过你还没有使用代码优化,那么全局变量还有优化的空间,可以提高速度。

总之, 局部变量,可以分配在寄存器里,那么运算起来当然会很快,而且消耗内存也小了。所以也推荐大家尽量使用。不过调试的时候,寄存器的局部变量 Keil 不能显示其值。需要留意一下。

使用特权

评论回复
地板
FireRiver9| | 2015-6-11 21:17 | 只看该作者
楼上大神,说的很对

使用特权

评论回复
5
lgq1542380129| | 2015-6-11 21:34 | 只看该作者
以前知道,尽量少用全局变量,占用内存,计量用函数传递参数(内存不溢出)

使用特权

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

本版积分规则

75

主题

801

帖子

3

粉丝