要判断 DMA 中断是否被高优先级中断阻塞,可以通过硬件监测、中断日志分析和代码 instrumentation 等方法,从 “中断响应延迟” 和 “中断抢占关系” 两个维度进行验证。以下是具体实现方案:
一、硬件级监测(最直接的方法)
利用 GPIO 引脚在中断入口 / 出口翻转电平,通过示波器或逻辑分析仪捕捉中断执行时序,直观判断是否被阻塞。
实现步骤:
配置一个空闲 GPIO 引脚(如 PA0),作为中断活动的 “标记线”。
在 DMA 中断服务程序(ISR)中翻转电平:
c
运行
// DMA接收中断处理函数
void DMA1_Channel3_IRQHandler(void)
{
// 进入中断时置高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
// 实际中断处理(调用HAL库回调)
HAL_DMA_IRQHandler(&hdma_usart2_rx);
// 退出中断时置低电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
}
对系统中所有高优先级中断做同样处理(如定时器中断、SPI 中断),使用不同 GPIO 引脚(如 PA1、PA2)。
分析方法:
用示波器同时监测 DMA 中断标记线(PA0)和高优先级中断标记线(如 PA1):
若 PA0 的高电平出现前,PA1 有持续的高电平(超过正常中断处理时间),说明 DMA 中断被该高优先级中断阻塞。
若 DMA 中断的 “进入 - 退出” 时间间隔突然变长,且期间有其他中断标记线的电平变化,表明发生了中断抢占。
|
|