无法从中断

时间:2019-06-24 10:09:30

标签: c arrays embedded stm

我定义了一组全局指针,以便对中断中需要访问的数组进行一些预先计算:

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

当我在中断内部定义并计算数组时,一切工作正常,但我只想对该数组进行一次计算。有什么想法可以在中断中使用数组时弄乱数组吗?该代码在C语言中的STM32F4上运行。

编辑: 在我的常规while循环中运行测试访问会产生相同的结果:

test = spiTxBuffers[2];

test每个周期具有不同的值。 完全禁用该中断不会改变该效果。

禁用DMA ADC可以解决此问题,我认为ADC目标的阵列太小。

1 个答案:

答案 0 :(得分:0)

  1. 不要在中断中调用calloc。
  2. 制作数组volatile

只需2美分。