我定义了一组全局指针,以便对中断中需要访问的数组进行一些预先计算:
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目标的阵列太小。
答案 0 :(得分:0)
volatile
只需2美分。