静态变量在C语言编程时的应用
如果在声明变量时,如果在前面加一个static,该变量即为静态变量。如:static unsinged int i = 0; 静态变量也有全局静态变量与局部静态变量。静态变量的特点是:一,无论是全局静态变量还是局部静态变量其生命周期与整个程序的生命周期一致。二,静态变量声明时须初始化,即在声明时必须赋予初值,不管是全局静态变量还是局部静态变量,在整个生命周期只初始化一次。在嵌入系统编程时静态变量特别有用,请看下面例子。
void main()
{
GPIOInit(0xFF, 0xFF,BI_IO);
P0 =0xFF;
P1 =0xFF;
P2 =0xFF;
P3 =0xFF;
P4 =0xFF;
P5 =0xFF;
P6 =0xFF;
P7 =0xFF;
//**************************************
EA = 1;
PS = 1;
Usart1Mode(0x01); //8bits variable baud rate
Usart1MulComDisable(); //multip machine communitate disable
Usart1ReceiveEnable();
UsartBaudRateDouble(0); //without double baud rate
Usart1BaudTimer(1);//selsct baud rate timer2
Usart1BaudRateFreDivDis();
Usart1Pin(0x01);//P3.6/RxD_2, P3.7/TxD_2
GPIOInit(GPIO_P3, GPIO_PIN7, PP_OUT); //push_pull out
Usart1IntEnable();//Usart1 interrupt enable
Usart1BaudRate(9600);//configure Usart1 baud rate 9600
Usart1ResetTi();//set TI to 0
Usart1ResetRi();//set TI to 0
TIMER_T2Start();//Timer2 start
SoundBuzzer();
Delay100xms(5,8);
SoundBuzzer();
Delay100xms(5,8);
SoundBuzzer();
Delay100xms(5,8);
Pusle_X = 1;
Pusle_Y = 1;
Pusle_Y = 1;
ME_X = 0; //enable
ME_Y = 0; //enable
ME_Z = 0; //enable
Dir_X = 0;
Dir_Y = 0;
Dir_Z = 0;
while(1)
{
switch(subwayflag)
{
case 0xB0:
IWForce(); //insert/withdrawal force test
break;
case 0xB1:
Durability(); //test connector duarability
break;
case 0xB2:
ContactForec(); //connector contact force test
break;
case 0xB3:
Press(); //work at pressing machine mode
break;
case 0xB4:
Program(); //work at programable mode
break;
}
}
}
这是多功能一个连接器插拔测试机的程序,该机器有多种工作模式,第一次进入各个模式就必须初始化,人机界面。但以后进入就不一定需要初始化,这就可以通过函数局部静态变量来控制。IWForce()函数的代码如下:
//***************************
void IWForce()
{
static ui8 flag = 0;
static f32 fTotalIForce = 0; //total insert force
static f32 fAIForce = 0; //average insert force
static ui16 uiICycle = 0; //total insert cycle
static f32 fTotalWForce = 0; //total withdrawal force
static f32 fAWForce = 0; //average withdrawal force
static ui16 uiWCycle = 0; //total withdrawal cycle
f32 temForce;
if(!flag)
{
flag = 1;
UART1_SendString("page IWForce"); //HMI change to IWForce interface
SendEndMark();
SoundBuzzer();
}
if(receiveDataFlag)
{
receiveDataFlag = 0;
switch(mRdata)
{
case 0xA0:
SoundBuzzer();
break;
case 0xA1: //insert force test
SoundBuzzer();
Insert();
temForce = GetForce();
fTotalIForce = fTotalIForce + temForce;
++uiICycle;
fTotalIForce = fTotalIForce / uiICycle;
displayInsertForceTestRes();
break;
case 0xA2: //withdrawal force test
SoundBuzzer();
Withdrawal();
temForce = GetForce();
fTotalWForce = fTotalWForce + temForce;
++uiWCycle;
fTotalIForce = fTotalIForce / uiWCycle;
displayWithdrawTestRes();
break;
case 0xA3: //X axis lock
SoundBuzzer();
ME_X = 0;
break;
case 0xA4: // X axis unlock
SoundBuzzer();
ME_X = 1;
break;
case 0xA5: //Y axis lock
SoundBuzzer();
ME_Y = 0;
break;
case 0xA6: //Y axis unlock
SoundBuzzer();
ME_Y = 1;
break;
case 0xA7: // X axis go to origin
SoundBuzzer();
X2origin();
break;
case 0xA8: // Y axis go to origin
SoundBuzzer();
Y2origin();
break;
case 0xA9: // Z axis go to origin
SoundBuzzer();
Z2origin();
break;
case 0xB1: // go to Durability()
SoundBuzzer();
subwayflag = 0xB1;
break;
case 0xB2: // go to ContactForec()
SoundBuzzer();
subwayflag = 0xB2;
break;
case 0xB3: // go to Press()
SoundBuzzer();
subwayflag = 0xB3;
break;
}
mRdata = 0; //重置指令接收变量
}
If(subwayflag!=0xB0)
Flag = 0;
}
//End of IWForce()
从上面代码可以看出,由于以静态变量flag作为进入IWForce的标志,当subwayflag 维持0xB0值时,主程序再次调用IWForce(),单片就不会给人机界面发送"page IWForce"指令,这样即可提升运行速度,又可避免人机界面刷新闪烁。存储测试次数、累计力值等变量为静态变量,只初始化一次,就可以用它来计算平均值;由于是局部静态变量,可以避免被别处调用及误修改。这就比使用全局变量更安全。