1. ARM DMAC异常处理机制深度解析
在嵌入式系统设计中,DMA控制器(DMAC)作为数据搬运的核心引擎,其异常处理能力直接决定了系统的鲁棒性。ARM DMAC提供了完善的异常检测和处理机制,当数据传输过程中出现异常情况时,能够及时响应并采取相应措施,避免系统陷入不可控状态。
1.1 不精确中止(Imprecise Abort)触发条件
不精确中止是DMAC在无法继续正常执行DMA操作时触发的异常信号,主要发生在以下几种典型场景:
-
AXI总线错误响应:
- 当DMAC通过AXI主接口执行数据加载(DMALD)操作时,如果收到ERROR响应
- 当DMAC通过AXI主接口执行数据存储(DMAST)操作时,如果收到ERROR响应
- 这两种情况通常表明总线传输出现了不可恢复的错误,如地址越界、权限违规等
-
MFIFO缓冲区不足:
- DMA通道线程执行DMALD或DMAST指令时,MFIFO的剩余空间不足以容纳需要传输的数据量
- DMA通道线程执行DMAST指令,但之前未执行足够的DMALD指令来准备数据
- 这种情况通常由于MFIFO大小配置不当或并发DMA请求过多导致
-
资源死锁:
- DMA通道线程因资源饥饿而陷入死锁状态,导致内部看门狗定时器超时
- 这种情况通常发生在多个DMA通道竞争共享资源时
重要提示:DMAC架构设计上无法从中止状态自行恢复,必须依赖外部处理器介入处理。开发者需要提前在系统中设计好相应的异常处理流程。
1.2 看门狗中止(Watchdog Abort)机制
当多个DMA通道程序并发运行时,如果MFIFO的容量无法满足所有通道的存储需求,DMAC可能会陷入死锁状态。为防止这种情况,ARM DMAC内置了看门狗机制来检测和解除死锁。
死锁检测条件(需同时满足):
- 加载队列(Load Queue)为空
- 存储队列(Store Queue)为空
- 所有运行中的通道都无法执行DMALD指令:
- 原因1:MFIFO没有足够的剩余空间
- 原因2:另一个通道持有加载锁(load-lock)
看门狗响应行为取决于WD寄存器中的wd_irq_only位:
- 当wd_irq_only=0时:
- DMAC中止所有导致死锁的DMA通道
- 将irq_abort信号置为高电平
- 当wd_irq_only=1时:
- 仅将irq_abort信号置为高电平
- 不自动中止通道
在实际工程中,建议根据系统需求合理配置看门狗模式。对于可靠性要求高的场景,建议设置为wd_irq_only=0,让DMAC能自动恢复;对于需要保留现场进行调试的场景,可设置为wd_irq_only=1。
1.3 中止处理流程详解
当中止发生时,DMAC会根据线程类型采取不同的处理策略:
1.3.1 DMA通道线程处理流程
-
线程立即进入"Faulting completing"状态,此时DMAC会:
- 置位irq_abort中断信号
- 停止执行该DMA通道的指令
- 使该DMA通道的所有缓存条目失效
- 如果是精确中止,更新CPCn寄存器记录中止指令地址
- 不再为读队列和写队列中的剩余指令生成AXI访问
- 允许当前活跃的AXI事务完成
-
当该DMA通道的所有事务完成后,线程转入"Faulting"状态
-
外部代理(如主处理器)需要执行以下操作来将线程移至"Stopped"状态:
- 在DBGINST0寄存器中编码DMAKILL指令
- 写入DBGCMD寄存器触发指令执行
1.3.2 DMA管理器线程处理流程
- 线程
