本帖最后由 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
用全局变量的汇编多了不少啊 ,操作完了还要往内存写 ,全局变量真的是 慎用啊 !!!!
|