浅谈嵌入式MCU的中断处理

众所周知,一方面,mcu在嵌入式系统中的广泛使用的一个重要原因就是其相对于mpu和通用cpu的时效性优势。而低延迟的外设中断和中断嵌套正是mcu实时性的最大保障。另一方面,在嵌入式系统mcu软件开发中,随着系统功能的日益复杂,不论是否采用rtos,多任务都是不可避免的。在裸奔系统中,为了让时间关键的任务得到最先响应,往往需要通过外设中断嵌套来实现,属于基于外设的硬件中断嵌套,而在rtos中,则给所有系统任务,都赋以具体的优先级,由内核根据优先级高低来进行调度,实际上是实现了一套基于优先级的软件中断嵌套。rtos中的任务软件嵌套通过内核tick定时器中断不断查询rtos任务就绪表中各任务的优先级高低来实现任务切换,其外设硬件中断未必需要嵌套。
本文旨在给大家介绍嵌入式mcu的中断处理相关知识,帮助大家理解中断,并使用好中断。
既然中断嵌套对于嵌入式系统设计如此重要,具体什么是中断嵌套呢?在具体解释中断嵌套之前,有必须要先讲一下嵌入式mcu的中断工作机制和中断优先级:
写过裸奔程序的工程师都知道,一个内核cpu同一个时刻只能执行一个任务/程序代码/指令,比如数据计算,与片上外设进行交互通信等。代码的执行顺序是用户自己首先写好的,cpu逐行取指、译码、执行即可。产品功能的实现就是在main函数的while(1)循环中(常称作主程序),不断的调用其他功能函数实现的。但实际工作环境中、很多事件是随机发生的,比如网络通信,外部io输入等不确定事件,这个时候cpu就不得不放下当前正在执行的工作,却响应这些紧急事件,及时读取网络报文、处理并回复网络通信需求,及时外部io请求。这样的处理就叫做中断。
嵌入式mcu中内核cpu异常和各种外设工作都能够产生响应的中断,且通过中断控制器统一进行管理。这样cpu在中断未产生时就可以专心处理顺序执行的任务,而只有在中断产生时才通过中断控制器中断cpu(通过产生一个高电平/低电平信号给cpu,这个过程被称为中断请求),如果此时cpu全局中断处于使能状态,则cpu会结合中断向量表和中断优先级配置,根据中断优先级高低(如果同时有多个外设中断发生),从中断向量表中取出优先级最高的中断服务程序isr地址,将当前cpu的运行时环境压栈,之后跳转至该中断isr地址运行;若此时cpu全局中断处于关闭状态,则忽略当前中断请求。
下图为典型cpu正常主程序处理流程与外设中断响应的关系图:
s12内核cpu的中断/异常处理流程图如下:
中断响应--中断isr与中断实时性
当中断产生后,中断控制器就会请求内核cpu进行中断响应,其典型的响应就是cpu运行事先准备好的中断isr。
中断isr不同于其他用户软件程序,属于一类特殊的函数,原因入下:
1. 中断isr必须是void型的无参数传递函数--无形参无返回值;
2.中断isr由硬件外设触发,而非其他函数调用,其运行时机具有随机不确定性和硬件实时性
3.中断isr运行时间必须尽量短,以保证外设中断的实时性;
在中断isr中需要完成以下工作:
1. 将引起该中断请求的外设中断标志清除,保证外设不因该中断isr运行而丢失下一次中断,而cpu在中断退出后可以处理其他任务;
2. 处理外设中断事件,典型如定时计数,通信外设rx数据接收或者tx数据buffer填充等;
为了保证中断的实时性,中断isr程序要尽量短,不能条件等待语句甚至将死循环语句放在中断isr内。建议用户一般只把关键处理放在中断isr中,其他相关的一般性工作放在主程序中执行。典型例子如can的数据接收放在can rx 中断isr中,而通过全局变量通知主程序执行相关的诊断协议(如uds)。
中断优先级与中断嵌套
中断优先级是指内核cpu在响应硬件外设中断时的先后顺序,当不同的硬件外设中断产生时,高优先级的外设其中断isr最先被内核执行;
中断嵌套是指在外设中断具有不同的优先级,在cpu响应低优先级中断的时候(也就是运行中断isr时),打开cpu全局中断,如果此时有更高优先级的中断到来,cpu能够停下当前的中断处理区响应优先级高的中断,从而保证高优先级任务外设响应实时性的情况:
一个三级中断优先级嵌套的典型嵌套流程如下所示:
总结一下中断嵌套发生的必要条件:
1.不同的外设中断源必须有不同的优先级
一些mcu的中断优先级时固定不可配置的,如s12g系列mcu,其外设中断优先级固定,中断向量地址越高的优先级越高);而另外一些mcu的中断优先级是可以灵活配置的,如s12xe系列mcu的外设中断具有8个优先级设置和qorivva mpc56xx系列mcu的外设中断有16个优先级可以配置,此类mcu其默认所有外设优先级相同,所以要进行中断嵌套,需要根据外设任务的重要性对相应外设配置不同的优先级;
2. 在中断isr中必须打开cpu全局中断
几乎所有嵌入式mcu的默认在进中断压栈的时候都是关闭cpu全局中断的,也就是默认禁止中断嵌套的,要使能中断嵌套,用户必须在可以被嵌套的外设中断isr中手动打开cpu的全局中断。
下图为s12内核cpu中断压栈过程,压栈ccr寄存器,关闭全局中断的处理,箭头所指红圈中,硬件置位 i-bit(禁止i-bit外设中断)、s-bit(禁止stop低功耗指令)和x-bit(禁止xirq中断)(注:该过程是用户不可控且不可中断的原子操作)
打开全局中断的时机需要根据具体任务来决定,一般建议在中断isr中,清除当前外设中断标志后打开即可。
注意,在一些高级mcu中,比如qorivva mpc56xx和基于arm cortex m4f内核的最先汽车级mcu--s32k系列mcu中还集成了dma,其也可以响应大部分的片上外设中断,这时,外设中断标志就由dma来清除,然后完成外设数据的搬移(无需编写外设中断isr了),从而减少了cpu被外设中断的频次,提高cpu的工作效率。
另外, 通过以上分析结合上一篇分享文章--浅谈嵌入式mcu软件开发之应用工程的堆与栈,嵌入式mcu中断嵌套需要较大的堆栈(stack)消耗,所以嵌入式mcu中断嵌套层数不宜过多,否则容易出现堆栈溢出。

大众在接下来的若干年中,要讲的新故事
Iridium星座的组网能力评价
推荐几款降噪能力不错的蓝牙耳机分享给大家
2020年机房空调规模有望再迎新高突破60亿,同比增长或将达9%以上
拒绝套路、内幕,揭穿不良厂商的蓝牙“残血版”
浅谈嵌入式MCU的中断处理
高交会电子展:纵观全球电子产业局势,把脉细分市场走向
20~40W电子镇流器原理与维修
四维图新出席2023全球数字经济大会 探讨汽车数据安全治理
电路板上电子元件识别及作用
开发定制ASIC过程中的关键技巧
高通首款双模5G芯片即将发布,OPPO新机或将搭载
预计今年华为成5G智能手机销冠,市场份额预计将达27.3%
基于RR的多路分发调用
公共安全:AI功能智盒来保障
情人节必备工具——手机蓝牙灯
2021年的数字存储预测第二部分:磁记录的预测
科创板中微公司副总经理倪图强介绍、履历信息
阿里京东战略布局机器人餐厅
得捷电子将参加2021慕尼黑上海电子展并推出线上活动 莅临N1号展厅1530展位获赠精美礼品