Указатель массива не доступен из прерывания - PullRequest
0 голосов
/ 24 июня 2019

Я определил набор глобальных указателей для предварительной обработки массивов, к которым мне нужно обращаться в прерывании:

uint8_t *spiTxBuffers;

В моем main () я резервирую место и записываю некоторые вещи в массивы:

// reserve space for arrays
spiTxBuffers = (uint8_t *) calloc(max_serial*buffer_size, sizeof(uint8_t));


//     precomputing arrays
uint8_t switching_config[number_cells];
for (int i=0; i <= max_serial; i++) {
    decide_config(i, switching_config, number_cells);
    fill_buffer(switching_config, spiTxBuffers + i * buffer_size, number_cells);
}

После этой проверки с помощью отладчика массивы, похоже, были заполнены правильно.

Теперь, когда я обращаюсь к spiTxBuffers из моего прерывания, массив кажется заполненным мусором, случайными значениями, которые меняются с каждым триггером прерывания.

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance==TIM2) //check if the interrupt comes from TIM2
    {
        uint8_t *pResult;
        pResult = (uint8_t *) calloc(buffer_size, sizeof(uint8_t));
        // bunch of code...
        number_of_serial = round(sinus / avg_voltage);
        // make sure were not assuming more serial then we have
        pResult = spiTxBuffers + (number_of_serial*buffer_size);
        //spi transmit...
  }
}

Когда я определяю и вычисляю массив внутри прерывания, все работает нормально, но я хочу вычислить этот массив только один раз. Любые идеи, как массив может быть испорчен при использовании его в прерывании? Код выполняется на STM32F4 в C.

Edit: Запуск тестового доступа в моем нормальном цикле while дает тот же результат:

test = spiTxBuffers[2];

тест имеет разные значения в каждом цикле. Полное отключение прерывания не меняет этого эффекта.

Отключение DMA ADC решает проблему, я считаю, что массив для цели ADC был слишком мал.

...