转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f17c61f98d6b967b9c819f&chksm=e91245a6de65ccb0758e25c88a9f43f9bd4da57e0b783bd34b0aaa8ce220b81d7f3decb04d4d&mpshare=1&scene=24&srcid=0509ZYDoU7okj7W4JKxeLdmC&key=8da6ecf36bb695ea1394c258413d6c190c76a1e616d9d0e2e2f926ecb8a6927cc232066b5c117df4c6a3f66103e27ab8731d5244b268ea8db0768590c085665c11450834aa8359c5b87396757ac898c4&ascene=1&uin=ODU2NTk0MTA0&devicetype=Windows+7&version=62060739&lang=zh_CN&pass_ticket=ihrPgtqioh4TqFCi6Q3Th7BBCwqw%2FJVjx4Z8FlVdBpFrDtdX3hHuE2A7Jm0fHoLI

关键词:中断工作机制、中断优先级、中断实时性、中断嵌套

引言

众所周知,一方面,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日于山城·重庆

转载于:https://www.cnblogs.com/aaronLinux/p/10854077.html

[IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套相关推荐

  1. 浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解

    内容提要 注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下. 引言 1. S32K1xx系列MCU启动过程详解(startup_S ...

  2. 浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)

    引言 一般工程师都怕研究MCU的startup过程,其原因可能有:1.觉得没有必要,startup的过程和启动代码在新建工程时,并且已经默认加入并配置好,能够保证MCU正常工作,只要关系main()函 ...

  3. 嵌入式开发-浅谈嵌入式MCU开发中的三个常见误区

    浅谈嵌入式MCU开发中的三个常见误区 原创 2017-09-30 胡恩伟 汽车电子expert成长之路 目录 (1)嵌入式MCU与MPU的区分 (2)误区一:MCU的程序都是存储在片上Flash上,然 ...

  4. 浅谈嵌入式与互联网(详细)

    纲要 一.什么叫嵌入式,以及与人工智能的关系? 二.嵌入式岗位 三.浅谈嵌入式开发优缺点 四.与互联网(CS相关的,如平台服务器,前端/APP/软件)对比 五.能力要求和薪资(参考知乎) 以下均采集于 ...

  5. 【嵌入式】嵌入式硬软件开发介绍(个人看法)

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.嵌入式的定义 二.嵌入式硬件开发 1.要求掌握的入门的能力 (1 ...

  6. 浅谈飞控的软件设计(across写的)

    关注across很久了,最近发现了它得CSDN,发现了这篇文章,感觉不错,转载保存. 摘自:https://blog.csdn.net/hz770495569/article/details/8657 ...

  7. 浅谈当前的手机开发技术

    浅谈当前的手机开发技术 作者:陈跃峰 出自:http://blog.csdn.net/mailbomb 随着3G时代的到来,手机软件开发成为了一个热门的软件开发技术,但是由于手机种类等一系列的原因,使 ...

  8. 学嵌入式Linux软件开发需要的知识

    首先,我得声明嵌入式Linux的内核很重要,非常非常重要!但是这个东西如果你没有一定的基础,还是暂时不碰为好.因为想知道它的工作机理,你必须具备N多知识才可以的.弄明白内核(包括驱动和协议栈,以及内核 ...

  9. 浅谈iPhone和iPad开发中的图标设置

    浅谈iPhone和iPad开发中的图标设置 图标大小问题 我们的辛辛苦苦做出来的应用程序在iPhone上的表示仅仅是一个图标,对这个图标不可以不谨慎对待,不能因为大小不对头这些小问题而失真啊什么的. ...

最新文章

  1. Java内存模型深度解析:总结--转
  2. pycharm的中自定义库和关键字_Python“库”在树莓派中的应用解析
  3. ideajava目录显示类成员_c++ 目录操作
  4. bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声*
  5. Java用Java编译
  6. C#基础 基本语法4
  7. 编译安装mysql5.5.39_编译安装MySQL5.5
  8. 《大道至简》第二章读后感
  9. Jconsole/jvisualvm远程监控weblogic中间件配置
  10. 35岁腾讯员工:准备退休!1kw房产+1kw股票+3百万现金,勉强够用了
  11. [转]更改windows 2003远程桌面连接的端口
  12. 字符串格式连接sqlserver数据库的字段概念解释
  13. redis 多进程_Redis 持久化
  14. matlab2014a中输入中文显示不出来,显示的是方框
  15. 蓝桥杯杨辉三角形java
  16. 引用阿里图标库的三种方式——多色图标我选symbol
  17. 地图比例尺与空间分辨率之间的关系_分辨率与比例尺
  18. 17SWFObject使用
  19. element-upload 自定义上传、限制文件大小、格式以及图片尺寸
  20. PHP对接淘宝客api完成APP引流优惠券

热门文章

  1. “次世代”游戏建模技术真的那么火吗?那容易学会吗?如何去学?
  2. 百度图片批量下载助手
  3. Python批量自动下载获取图片
  4. 曙光服务器S640-G30配置管理口图文教程(完整版)
  5. 带你学微信小程序开发
  6. OpenCV C++入门,读取和显示一张图片
  7. 论文阅读:Overview of the NLPCC 2018 Shared Task: Grammatical Error Correction
  8. c语言中三分之一次方怎么表示,2的3次方怎么写
  9. 马斯克被指性骚扰空姐,已支付170万封口费,马一龙:这是他们卑鄙的剧本!...
  10. Linux 用户 quote 配置 说明