2021-10-19

静态变量在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"指令,这样即可提升运行速度,又可避免人机界面刷新闪烁。存储测试次数、累计力值等变量为静态变量,只初始化一次,就可以用它来计算平均值;由于是局部静态变量,可以避免被别处调用及误修改。这就比使用全局变量更安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值