Я определил набор глобальных указателей для предварительной обработки массивов, к которым мне нужно обращаться в прерывании:
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 был слишком мал.