LPC1768\1769之中断优先级与中断优先级组
一、背景
USB在持续通信几十万次后,会出现USB IN中断丢失几次的情况,分析是中断优先级不够高,导
致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中
断默认为最高优先级""(数字越低,优先级越高),因此能想到的第一个解决办法既是降低除USB外所
有中断的优先级。
本篇即对LPC1769的中断优先级及优先级分组做个概述。
附:LPC1768/LPC1769除支持最高主频不同外,其他暂时没发现有什么差别。 二、正文
首先,说说中断优先级,所有中断均有一个优先级,
、 更低的优先级数字代表着更高优先级
、 除了RESET, Hard fault, NMI等系统级中断,其他所有中断优先级均可配置为"0~31"。
如果软件没有配置这些中断的优先级,那么所有中断的优先级默认为最高优先级""。此处
实例说明这个中断优先级的概念,假设三个外部中断"A,B,C","A,B"配置为"","C"配置为"",
、 如果三个中断同时产生,那么"A,B"中断优先"C"中断运行。
、 "A,B"中断同时产生,谁更优先执行呢?那就根据中断向量表的排号,低的优先执行。
、 若是"C"的中断正在运行,此时"A"的中断发生,那么"A"的中断会抢占"C"的执行权限,优先
执行。
、 若是"A"的中断正在运行,此时"B"的中断发生,那么新产生的"B"中断会进入等待状态,等
待"A"执行完毕再执行。
以上,只是单纯的判断优先级值来控制中断的顺序,为了增强中断的控制逻辑,ARM新增了优先级
组的概念。即相同的优先级等级可以分配在一组优先级内,在这一组优先级内再来定义次优先级,具
体是怎么一个概念呢?还是假设有四个中断"A,B,C,D","A,B,C"配置在优先级组""内,"A,B"中断配
置次优先级"","C"配置为次优先级"","D"则配置为优先级组""
、 若"A,D"中断同时产生,则优先级高的"A"会优于"D"中断执行。
、 若"A,C"中断同时产生,则优先级次优先级高的"A"会优先执行。
、 若"A,B"中断同时产生,则根据中断向量表的位置,排号低的优先执行。
、 若"D"正在执行中断,此时"A"中断来了,那么"A"中断会抢占"D"中断优先执行。因为"A"所
在的优先级组高于"D"。
、 若"C"正在执行中断,此时"A"中断来了,那么"A"中断会等待"C"执行完毕再执行。因为属于
同一优先级组。
ARM用了一个8位寄存器来定义优先级组和次优先级的概念。中间可以选择一个端点,高位表示有
多少个主优先级,低位表示有多少个次优先级。
而LPC1769只用了其中5位。具体如下图:

**********************************************************************************

以上图的1768选定的端点为例,上图表示有"2^3=8"个优先级组,因为高三位用来定义优先级
组,同理,低二位用来定义次优先级有"2^2=4"个。
接着用实例来解释:
在LPC1769提供的"core_cm3.h"提供了定义优先级组和次优先级的函数。
定义优先级组函数:
__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
// PriorityGroup参数按上文所写,由于LPC1769只用了5位,所以传入的参数范围为"2~7"
// 对应的优先级组与次优先级如下图

// 我选择的优先级组为8个,次优先级为4个。代码如下:
NVIC_SetPriorityGrouping(0x04);
接着,定义次优先级函数:
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
// 参数IRQn代表中断向量值,该值定义在文件"LPC17xx.h"内
/** @brief IRQ interrupt source definition */
typedef enum IRQn
{
/****** Cortex-M3 Processor Exceptions Numbers ********************/
...
Reset_IRQn = -,
... /****** LPC17xx Specific Interrupt Numbers *************************/ ...
USB_IRQn = ,
...
} IRQn_Type;
// 参数priority
// 代表中断优先级值,范围还是为"0~31",因此需要我们自己算好优先级组所处的位置
// 以我定义的8个优先级组来说,那么值"0~3"为优先级组"0",..."28~31"为优先级组"7"。
NVIC_SetPriority(USB_IRQn,); //处于优先级组"0"
NVIC_SetPriority(TIMER0_IRQn,); // 处于优先级组"1" 至此,记录完毕。 记录时间:--
记录地点:深圳WZ
LPC1768\1769之中断优先级与中断优先级组的更多相关文章
- LPC1768/1769之CAN控制器概述(附库函数下载地址)
一.背景: 使用LPC1769来做CAN的收发,在此对使用LPC1769的CAN控制器进行收发做个总结和记录,以备下 次开发快速上手使用. 附:LPC1768/1769除了支持最高频率不同以外,其它基 ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
- MCS-51系统中断优先级的软扩展
摘要:鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法.其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现:以C51的形式,给出这种扩 ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- FreeRTOS笔记
任务的创建和删除(静态方法) 任务创建后要开启调度器. FreeRTOSConfig.h 1. 改宏 使能静态创建函数. 会出现,有两个函数未定义. Cortex-M中断管理(上) NVIC:嵌套向量 ...
- stm32f103的低功耗开启和关闭
stm32f103低功耗分为WFI等待中断和WFE等待事件,我只用到等待中断,这里没有细究. 待机模式最低功耗2uA,只有备份寄存器和待机电路供电,PLL,HSI,HSE断开,寄存器和SRAM复位,除 ...
- FreeRTOS相关转载-(朱工的专栏)
FreeRTOS系列第1篇---为什么选择FreeRTOS? 1.为什么学习RTOS? 作为基于ARM7.Cortex-M3硬件开发的嵌入式工程师,我一直反对使用RTOS.不仅因为不恰当的使用RTOS ...
- FreeRTOS初步认识
源:FreeRTOS初步认识 用了半天时间对FreeRTOS有了一个初步的认识,大概总结一下,其中混杂了系统实现和实际应用方面的问题. 现只是以应用为目的,实现方面待以后进一步研究. 1.FreeRT ...
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
随机推荐
- 【原】移动web资源整理
2013年初接触移动端,简单做下总结,首先了解下移动web带来的问题 设备更新换代快——低端机遗留下问题.高端机带来新挑战 浏览器厂商不统一——兼容问题多 网络更复杂——弱网络,页面打开慢 低端机性能 ...
- MySQL复制环境(主从/主主)部署总结性梳理
Mysql复制概念说明Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves) ...
- 【IScroll深入学习】解决IScroll疑难杂症
前言 在去年,我们对IScroll的源码进行了学习,并且分离出了一段代码自己使用,在使用学习过程中发现几个致命问题: ① 光标移位 ② 文本框找不到(先让文本框获取焦点,再滑动一下,输入文字便可重现) ...
- JSP九大内置对象及四个作用域
九大对象: 内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用 1-out: javax.servlet.jsp.JspWriter类型,代表输出流的对象.作用 ...
- 大众点评cat系统的搭建笔记
项目地址:https://github.com/dianping/cat 编译步骤: 这个项目比较另类,把编译需要的jar包,单独放在git分支mvn-repo里了,而且官方文档里给了一个错误的命令提 ...
- 基于C/S架构的3D对战网络游戏C++框架_03服务器端详细设计
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- C语言中函数的传入值与传出值
看到一个函数的原型后,怎么样一眼看出来哪个参数做输入哪个做输出? 函数传参如果传的是普通变量(不是指针)那肯定是输入型参数: 如果传指针就有 2 种可能性了,为了区别,经常的做法是: 如果这个参数是做 ...
- Redis设计与实现读书笔记(一) SDS
作为redis最基础的底层数据结构之一,SDS提供了许多C风格字符串所不具备的功能,为之后redis内存管理提供了许多方便.它们分别是: 二进制安全 减少字符串长度获取时间复杂度 杜绝字符串溢出 减少 ...
- Keepalived的全局配置
Keepalived的全局配置 默认配置文件如下: ! Configuration File for keepalived global_defs { notification_email { aca ...
- 因为多余jar包,所报的错
今天,将项目部署到服务器时,出现了上述的错误.于是就开始找度娘了,找啊找,将项目里面的东西翻来覆去的改,不见效果,还多了些莫名其妙的错,当时就懵逼了.在百度上找到的方法都是说有jar包重复,项目里面的 ...