ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题

发布者:代码漫游者最新更新时间:2018-05-30 来源: eefocus关键字:ARM  Cortex-M4  Cortex-M0+  中断优先级  嵌套抢占 手机看文章 扫描二维码
随时随地手机看文章

  对于中断优先级配置的需求实际上主要体现在系统存在多个可能的中断源情况下,这时为了保证代码的可靠执行,我们不得不考虑很现实的两个问题,一个是如果两个以上中断同时发生,pending请求到CPU,CPU决策该先进哪一个相应的中断服务Routine,第二个问题是CPU当前已经在响应某个中断服务,此时来了另一个中断请求,是否允许其打断当前中断服务转而响应新的中断请求即我们常说的中断嵌套问题,不要告诉我没考虑过哈(如果真是这样,我只能不客气的说,这样搞单片机是不负责任的,很可能给项目带来潜在的风险bug),那样的话俺也白写了,呵呵。那正题来了,对现在红红火火的ARM Cortex-M4和M0+两个核来说,他们是如何解决这两个问题的呢,因为这两个核在中断优先级管理上略有些区别(虽然都是NVIC和SCB两个寄存器来管理),所以下面我分开来说,另外由于中断优先级管理属于内核问题,所以这方面的信息你不会在各大半导体厂家的官方手册中找到,我们只能追根溯源直接到内核的老家ARM官网去找,建议大家有兴趣的到ARM官网把M4和M0+的内核手册下载下来简单瞅瞅,可能会有意想不到的收获哦,呵呵:

ARM Cortex-M0+中断优先级和嵌套

  无论是M0+或者是M4内核,实际上他们两个的中断优先级都是由NVIC和SCB两个寄存器来管理的,在这里我默认大家都知道ARM的中断源分为内核中断和IRQ中断了哈(我怕再细讲下去又没完了,呵呵),而对IRQ的中断管理是由NVIC来主导的,内核的中断管理则是由SCB来主导的,我们先讲IRQ中断的优先级问题(关于中断使能和禁能不在本篇讨论范围内哈),打开M0+的内核手册找到NVIC_IPR寄存器(Interrupt Priority Registers)如下图所示: 
   
  这里写图片描述

  注意观察我高亮标注的几块,从这几块中可以抽象出核心的几个问题,第一个是NVICIPR一共有8个寄存器,而每个寄存器管理4个IRQ中断,乘法口诀算一下,我们就明白了为啥M0+的IRQ中断源最多只支持32个了,再加上16个内核中断,加法口诀再算一下,也就是说M0+最多就是48个中断源,所以M0+算是比较好搞的了,一会儿讲M4就该头疼了,呵呵;第二个问题是优先级寄存器里面的配置值越低表明相应的中断优先级越高;第三个问题是每个PRIxx的8位中只有最高两位[7:6]有效,也就是说实际上M0+的优先级只有四个即0,1,2,3,4,其中0的优先级是最高的;第四个问题,为啥我放到最后说呢,因为这是比较容易忽略的问题,即word-accessible,也就是说这几个寄存器都只能按字操作,切记不要为了显示我们的编程技巧而使用指向字节的指针只对某个单独中断的优先级进行配置。至于嵌套的问题,对M0+是比较简单的,即只要相应中断的优先级比较高即可随时抢占比它优先级低的中断服务。至于内核中断,其中断优先级则由SCB模块的SCB_SHPR寄存器来管理如下图所示,实际上我们平时常用的就是systemtick中断,其优先级配置同NVIC,这里就不赘述了。另外,我这里提一下,即如果我们不对优先级进行配置的话,则默认相应中断源的向量号越低其优先级越高,不过如前面我提到的,我是强烈建议在多中断的情况最好把每个用到的中断优先级都根据实际需求进行相应配置,避免潜在的风险。

  这里写图片描述

ARM Cortex-M4中断优先级和嵌套

  我前面提到一句,M4虽然指令集是向下兼容M0+的,但是在中断优先级管理上是有区别的,由于M4的中断源比较多(最多允许256),所以其对中断优先级管理是略有些复杂的,不过一定要仔细看下去,因为我们平时会比较常用到,但是我敢肯定不是所有人的用法是正确的,为啥?待我下面继续分解(放心,还没完呢,呵呵),先继续上图:

  这里写图片描述  
   
  继续找上图亮点,一个是M4最高支持16+4*60=256个中断源,第二个这60个寄存器是可以按字节操作的(我们可以继续的装逼用指针了,哈哈),第三个跟M0+一样即值越小优先级越高,最后则是最大的区别,即每个寄出去你的8位数据都是可以定义其中断优先级了,说到这里,a question is raised,那是不是意味着M4的优先级最高可以256个级别呢。我只能说,大家想多了,呵呵,继续看下图吧,可见PRIGROUP定义了这8位数据到底该怎么用了,这里出现了两个新名词,即Group Priority和Subpriority,至于这两个优先级是什么意思那大家继续看图2,大家先仔细理解理解,我喝口水先。。。Ok,继续回来,从下面两张图可以看到在M4内核中,其对中断优先级管理是分了两个部分,一个是组优先级一个是子优先级,即组优先级是管理抢占优先级的(即是否能嵌套),即高的组优先级中断(数值低)可以抢占低的组优先级(数值高)中断的,而如果组优先级是一样的,即使子优先级比正在执行的中断的子优先级高也是不能抢占的,那又有同志们要问问题了,那子优先级有啥用?呵呵,正如图2所说,在组优先级一致的情况下,多个中断请求同时发生,这样的情况下子优先级高的可以先执行的,而子优先级低的则只能暂时pending等着了,呵呵。而回到PRIGROUP的作用是用来配置NVIC的8位数据域是如何分配给抢占优先级和子优先级的,而一般情况下,最好是各留4位给这二位大爷和小爷了,即每位爷最多可配16个优先级,而PRIGROUP是从哪来的呢,呵呵,实际上它是SCB_AIRCR寄存器的其中3位如图3所示。

  这里写图片描述

  这里写图片描述

  这里写图片描述

  呼。。。终于搞完了,总算把这个问题给写出来了,我脑袋里可以腾出点地方给其他问题了,哈哈。另外实际上我上面写了这么多理论的东西,但是ARM早已在CMSIS库里的头文件中把这部分函数API给出来了(core_cm4.h和core_cm0plus.h),而我之所以不闲麻烦的还是把这个写出来,还是我这个知其然也要知其所以然的思想在作怪了。不过最后,我还是给出M0+和M4的中断优先级配置的两个配置供广大博友参考吧,然后其他就不多聊了,未完待续:

M0+

NVIC_SetPriority(PORTA_IRQn, 1);

NVIC_SetPriority(PORTB_IRQn, 2);

M4+

NVIC_SetPriorityGrouping(0x03);

NVIC_SetPriority(PORTA_IRQn, NVIC_EncodePriority(0x03,1, 2));

NVIC_SetPriority(PORTB_IRQn, NVIC_EncodePriority(0x03, 2, 2));


关键字:ARM  Cortex-M4  Cortex-M0+  中断优先级  嵌套抢占 引用地址:ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题

上一篇:stm32学习——中断的优先级设置
下一篇:学习笔记——Cortex-M0中断控制和系统控制

推荐阅读最新更新时间:2024-03-16 16:03

ARM7与FPGA相结合在工业控制和故障检测中的应用
  工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。    各部分功能简介   图1为此系统的结构连接框图。如图所示,ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控制总线和故障检测总线相连。 图1 系统结构框图
[嵌入式]
用Eclipse开发stm32(GNU ARM Eclipse Plug-in)(编码+编译+下载+调试)
传统的IDE功能强大,特别是调试功能,但是如今,其它软件的发展,大家感觉到传统的IDE用户交互、编辑界面、编码效率不够友好;或者为了降低成本,需要使用开源工具 于是,有人选择使用IDE用来调试,用其它编辑器编码(比如source insight 、sublime text3、notepad++、atom、Eclipse等),来提高效率;或者使用其它的工具链来配合编辑器达到自制一个IDE的效果 当然还有一些改进得比较好的免费IDE和收费的IDE,比如coocox 这里是在Eclipse上编写 ARM 程序 在Eclipse上编写程序方法: 使用GCC、G++、makefile的方式进行手动编码,一切靠自己 使用Eclipse+插件
[单片机]
用Eclipse开发stm32(GNU <font color='red'>ARM</font> Eclipse Plug-in)(编码+编译+下载+调试)
arm和armel的差异
在Debian 5.0 Lenny Release 后,出现了一个新的名词『armel』,可以在许多ARM toolchain packages身上看到,而armel顾名思义就是针对ARM Architecture的,但与古老的『arm』最大不同在于『armel』的移植是新的ARM EABI,对一些新的ARM processor 特性有着更好的改进和支援,像是改动Floating point、Stack alignment等部份。 此外,因为armel参照着新的EABI Spec去更好地支援一些新ARM processor的特性,对于选用CPU也有些考量和建议。尤其是Thumb interworking的16-bi
[单片机]
ARM微处理器的指令集概述(三)—— .word的含义
_undefined_instruction: .word undefined_instruction ldr pc, _undefined_instruction _undefined_instruction是一个标号,处理到这里时,as会把undefined_instruction的值按16bit的形式放在此标号处。 ldr pc, _undefined_instruction 就是从_undefined_instruction处取值,即undefined_instruction, 并设置到pc中 比如: ldr r1, _rWTCON _rWTCON: .word 0x15300000 是把地址_rWT
[单片机]
评论:为什么ARM与AMD合作有意义?
  ARM有意收购AMD?处理器授权提供商ARM的首席执行官Warren East表示,没有这样的事。   ARM第一季财报创出最高纪录。East表示,在关于第一季业绩的分析师讨论会上,有人向他和首席财务官Tim Score问起AMD,他简单地回答说,长期以来ARM一直想将IP授权给AMD,正如ARM的股东们期望的那样,由于目前AMD正在重新考虑其战略选择,显然促成这件事的“机会增大”。   过去20年里,AMD一直坚持x86处理器架构,但是现在AMD可能抛弃该架构,或至少利用ARM处理器来加强该架构——这听上去似乎是个十分大胆的想法,但是显然有道理。当然,这种事不可能在一夜之间发生。由于AMD的x86处理器在一些应用中根深蒂
[半导体设计/制造]
朱老师ARM裸机学习笔记(六):ARM汇编
汇编指令和伪汇编指令 汇编指令:CPU指令的助记符 伪汇编指令:本质上不是指令,是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码 ARM汇编的特点 ARM汇编的特点1:LDR/STR架构 ARM采用RISC架构,CPU本身不能直接读取内存(CISC结构的可以直接读取内存),而需要先将内存中内容载入CPU中通用寄存器才能被CPU执行。 ldr (load register) 将内存内容加载进入通用寄存器 str (store register) 将寄存器内容存入内存空间 ARM汇编的特点2:8种寻址方式 类别 示例 寄存器寻址 mov r1, r2 立即寻址 mov r0, #0xFF0
[单片机]
朱老师<font color='red'>ARM</font>裸机学习笔记(六):<font color='red'>ARM</font>汇编
ARM指令集与Thumb指令集的区别
一、现在先区分下ARM指令集与Thumb指令集 Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率高 .Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持 ARM 指令集.因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的 ARM 指令集,比如,所有异常自动进入 ARM 状态.在编写 Thumb 指令时,先要使用伪指令 CODE16 声明,而且在 ARM 指令中要使用 BX指令跳转到 Thumb 指令,以切换处理器状态.编写 ARM 指令时,则可使用伪指令 CODE32声明. 流水线处理: 不同
[单片机]
ARM汇编指令集之六——加载/存储指令
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下: 1、LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器, 存储器地址 LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。 指令示例: LDR R0, ;将存储器地址为R1的字
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved