每次调用后都会重置全局变量

时间:2017-12-01 12:48:07

标签: c global-variables

在我的项目中,我使用的是全局变量,但它没有按预期工作,因为它每次执行时都会初始化,老实说我不知道​​会发生什么

变量是cookingSignalReceived。

该计划的结构如下:

//File Controller.c: 

while (1)
{
    Controller_Run_State_Machine();
}


void Controller_Run_State_Machine(void)
{
   /* start of activity code */
   Inputs_ReadSensors();
   Comms_CheckReceivedData();
   Controller_UpdateSTM();
}

问题出在Comms文件中:

//File Comms.c

uint8_t cookingSignalReceived = 0;

void Comms_CheckReceivedData(void)
{
   /* start of activity code */
   uint8_t uartDataAvailable = Comms_R_UART0_checkIfDataAvailable();

   if (uartDataAvailable == 1)
   {
      Comms_ParseReceivedCommand();
   }
}

void Comms_ParseReceivedCommand(void)
{
    /* start of activity code */
    /* UserCode{499E2AA6-1F61-4753-9221-77F85E7B5D92}:YjMeKqu95e */
    uint8_t CRC_check_OK = 0;
    uint8_t* buffer;
    /* UserCode{499E2AA6-1F61-4753-9221-77F85E7B5D92} */

    Comms_R_UART0_resetFlag_dataAvailable();
    buffer = Comms_R_UART0_getBuffer();
    CRC_check_OK = Comms_crcCheck(buffer);

    if (CRC_check_OK == 1)
    {
        Comms_processMessage(buffer); //<-- Variable is used in this function
    }
}

全局变量在Comms_processMessage()中使用。问题是每次调用函数时,全局变量都设置为初始值。你觉得这里有什么奇怪的吗?

编辑:

void Comms_processMessage(uint8_t* buffer)
{
    /* UserCode{BCB3B791-2DF9-492b-B53B-6FEB24BD8F77}:eyCoSfmCKb */

    uint8_t message = buffer[0];
    uint8_t param1 = buffer[1];
    uint8_t param2 = buffer[2];


    //---------------------------------------------------------------------
    //                     START COOKING 1ST STEP REQUEST
    //---------------------------------------------------------------------
    if (message == MSG_COOK_1ST && param1 == START_PARAM)
    {
        // Wait for second frame
        cookingSignalReceived = 1;
        #ifdef DEBUG
                R_UART0_Send("Cook 1st step!!", sizeof(char) * 15);
        #endif
    }

    //---------------------------------------------------------------------
    //                     START COOKING 2ND STEP REQUEST
    //---------------------------------------------------------------------
    else if (message == MSG_COOK_2ND && param1 == START_PARAM)
    {
        // Wait for second frame
        if (cookingSignalReceived == 1)
        {
            Controller_signalsBufferEnqueue(cookingSignal);
        }
        #ifdef DEBUG
                R_UART0_Send("Cook 2nd step!!", sizeof(char) * 15);
        #endif
    }

}

请注意,我最初的想法是使用本地静态变量,但我遇到了同样的问题,所以我尝试使用全局变量。

1 个答案:

答案 0 :(得分:0)

在某些情况下,MCU会重新启动,因为无法恢复的错误或错误的硬件设置。这应该是问题!这种MCU行为的原因可能也是糟糕的指针管理。