问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

DMA传输优先级与中断优先级:嵌入式系统的协同调度之道

创作时间:
作者:
@小白创作中心

DMA传输优先级与中断优先级:嵌入式系统的协同调度之道

引用
CSDN
1.
https://blog.csdn.net/wwwmy1/article/details/146160837

DMA(直接内存访问)传输优先级和中断优先级是嵌入式系统中两个重要的调度机制。本文通过生动的比喻和具体的代码示例,详细解析了这两个机制的工作原理及其在实际应用中的优化策略,帮助开发者更好地理解和掌握这些核心技术。

DMA传输优先级:快递界的“VIP通道”

想象一下,DMA控制器就像一家快递公司,有8个快递小哥(Stream0-Stream7),但他们接单的优先级各不相同:

// 快递员档案(举个栗子🌰)
快递员 Stream5 = {
    工牌号: 5,
    口头禅: "我是加急单,统统闪开!",
    抢单等级: DMA_PRIORITY_HIGH  // High/Medium/Low
};

抢单规则
等级压制:High > Medium > Low(加急单就是爷)
编号歧视:同等级时,工牌号小的优先(Stream0:“我司元老,懂?”)

举个实战场景:当Stream5(USART收数据,High)和Stream3(ADC采集,High)同时抢单,Stream3凭借“工牌号更小”成功插队!

中断优先级:客服中心的“按闹分配”

数据送完后,快递小哥要打电话通知客户(触发中断)。这时,NVIC客服中心的“接电话规则”就很重要了:

// 客服接单逻辑(伪代码)
void 接电话(中断请求 IRQ) {
    if (IRQ.优先级 > 当前处理的中断.优先级) {
        立刻挂断当前电话,接听新来电;  // 抢占式响应
    } else {
        把新来电丢进等待队列;          // 非抢占式
    }
}

VIP等级表

等级名称 数值范围 现实比喻
--- | --- | ---
至尊VIP 0-3 “老板电话,秒接!”
普通会员 4-7 “等我把奶茶喝完”
路人甲 8-15 “留言信箱请按1”

血的教训:某工程师给ADC中断设了优先级15,结果数据总被USB中断(优先级4)插队,采样数据堆积成山,系统当场崩溃

DMA与中断的“爱恨情仇”

(DMA送完货,客服却拖延通知,数据积压惨案!)

经典翻车现场

// 作死配置代码
HAL_UART_Transmit_DMA(&huart1, data, len);  // DMA跑得飞快(High)
HAL_NVIC_SetPriority(USART1_IRQn, 15, 0);  // 客服在睡大觉(优先级15)
// 结果:数据送完了,但没人处理,缓冲区爆炸💥

黄金拍档公式

// 完美配置模板
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH;  // 快递小哥加急送
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);           // 客服秒接电话

调试黑科技:老司机的“祖传秘籍”

1.症状诊断表

症状 可能病因 药方
--- | --- | ---
数据被“截胡” 中断优先级太低 HAL_NVIC_SetPriority()下猛药
DMA经常“罢工” 忘记喂看门狗🐶 在回调里加__HAL_IWDG_REFRESH()
数据顺序“鬼打墙” 内存地址没对齐 attribute((aligned(4)))安排!

2.炫技操作:双缓冲的“左右互搏”

uint8_t buffer1[256] __attribute__((aligned(4)));  // 强迫症式对齐
uint8_t buffer2[256] __attribute__((aligned(4)));
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    优雅处理(buffer1);    // 处理左半场
    HAL_ADC_Start_DMA(hadc, buffer2, 256); // 右半场无缝衔接
}

(配图:两个缓冲区像乒乓球一样来回切换)

终极拷问:你真的懂优先级吗?

选择题

  1. DMA2_Stream4(High)和DMA1_Stream5(High)同时抢单,谁赢?
    答案:DMA1_Stream5(不同控制器的High互不干涉) DMA1 (默认优先级更高)

  2. 中断优先级0x03和0x05谁更嚣张?
    答案:0x03(数值越小越霸道)

  3. DMA传输完成但回调不触发,首先查什么?
    答案:NVIC中断使能了吗?(别忘
    HAL_NVIC_EnableIRQ()
    !)

总结:优先级的“权力游戏”

在这个数据为王的嵌入式世界里:
DMA传输优先级是“物流总监”,决定数据怎么送
中断优先级是“客服主管”,决定事件怎么处理

记住:
🔑成功法则
让关键任务同时拥有高速通道(DMA High)VIP客服(中断低数值)
你的代码才能像德芙一样纵享丝滑~

现在,拿起你的STM32,开始你的“优先级霸权”之路吧!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号