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

[复制链接]
1744|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 | 显示全部楼层
楼上大神,说的很对
lgq1542380129 发表于 2015-6-11 21:34 | 显示全部楼层
以前知道,尽量少用全局变量,占用内存,计量用函数传递参数(内存不溢出)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

801

帖子

3

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