方案 1:中断优先级的精细化配置
通过严格的中断优先级排序,确保 DMA 相关中断获得足够高的执行优先级:
c
运行
// FreeRTOS环境下的中断优先级配置示例
void nvic_config(void) {
// 配置DMA中断为最高优先级(低于硬件错误中断)
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 1, 0); // 主优先级1
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
// 定时器更新中断次之
HAL_NVIC_SetPriority(TIM2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
// 其他外设中断(如UART)优先级更低
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
// 配置RTOS滴答定时器优先级为最低
HAL_NVIC_SetPriority(SysTick_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY, 0);
}
// 中断服务函数中缩短处理时间
void DMA1_Stream5_IRQHandler(void) {
__disable_irq(); // 临时关闭中断嵌套
// 仅做必要的状态更新和标志设置
if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5)) {
dma_transfer_complete = 1; // 设置完成标志
DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5);
}
__enable_irq();
}
关键原则:
DMA 传输完成中断优先级 > 定时器中断 > 外设中断 > RTOS 调度器中断
避免在 DMA 中断服务程序中执行耗时操作(如内存复制、日志打印)
|