[IC]浅谈嵌入式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中断嵌套层数不宜过多,否则容易出现堆栈溢出。
如果你喜欢本公众号的文章,请点击文章最开始的公众号关注,或者在微信添加朋友-->公众号-->输入"汽车电子expert成长之路"搜索-->点击关注。若对本文观点有任何意见和建议也欢迎留言指出。你的点赞/关注/转发分享是对我辛勤写作的最大支持和肯定!
胡恩伟
NXP汽车电子FAE
2017年7月21日于山城·重庆
[IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套的更多相关文章
- [原创]浅谈如何使用gcc开发NT核心驱动程序
原文链接:[原创]浅谈如何使用gcc开发NT核心驱动程序 一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”的VC来.诚然,用VC 配合 WINDDK 的确工作的不错,但或 ...
- 浅谈OA办公软件市场行情
3.原文:http://www.jiusi.net/detail/472__776__3999__1.html 关键词:oa系统,OA办公软件 浅谈OA办公软件市场行情 中国的OA办公软件市场历经20 ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- Java Native Interface 基于JNI的嵌入式手机软件开发实例
1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...
- 前端工程化的的理解,浅谈web工程化的开发流程
1. 什么是前端工程化 自有前端工程师这个称谓以来,前端的发展可谓是日新月异.相比较已经非常成熟的其他领域,前端虽是后起之秀,但其野蛮生长是其他领域不能比的.虽然前端技术飞快发展,但是前端整体的工程生 ...
- 浅谈MVP架构及开发模式
Model-View-Presenter(MVP)概述 MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成 ...
- 浅谈php对api开发的作用
最近正在做一个手机APP的服务端API开发,虽然是基于Ruby on Rails的,做的也不太专业,不过大致相通,希望能够给你一些启发. 首先,如果是比较简单的手机APP,例如新闻客户端这样的不会涉及 ...
- 浅谈如何使用Netty开发高性能的RPC服务器
如何使用Netty进行RPC服务器的开发,技术原理涉及如下:1.定义RPC请求消息.应答消息结构,里面要包括RPC的接口定义模块,如远程调用的类名.方法名.参数结构.参数值等信息. 2.服务端初始化的 ...
- 浅谈HTML移动Web开发(转)
一.响应式Web设计 PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能征服显示的固定宽度居中显示,后者则采用百分百. 响应式布局意味着媒体查询,响应式web设计并非新的技术, ...
随机推荐
- tomcat关闭异常导致的项目无法重启
有时候 会莫名其妙的,项目启动时候 报tomcat启动异常.重启项目 甚至重启电脑 都没用. 这个时候 ,一般是代码有问题... 这次遇到的问题 就是 引用了外部的jar包,里面有一个自定义异常.但是 ...
- 【Tools】Myeclise-2018.12.0 最新破解文件
Myeclise-2018.12.0 最新破解文件. 最近在写android app登录块,需要用到这个工具,顺手就拿到了,发现资源太少.这里分享给大家. 有币高富帅打赏下载地址: https://d ...
- nginx+consul-template+consul实现自动负载均衡
所需工具:工具 下载地址 本文使用版本consul https://www.consul.io/downloads.html consul_1.0.7_linux_amd64.zipconsul-te ...
- VS2017中使用ObjectARX 2019 wizard的 ArxWizMFCSupport向导出现的bug修复前因后果
VS2017中使用ObjectARX 2019 wizard的 ArxWizMFCSupport向导出现的bug,提示脚本错误. 实际原因类似在arx2012向导的问题,需要修改C:\Program ...
- 最新 识装java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 识装等10家互联网公司的校招Offer,因为某些自身原因最终选择了 识装.6.7月主要是做系统复习.项目复盘.LeetCo ...
- DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布
DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布 Netty(DotNetty)原理解析 一.背景介绍 DotNetty是微软的Azure团队,使用C#实现的Netty的版本 ...
- (转)JVM原理讲解和调优
背景:jvm实际调优在面试时候经常被问到,所以有必要认真总结一番. 转自:JVM原理讲解和调优 四.JVM内存调优 首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存 ...
- 「模拟赛20191019」B 容斥原理+DP计数
题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...
- Django中的admin
1.基本知识 在用Django框架写了一个网站之后,我们添加数据大概有两种方式: 1.在连接的数据库中添加数据 2.登录admin,进入后台添加数据 创建一个Django项目后,我们在url.py中会 ...
- Python中的条件判断、循环以及循环的终止
条件判断 条件语句是用来判断给定条件是否满足,并根据判断所得结果从而决定所要执行的操作,通常的逻辑思路如下图: 单次判断 形式 if <判断条件>: <执行> else: &l ...