在线时间218 小时
UID2100041
ST金币0
蝴蝶豆0
注册时间2014-6-8
金牌会员
- 最后登录
- 2020-12-6
|
a0a.1 32b0c
今天运行了一段自己写的一个程序,代码如下,- /**
- * @brief Test
- * @param None
- * @retval None
- */
- uint8_t Test(void)
- {
- uint8_t Dummy_HALL_State=1;
-
- if(Dummy_HALL_State==1)
- {
- Delay();
- Dummy_HALL_State=0;
- }
- else if(Dummy_HALL_State==0)
- {
- Delay();
- Dummy_HALL_State=2;
- }
- else if(Dummy_HALL_State==2)
- {
- Delay();
- Dummy_HALL_State=3;
- }
- else if(Dummy_HALL_State==3)
- {
- Delay();
- Dummy_HALL_State=1;
- }
- return Dummy_HALL_State;
- }
复制代码 发现运行不正常,结果在else if中打断点,程序执行不到else if里面,后来把uint8_t Dummy_HALL_State=1;放到函数外面,程序运行正常,代码如下:
- /**
- * @brief Test
- * @param None
- * @retval None
- */
- uint8_t Dummy_HALL_State=1;
- uint8_t Test(void)
- {
- if(Dummy_HALL_State==1)
- {
- Delay();
- Dummy_HALL_State=0;
- }
- else if(Dummy_HALL_State==0)
- {
- Delay();
- Dummy_HALL_State=2;
- }
- else if(Dummy_HALL_State==2)
- {
- Delay();
- Dummy_HALL_State=3;
- }
- else if(Dummy_HALL_State==3)
- {
- Delay();
- Dummy_HALL_State=1;
- }
- return Dummy_HALL_State;
- }
复制代码 和高手讨论发现,在函数内部定义变量时,变量为临时的,是动态变量。每次调用函数的时候局部变量每次分配的地址不一样。程序在每一次执行到函数Test();时,都会为Dummy_HALL_State在栈中分配一个临时地址,并且每次都会为执行uint8_t Dummy_HALL_State=1;这样,每次进入函数Tese();时变量Dummy_HALL_State都为1,所以在上述函数中只执行if后面的语句,不执行else if后面的语句。
而如果将uint8_ Dummy_HALL_State=1;放入函数外部,变量就是全局变量,系统会在静态存储区,为变量分配一个固定的存储空间,这样每次执行函数Test();时,都会去那个固定的存储空间读取Dummy_HALL_State变量的值,下次再执行Test();用的Dummy_HALL_State值,是上一次保存的值,这样函数功能就正常了。
如果非要把Dummy_HALL_State定义在函数内部,就用到static这个关键字了,将语句static uint8_t Dummy_HALL_State=1;放入子函数内部开头,变量Dummy_HALL_State就变为静态局部变量,这样编译器会为变量分配一个静态存储空间,在每次调用子函数的时候,就不会每次都为变量赋值了,而是用变量所占的静态存储空间内的值了。这样程序也就正常了。
static的作用之一就是为局部变量分配一个静态的存储空间。
|
|