STM32中static和extern
今天⽤串⼝通信接收蓝⽛的数据并产⽣中断,发现⼀直卡在某个莫名其妙的启动⽂件上,检查了很多遍多没有发现问题,最后发现问题在接受数据的变量只是局部变量,且没有赋初值,于是,程序只在中断函数运⾏,所以,以后写变量⼀定要初始化,
void USART1_IRQHander(void)
{
static u8 r;
TIM_Cmd(TIM1,DISABLE);//¹Ø±Õ¶¨Ê±Æ÷
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
{
r = USART_ReceiveData(USART1);
USART_SendData(USART1,r);
if(r == 'a')
{
PWMA += 100;
if(PWMA >7199)
{
PWMA = 5000;
}
}
if(r == 'c')
{
PWMA -= 100;
if(PWMA <5000)
{
PWMA = 5000;
}
}
if(r == 'b')
{
PWMB += 100;
if(PWMB >7199)
{
PWMB = 5000;
}
}
while(USART_GetITStatus(USART1,USART_IT_TC) != SET);
}
USART_ClearITPendingBit(USART1,USART_FLAG_TC);
TIM_Cmd(TIM1,ENABLE);//¿ªÆô¶¨Ê±Æ÷
}
  再来说说static与extern
static在函数内部声明变量会使其初始化为0,并且下次调⽤该变量的值时为上次的变量值,但只能在同⽂件内传递变量值,若⽤static声明静态全局变量,这⽤法和静态局部变量⼀致,
extern⽤于对全局变量的声明,通常在头⽂件声明,使全局变量值能在多个⽂件之间传递
⼀下为借鉴的博客内容
1.从作⽤域看:
C++变量根据定义的位置的不同的⽣命周期,具有不同的作⽤域,作⽤域可分为6种:
全局作⽤域,局部作⽤域,语句作⽤域,类作⽤域,命名空间作⽤域和⽂件作⽤域。
1>全局变量具有全局作⽤域。全局变量只需在⼀个源⽂件中定义,就可以作⽤于所有的源⽂件。当然,其他不包含全局变量定义的源⽂件需要⽤extern关键字再次声明这个全局变量。
2>静态局部变量具有局部作⽤域,它只被初始化⼀次,⾃从第⼀次被初始化直到程序运⾏结束都⼀直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,⽽静态局部变量只对定义⾃⼰的函数体始终可见。
3>局部变量也只有局部作⽤域,它是⾃动对象(auto),它在程序运⾏期间不是⼀直存在,⽽是只在函数执⾏期间存在,函数的⼀次调⽤执⾏结束后,变量被撤销,其所占⽤的内存也被收回。
4>静态全局变量也具有全局作⽤域,它与全局变量的区别在于如果程序包含多个⽂件的话,它作⽤于定义它的⽂件⾥,不能作⽤到其它⽂件⾥,即被static关键字修饰过的变量具有⽂件作⽤域。这样即使两个不同的源⽂件都定义了相同名字的静态全局变量,它们也是不同的变量。
2.从分配内存空间看:
1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,⽽局部变量在栈⾥分配空间
2>全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。这两者在存储⽅式上并⽆不同。这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
static修饰的变量1)全局变量、静态全局变量以及静态局部变量都会被放在程序的静态数据存储区(全局可见)中,这样可以在下⼀次调⽤的时候还可以保持原来的赋值。这⼀点是它们与堆变量、堆变量的区别。
2)静态变量(包括静态局部变量和静态全局变量)⽤static告知编译器,⾃⼰仅仅在变量的作⽤范围内可见。这⼀点是它与全局变量的区别。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。因此static这个说明符在不同的地⽅所起的作⽤是不同的。应予以注意。
Tips:
  A.若全局变量仅在单个C⽂件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使⽤访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重⼊问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要⼀个可重⼊的函数,那么,我们⼀定要避免函数中使⽤static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使⽤static变量情况:⽐如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。