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

2023-05-16


转自:http://blog.chinaaet.com/jihceng0622/p/5100001238

        坐在上海回北京的高铁上,漫长的旅途着实让人感到无聊(没买到直达的高铁,只能慢悠悠的走一站停一站,晕,都高铁时代了,竟然还这样,想起了大学放假回家站十几个小时绿皮车的时光啊,哈哈),遂有点“写心萌动”,不由感叹——“春”天真是来了,春为啥加引号捏,我相信大家都懂的,哈哈。这样也好,俺又可以慢悠悠的写作抒情了,走着。。。

        其实都搞了这么长时间的ARM开发,关于其至关重要的中断优先级问题我早就想跟大家伙分享分享了,可惜一方面想真正的讲清楚这个问题估计又得大费周章和墨水,另一方面自己越来越忙进一步导致写文章倒是越来越懒了,呵呵。所以趁着坐高铁无聊赶紧撸胳膊抹袖子整吧,不然把这么重要的内容放在自己脑子里封存落灰实在是颇为浪费呀,哈哈。那就不多扯淡了,再多扯火车到站了就尴尬了,咳咳。。。

        对于中断优先级配置的需求实际上主要体现在系统存在多个可能的中断源情况下,这时为了保证代码的可靠执行,我们不得不考虑很现实的两个问题,一个是如果两个以上中断同时发生,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)如下图所示:

image

        注意观察我高亮标注的几块,从这几块中可以抽象出核心的几个问题,第一个是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,这里就不赘述了。另外,我这里提一下,即如果我们不对优先级进行配置的话,则默认相应中断源的向量号越低其优先级越高,不过如前面我提到的,我是强烈建议在多中断的情况最好把每个用到的中断优先级都根据实际需求进行相应配置,避免潜在的风险。

image

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

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

image

        继续找上图亮点,一个是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所示。

image

image

 

image

        呼。。。终于搞完了,总算把这个问题给写出来了,我脑袋里可以腾出点地方给其他问题了,哈哈。另外实际上我上面写了这么多理论的东西,但是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));

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题 的相关文章

随机推荐

  • 即时通讯 3

    即时通讯 3 内容待写
  • HMC5883L 磁力计校准

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v8ie html 这里针对 HMC5883L 磁力计 的校准 xff0c 做一个简单讲解 欢迎交流 xff0c 新浪长沙 64 Wal
  • linux下如何编译c++工程项目

    首先 xff0c 你必须 有一 个Linux开发环境 xff0c 这样才能进行C 43 43 开发 笔者用的是安装在虚拟机中的Ubuntu 9 04 xff0c Ubuntu操作系统是没带C 43 43 编译器g 43 43 在连网的情况下
  • 【ROS程序】 --- 4-1. URDF-GAZEBO 文件介绍

    没人天赋异禀 xff0c 介绍两种实现对比发现 gaze中的urdf文件1 碰撞参数设置2 惯性矩阵设置3 颜色设置 介绍 在前边提过的rviz中 xff0c 只负责整体机器人的建模和运动 xff0c 而在gazebo中集成urdf文件则需
  • 【ROS机器人】 --- 2-2.slam建图保存

    山无拦 海无遮 xff01 前期准备建图I 运行机器人 gazebo II 建图文件编写III 配置rviz并保存1 添加机器人和雷达2 添加TF3 地图map4 保存配置 IV 控制运动建图V 保存地图1 map server2 保存查看
  • 【ROS机器人】 --- 2-4. 路径规划_move_base

    我回来啦 前期准备基础知识1 action通信2 代价地图及组成3 碰撞算法 文件详解及过程I 集成参数的launch文件II 配置文件1 costmap common params yaml2 global costmap params
  • 【ROS机器人】 --- 2-5.自主导航并slam建图

    压线才低头 前期准备基础知识编写launch文件执行流程最后重写launch文件 本节目标 xff1a 加载一张未知地图 xff0c 为机器人设置目标点 机器人会边走路 边建图 最后还可以用map server保存 实现 xff1a 打开g
  • [xdm+ip]ubuntu下载数据慢或者不通

    解决了从官网下载kitti数据集慢的问题 1 改ip 测ping2 更改 etc hosts文件3 使用xdm工具4 配置浏览器和xdm5 使用 环境 ubuntu20 04 问题 从kitti数据集官网下载数据集慢或不通的问题 使用过we
  • 【Docker】--5.docker图形化(享用主机的屏幕)

    心向骄阳万丈光 1 主机操作2 初始化容器3 注意查看效果 docker图形无法显示 网上流传两种方法解决 一种是lightdm 容器初始化好后 另一种是我亲测有用的这种 初始化容器时 1 主机操作 安装 span class token
  • [ros+python]无法rosrun 导入自定义.py文件的python可执行文件

    问题描述 在ROS环境下 自定义a py文件作为模块 被b py引用 rosrun b的时候疯狂报错 not found python文件可以单独用python编译器跑通过 放在rosrun下边就不对 解决办法 删除掉工作空间下之前编译残留
  • 【从kitti开始自动驾驶】--9.1 利用IMU/GPS测距并比较效果(jupyter)

    义勇添青史几段 1 基础知识1 1 角度计算1 2 距离计算 2 python程序编写2 1 大圆距离公式函数2 2 a GPS测距离2 2 b IMU测距离2 3 绘图2 4 效果展示2 5 结论 3 Measure distance源码
  • 【gdb调试器】gdb的调试参数和使用方法

    34 江山不负英雄泪 34 GDB调试器GDB主要功能常用调试命令参数 小例子测试gdb编译生成可执行文件调试查看 GDB调试器 GDB GNU Debugger 是一个用来调试C C 43 43 程序的功能强大的调试器 是linux系统开
  • 磁力计的基本工作原理

    此文详细讲解了 磁力计 的基本工作原理 干扰产生的原因以及如何校准 磁力计与倾角传感器如何结合使用等内容 原文地址 xff1a http www dzsc com data html 2010 11 29 87454 html 电子罗盘是一
  • Linux安装confluence

    一 准备工作 1 安装jdk 在官网下载Linux环境下的jdk1 8 xff1a https www oracle com technetwork java javase downloads jdk8 downloads 2133151
  • [ROS+catkin_make]编译100%后出现 unreference to ...的现象

    问题描述 catkin make编译100 后 突然出现unreference to 的情况 但是能定义过去 即根据VSCODE可以追踪过去问题解决 静态成员变量必须在类外初始化
  • 【linux基础】7.linux系统自定义应用名和应用图标

    34 懦弱之人毫无价值 34 1 做应用和图标1 1 测试和加入侧边栏 3 命令行重命名唤醒 任务叙述 xff1a 有一个x sh文件可以在命令行执行 sh x sh xff0c 这样太麻烦 将其做成app且配上logo xff0c 下次直
  • [Linux基础]8. linux下脚本将pdf转各图片并合成长图

    34 你也有不看星星 34 1 将PDF的每一页转换为图片2 将转换后的多张图片合并为一张长图3 完整脚本 任务叙述 xff1a 已经有一个很长的pdf xff0c 要在linux上用脚本合成一张长图 xff0c 如果由程序完成将PDF转换
  • 【linux网络问题】,ping出现connect问题,知乎(ipv6)能通,百度ipv4通不了

    问题 今天遇到一个很奇怪的事情 xff0c 有线连接的ifconfig中没有ipv4的解析 xff0c 只有ipv6的解析系统是ubuntu20 04及以上nslookup 43 网址的时候发现能访问网络的都是被解析成ipv6的 xff0c
  • 制作树莓派SD卡备份镜像——树莓派系统备份与还原指南

    制作树苺派SD卡备份镜像 树苺派系统备份与还原指南 科技爱好者关注 0 1452016 05 28 22 12 33字数 501阅读 26 658 树莓派使用SD卡来安装系统 xff0c 如果SD卡丢失或者损坏 xff0c 那么树莓派上的数
  • ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题

    转自 xff1a http blog chinaaet com jihceng0622 p 5100001238 坐在上海回北京的高铁上 xff0c 漫长的旅途着实让人感到无聊 xff08 没买到直达的高铁 xff0c 只能慢悠悠的走一站停