Exception Stacking Entry при использовании функции - PullRequest
0 голосов
/ 25 апреля 2019

Я использую STM32F407 с компилятором MikroC. У меня есть код, который, когда я использую функцию, вызывает запись в стеке исключений, но те же строки кода, которые обычно используются, работают нормально.

char *gridVoltage ;
float convertedVolt;

char gridVoltStr[4][10]= {{'0','0','0','0','0','0'},{'0','0','0','0','0','0'},
{'0','0','0','0','0','0'},
{'0','0','0','0','0','0'}};

void getInverterData(){

        gridVoltage = readMeasurementParamaters(2);
        convertedVolt = rebuildFloatVal(gridVoltage);
        FloatToStr(convertedVolt, gridVoltStr[0]);

}

void main() {


      GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_ALL);
      GPIOD_ODR = 0;

      // Configure GPIOC_BASE.2 pins as digital output :
         GPIO_Config(&GPIOC_BASE,  _GPIO_PINMASK_2 ,  _GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);


      UART1_Init(19200);
      Delay_ms(100);
      UART2_Init_Advanced(19200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART2_PD56);
      Delay_ms(100);


      //getInverterData();


      gridVoltage = readMeasurementParamaters(2);
      convertedVolt = rebuildFloatVal(gridVoltage);
      FloatToStr(convertedVolt, gridVoltStr[0]);


      while(1) {
           //  Do stuff
      }

}

Функция readMeasurementParamaters оправдывает отправку данных uart, получает их и возвращает указатель на эти данные. Когда имя функции закомментировано, как показано, оно работает нормально, но включение функции - нет. Этот код будет вызываться несколько раз, поэтому я не могу продолжать переписывать код. Я никогда не видел эту проблему раньше и не уверен, как ее решить. Есть идеи ??

Спасибо.

Редактировать 1:

Так что мне удалось заставить его работать. Функция readMeasurementParamaters (), которая:

char* readMeasurementParamaters(char devAddr){

 float gridVoltage;
 char gridVoltagetxt[15];
 char *rxData;
 int crcOK, crcRx, crcCheck, i;
 char readMeasurementParamsCmd[8] = {0,59,1,32,0,0,0,0};
 readMeasurementParamsCmd[0] = devAddr;

 rxData = requestInverterData(readMeasurementParamsCmd) ;

 crcRx = Crc16(rxData, 0, 6);
 crcCheck = rxData[6]  << 8 | rxData[7] ;

 if(crcRx == crcCheck){
    gridVoltage = rebuildFloatVal(rxData);
    FloatToStr(gridVoltage, gridVoltagetxt);

    UART1_Write_Text("Voltage is:  ");
    for ( i = 0; i < 15; i++ ) {

         UART1_Write(gridVoltagetxt[i]);
         UART1_Write_Text("   ");
    }
    UART1_Write_Text(newline);
    UART1_Write_Text(newline);
 }
 else
    UART1_Write_Text("CRC Error :  ");

 return rxData;

}

Я взял этот код и поместил его в функцию getInverterData () и переименовал некоторые переменные, чтобы получить следующее:

void getInverterData(char devAddr){


float gridVoltage;
char gridVoltagetxt[15];
char *rxData;
int crcOK, crcRx, crcCheck, i;
char readMeasurementParamsCmd[8] = {0,59,1,32,0,0,0,0};
readMeasurementParamsCmd[0] = devAddr;

rxData = requestInverterData(readMeasurementParamsCmd) ;

crcRx = Crc16(rxData, 0, 6);
crcCheck = rxData[6]  << 8 | rxData[7] ;

if(crcRx == crcCheck){
    gridVoltage = rebuildFloatVal(rxData);
    FloatToStr(gridVoltage, gridVoltStr[0]);

    UART1_Write_Text("Voltage is:  ");
    for ( i = 0; i < 15; i++ ) {

         UART1_Write(gridVoltagetxt[i]);
         UART1_Write_Text("   ");
    }
    UART1_Write_Text(newline);
    UART1_Write_Text(newline);
}
else
    UART1_Write_Text("CRC Error :  ");  


}
buildInvDataJsonString();

}

Вероятно, это связано с вложенными функциями. Все еще не совсем уверен, почему это не сработало.

...