嵌入式3---单片机中断 电子说
一、中断是什么?
中断:CPU 正常执行程序时,外部 / 内部事件触发信号,让 CPU 暂停当前任务,立刻去处理紧急事件,处理完再回到原来的位置继续执行。
二、中断向量表 中断向量表 = 存放所有中断服务函数(ISR)入口地址的一张表
放在 MCU 固定的 Flash 地址(通常是 0x00000000 开始)
每个中断对应一个向量(一个函数指针)
中断触发时,硬件自动查表跳转到对应 ISR
三、中断优先级 当多个中断触发时优先级高的先执行,高抢占优先级会抢占低抢占优先级的cpu资源 在单片机里有两个优先级 1.抢占优先级(Preemption) 高抢占优先级可以打断低抢占优先级 2.子优先级(Subpriority) 抢占优先级相同时,子优先级高的先执行,不能互相打断 3.规则
高抢占优先级 > 低抢占优先级
同抢占优先级:子优先级高先执行
同优先级:硬件固定的序号小的先执行
4. 工程经验
紧急事件(如故障、编码器):高抢占优先级
普通通信(串口、CAN):中等
定时任务、LED:低优先级
四、中断响应流程 中断触发之后的经过 1.完成当前指令 2.保护现场:将当前的CPU寄存器、PC指针压入栈中 3.查找中断向量表:找到对应的服务函数地址 4.执行中断服务函数 5.恢复现场:出栈,回到主程序断点继续执行 五、ISR 中断服务函数编写注意事项 1.快进快出 中断服务函数尽量做到短、快、简单,避免使用耗时函数,如延时,大量循环,打印log等 2.可重入 函数打断后,可以再继续回来执行不会出错 最好不使用全局或者静态变量,不调用不可重入函数(printf,malloc等) 使用全局变量最好做volatile声明 3.共享资源保护 多个中断或者和主程序公用变量时做共享资源保护 如开关中断
// 临界区保护__disable_irq();共享变量 = 1;__enable_irq();4.必须清楚中断标志位 六、总结
中断向量表
存放中断服务函数入口地址的表
硬件自动查表跳转
中断优先级
抢占优先级:决定是否可以嵌套
子优先级:同抢占优先级时决定执行顺序
中断响应流程
停当前指令 → 保护现场 → 查向量表 → 执行 ISR → 恢复现场
ISR 编写规则
快进快出
可重入 (少用全局变量)
清中断标志
共享资源关中断保护
不调用阻塞 / 耗时函数
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !