2017-12-01 1 views
0

내 프로젝트에서 전역 변수를 사용하고 있지만 실행될 때마다 초기화되고 무엇이 계속 될지 모르기 때문에 솔직하게 예상대로 작동하지 않습니다.각 호출 이후에 전역 변수 재설정 중임

변수는 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(); 
} 

문제는 컴즈 파일 안에 :

//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 
    } 

} 

참고.

답변

0

경우에 따라 MCU가 복구 할 수없는 오류 또는 하드웨어 설정 불량으로 인해 다시 시작되는 경우가 있습니다. 이것은 문제가되어야합니다! 이 MCU 동작의 원인은 잘못된 포인터 관리 일 수도 있습니다.

관련 문제