当一个低抢占优先级的8086中断优先级的8086中断优先级服务函数里有一个死循环时,为什么高抢占优先级的8086中断优先级无法打断

优先级不能中断低优先级死循环_百度知道
优先级不能中断低优先级死循环
为了测试2812的高优先级是否能中断低优先级,在低优先级加了一个死循环。测试结果:高优先级中断是不能打断低优先级死循环而进入高优先级中断运行函数,这是为什么?是优先级设置有问题,还是中断中死循环优先级高于其他?
我有更好的答案
额!这是什么题目啊
为您推荐:
其他类似问题
死循环的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。跟我学51单片机(二):单片机内部定时/计数器和中断系统
我的图书馆
跟我学51单片机(二):单片机内部定时/计数器和中断系统
跟我学51单片机(二):单片机内部定时/计数器和中断系统
 上讲通过讲述用单片机控制一个外部的LED闪烁实验来向读者介绍了单片机的工作原理与开发流程。这一讲将介绍单片机内部非常重要的两个资源——定时/ 计数器和中断系统。通过该讲,读者可以掌握定时器的工作原理和单片机的中断系统。
  从而设计定时器计数程序和中断服务程序。
  一、原理简介
  首先让我们举闹钟为例,将它定时在一分钟后闹铃,这就需要秒针走一圈(60 次)。即一分钟时间转化为秒针走的次数,也就是计数的次数,计数到了60 次然后闹铃,而每一次计数的时间是1 秒。
  单片机内部的定时/ 计数器跟闹钟类似,可以通过编程来设定要定时的时间、定时时间到了进行相应的操作。那么在单片机内部计数一次的时间是多少呢,51 单片机输入的时钟脉冲是由晶体振荡器的输出经12 分频后得到的,所以定时器也可看作是对计算机机器周期的计数器。因为每个机器周期包含12 个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号。故其频率为晶振频率的1/12。如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间刚好为1μs。在本实验套件中采用的是11.0592M 的晶振,故每接收一个输入脉冲的时间约为1.085μs。实现精确定时在实际项目应用中非常重要,因为往往需要用到精确定时一段时间,然后定时时间到的时刻做相应的任务。
  那如何编程实现定时时间呢?首先先简单介绍下本实验板上单片机(STC89C52)内的定时器资源。STC89C52 内有三个定时/ 计数器, 分别为T0、T1 和T2。其中T0、T1 工作方式一样,一并介绍。
  T2 的工作方式稍有区别,这里不做介绍,实验套件光盘中有实际应用程序。同时,单片机中的定时器和计数器是复用的,计数器是记录外部脉冲的个数,而定时器则是由单片机内部时钟提供的一个非常稳定的计数源。本讲中,以T0、T1 作为定时器来进行实例介绍使用。
  了解了单片机内的定时器资源后,接下来我们来对定时器寄存器进行详细介绍。TMOD(见表1)、TCON(见表3)与定时器T0、定时器T1 间通过内部总线及逻辑电路连接,TMOD 用于设置定时器的工作方式,TCON 用于控制定时器的启动、停止,标志定时器的溢出和中断情况。当设置了定时器的工作方式并启动定时器工作后,定时器就按被设定的工作方式独立工作,不再占用CPU 的操作时间,只有在计数器计满溢出时才可能中断CPU 当前的操作。
表1 TMOD寄存器
  表中各位(从左至右为从高位到低位)含义如下。
  TMOD 的低4 位为定时器0 的方式字段,高4位为定时器1 的方式字段,它们的含义完全相同。
  M1 和M0 :工作方式控制位,其定义如表2 所示( 其中i=0,1)。
表2 定时器工作方式控制位
  :功能选择位。=0 时,设置为定时器工作方式;=1 时,设置为计数器工作方式。
  GATE :门控位。当GATE=0 时,软件控制位TR0 或TR1 置1 即可启动定时器。
  TR0 或TR1 置0 即可停止定时器工作;当GATE=1 时,软件控制位TR0 或TR1 需置1,同时还需(P3.2) 或(P3.3) 为高电平方可启动定时器,即允许外部中断启动定时器。
  值得注意的是TMOD 寄存器不能位寻址,只能用字节指令设置高4 位定义定时器1 上的工作方式或低4 位定义定时器0 的工作方式。而且在复位时,TMOD 所有位均置0。
表3 TCON寄存器
  表中各位(从左至右为从高位到低位)含义如下。
  (1) TFl :定时器1 溢出标志位。当定时器1 计满数产生溢出时,由硬件自动置TF1=1, 向CPU发出定时器1 的中断请求,在中断允许时响应。进入中断服务程序后,由硬件自动清0。在中断屏蔽时,TF1 可作查询测试用,此时只能由软件清0。
  (2) TR1 :定时器1 运行控制位。由软件置1 或清0 来启动或关闭定时器1。
  当GATE=l,且为高电平时,TRI 置1 启动定时器l ;当GATE=0 时,TR1 置1 即可启动定时器1。
  (3) TF0 :定时器0 溢出标志位。其功能及操作情况同TF1。
  (4) TR0 :定时器0 运行控制位。其功能及操作情况同TR1。
  (5) IE1 :外部中断1() 请求标志位。
  (6) IT1 :外部中断1 触发方式选择位。
  (7) IE0 :外部中断0( ) 请求标志位。
  (8) IT0 :外部中断0 触发方式选择位。
  值得注意的是TCON 中的低4 位用于控制外部中断,与定时器/ 计数器无关,在以后的讲座中会提及。当系统复位时,TCON 的所有位也均清0。
  在上文中提到定时器溢出和中断,什么是定时器溢出呢?我们可以这样理解:往一个盆中滴水,水滴持续落下,盆中的水持续变满,最终会有一滴水使得盆中的水满了(这相当于计数到最大值)。这个时候如果再有一滴水落下,这时水就会漫出来,这就是“溢出”。当然,水溢出是流到地上,而定时器溢出后将使得TF0 变为“1”。一旦TF0 由0 变成1,就会产生中断。中断就是由于某个事件的发生,CPU 暂停当前正在执行的程序,转而执行处理该事件的一个程序。该程序执行完成后,CPU 接着执行被暂停的程序的这样一个过程。这正如我们本来在做某事,有人过来请求帮忙,我们停下手中的活去帮忙,完事之后回来接着做原来的事情。根据中断引发的不同,或者CPU 响应中断的不同条件,也可以把中断划分为可屏蔽中断(也就是说我们可以拒绝帮别人忙,继续做自己的事情)和不可屏蔽中断(事情做累了,必须休息)两种。
  了解了中断原理之后,我们来看中断允许控制寄存器IE(见表4)和中断优先寄存器IP(见表5)。
表4 IE寄存器
  EA:中断允许总控制位。EA=0,禁止所有中断;EA=1,开放所有中断,但是否允许各中断源的中断请求,还要取决于各中断源的中断允许控制位的状态。这点要注意,初学者往往容易忘了开放所有中断,从而导致没法进入中断源。
  ET2 :时器/ 计数器T2 的中断允许位。
  ES :串行口的中断允许位。
  ET1 :定时器/ 计数器T1 的中断允许位。
  EX1 :外部中断1(INT1) 的中断允许位。
  ET0 :定时器/ 计数器T0 的中断允许位。
  EX0 :外部中断0(INT0) 的中断允许位。
  以上7 个中断允许控制位为0 时,禁止中断,为1 时允许中断。
表5 IP寄存器
  PT2 :定时器/ 计数器T1 中断优先级控制位。
  PS :串行口中断优先级控制位。
  PT1 :定时器/ 计数器T1 中断优先级控制位。
  PX1 :外部中断1 优先级控制位。
  PT0 :定时器/ 计数器T0 中断控制位。
  PX0 :外部中断0 中断优先级控制位。
  以上6 个中断优先级控制位分别为“0”时为低级中断,为“1”时为高级中断。如果几个同一优先级的中断源同时向CPU 申请中断,CPU 通过内部顺序查询逻辑电路,按自然优先级顺序确定该响应哪个中断请求。自然优先级由硬件形成,其优先级别从高到底为外部中断0、定时器/ 计数器T0、外部中断1、定时器/ 计数器T1、串行口中断、定时器/ 计数器T2。
  至此,对定时器控制相关的重要寄存器都介绍完毕了,接下来通过编写程序来进行验证实践。
  二、电路详解
  此讲采用和上讲一样的电路,在此不做赘述(见图1)。
图1 定时器应用实验电路图
  三、程序设计
  定时器0 应用测试程序( 控制D1 闪烁)。
  #i nclude&AT89X52.h& (1)
  #define led P0_0 (2)
  unsigned char count=0; (3)
  void main(void) (4)
  TMOD=0X01; (5)
  TH0=()/256; (6)
  TL0=()%256; (7)
  EA=1; (8)
  ET0=1; (9)
  TR0=1; (10)
  PT0=1; (11)
  while(1) ; (12)
  void timer0(void) interrupt 1 (13)
  TH0=()/256; (14)
  TL0=()%256; (15)
  count++; (16)
  if(count==10) (17)
  count=0; (18)
  led=! (19)
  1. 程序详细说明:
  (1)头文件包含。程序接下来调用的P0_0 就是该头文件中定义好的一个寄存器地址。在对单片机内部的寄存器操作之前,应申明其来处,有兴趣的读者可以看看AT89X52.h 文件中的内容。
  (2)宏定义led,便于直观理解也便于程序修改,将P0_0 口命名为led,这样在程序中就可以用led代替P0_0 口进行操作。
  (3)定义一个8 位的全局变量。
  (4)主函数入口。主函数不传递参数也不返回值。
  (5)设定定时器0 工作在模式1,为16 位的计数器。
  (6)定时器高8 位赋初值。对256 取整。
  (7)定时器低8 位赋初值。对256 取余。
  (8)开总中断。
  (9)开定时器0 中断。
  (10)定时器0 启动,开始计数。
  (11)设置开定时器0 中断为优先中断。
  (12)死循环,等待中断。
  (13)定时器0 中断服务函数入口。
  (14)定时器高8 位赋初值。对256 取整。
  (15)定时器低8 位赋初值。对256 取余。
  (16)对变量count 进行加1 操作。
  (17)如果count 增长到10。
  (18)count 变量清0。
  (19)led 输出取反。
  2. 程序流程图与实验现象
  程序流程如图2 所示。经编译下载程序到单片机内运行后,可以看到实验板上P0_0 口外接的LED 灯有规律的一亮一灭的闪烁见图3。亮灭的时间可以计算为10×5μs=542.5ms。
  实际的时间要比这稍多几个ms,这是因为没有把条件判断和程序调用的指令时间算在内。在要求非常精确的场合,应当实际微调。
图2 主程序和中断服务函数流程图
图3 实验现象效果
  四、总结
  本讲主要介绍了51 单片机内部定时器和中断系统以及编写第一个简单的定时器实验程序。通过该讲,大家可以发现单片机内的定时器和中断系统并不难学,只要记住应用的相关操作步骤多进行几次实践就可以很熟练的掌握这些资源的用法。鉴于本讲的理论内容较多,希望读者多*时间记下或者熟悉。下一讲,将要介绍如果单片机串口通信并给出实例,敬请期待。
[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢单片机、电路板
连接器、接插件
其他元器件
uCOS II在ARM处理器上移植过程中的中断处理
uCOS II在ARM处理器上移植过程中的中断处理
摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA&C)连续时间型滤波器的结构、设计和具体实现,使用外部可编程电路对所设计滤波器带宽进行控制,并利用ADS软件进行电路设计和仿真验证。仿真结果表明,该滤波器带宽的可调范围为1~26 MHz,阻带抑制率大于35 dB,带内波纹小于0.5 dB,采用1.8 V电源,TSMC 0.18&m CMOS工艺库仿真,功耗小于21 mW,频响曲线接近理想状态。关键词:Butte
uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写。总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的CPU上。uCOS II最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore (信号量)、Mailbox (邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,uCOS II公开所有的源代码.并可以免费获得,只对商业应用收取少量License费用。uCOS II移植跟OS_CUP_C.C、OS_CPU_A.S、OS_CPU.H 3个文件有关,中断处理的移植占据了很大一部分内容。作为移植的一个重点,本文以标准中断(IRQ)为例讨论了移植中的中断处理。1 uCOS II系统结构uCOS II的软硬件体系结构如图1。应用程序处于整个系统的顶层.每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。大部分代码是使用ANSI C语言书写的,因此uCOS II的可移植性较好。尽管如此,仍然需要使用C和汇编语言写一些处理器相关的代码。uCOS II的移植需要满足以下要求:1)处理器的C编译器可以产生可重入代码:可以使用C调用进入和退出Critical Code(临界区代码);2)处理器必须支持硬件中断,并且需要一个定时中断源;3)处理器需能容纳一定数据的硬件堆栈;4)处理器需有能在CPU寄存器与内存和堆栈交换数据的指令。移植uCOS II的主要工作就是处理器和编译器相关代码以及BSP(Board Support Package)的编写。uCOS II处理器无关的代码提供uCOS II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信以及创建、删除任务等。2 uCOS II移植过程中需要注意的几个问题uCOS II移植的中断处理跟ARM体系结构和uCOS II处理中断的过程有关,必须注意这2个方面的问题才能高效移植。2.1 ARM 处理器7种操作模式用户模式(USER MODE)是ARM 通常执行状态,用于执行大多数应用程序;快速中断模式(FIQ MODE)支持数据传输或通道处理;中断模式(IRQ MODE)用于通用中断处理;超级用户模式(SVC MODE)是一种操作系统受保护的模式:数据中止模式(ABT MODE)指令预取指中止、数据中止时进入该模式;未定义模式(UND MODE)当执行未定义的指令时进入该模式;系统模式(SYS MODE)是操作系统一种特许的用户模式。除了用户模式之外,其他模式都归为特权模式,特权模式用于中断服务、异常或者访问受保护的资源特权模式中除系统模式之外另5种模式又称为异常模式,在移植过程中必须设置中断向量表来处理异常。uCOS II的移植主要处理标准中断(IRQ)、快速中断(FIQ)和软件中断(SWI)。2.2 uCOS II中断响应的过程以IRQ中断为例,假设CRPS中I_bit位为0,当有IRQ中断时,CPU强制进入IRQ模式,当前的CPSR拷贝到SPSR_irq中,PC值保存在LR_irq中,置CPSR中的I位以关闭IRQ中断。数据保存之后,CPU强行从0X开始执行,PC值保存了OS_CPU_IRQ_ISR()的地址, 然后执行OS_CPU_IRQ_ISR()。在OS_CPU_IRQ_ISR()中OS_CPU_IRQ_ISR_Handler()被调用来检测中断源并执行中断。OS_CPU_IRQ_ISR_Handler()返回以后,OS_CPU_IRQ_ISR()又调用OSIntExit()来确认是否有比ISR优先级更高的任务要执行。如果当前中断任务仍然是优先级最高的任务,OSIntExit()返回,OS_CPU_IRQ_ISR()弹出中断堆栈,如果优先级更高的任务需要执行,OSIntExit()调用OSIntCtxSw()执行优先级更高的任务。2.3 uCOS II的临界段代码uCOS II使用关中断来保护临界代码。它定义了2个宏来开中断(OS_EXIT_CRITICAL()),关中断(OS_ENTER_CRITICAL())。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()有3种方法来实现,uCOS II建议使用第3种方法可以保存当前处理器状态的值。3 uCOS II移植过程中的中断处理uCOS II中断处理跟CRT.S、OS_CPU_A.S和BSP.C有关,其移植过程主要有以下几个步骤。3.1 在CRT.S中设置中断向量表ARM的中断向量表位于ROM 的最底部,其地址范围为0XX0000001C,设置如下:VECTORS:LDR PC,RESET_ADDRLDR PC,UNDEF_ADDRLDR PC,SWI_ADDRLDR PC,PABT_ADDRLDR PC,DABT_ADDRNOP /*保留向量*/LDR PC,IRQ_ADDRLDR PC,FIQ_ADDRRESET_ADDR:. WORD RESET_HANDLERUNDEF_ADDR:.WORD UNDEF—HANDLERSWI_ADDR:.WORD SWI HANDLERPABT_ADDR:.WORD PABT_HANDLERDABT_ADDR:.WORD DABT_ HANDLER.WORD 0 /*保留地址*/IRQ_ADDR:.WORD IRQ_HANDLERFIQ_ADDR:.WORD FIQ HANDLERUNDEF_HANDLER:B UNDEF_HANDLERSWI_HANDLER: B SWI_HANDLERPABT_HANDLER: B PABT_HANDLERDABT_HANDLER: B DABT_HANDLERIRQ_HANDLER: B OS_CPU_IRQ_ISR/*跳转到OS_CPU_IRQ_ISR(在OS_CPU_A.S中)*/FIQ_HANDLER: B OS_CPU_FIQ_ISR/*跳转到OS_CPU_FIQ_ISR(在OS_CPU_A.S中) */这里设置了标准中断异常(IRQ)和快速中断异常(FIQ)的中断入口,其余异常都设置为死循环,当发生这些异常的时候,必须使系统复位才能退出死循环。3.2 移植中断任务切换中断任务切换(OSIntCtxSw)和任务切换函数(OSCtxSw)比较相似,主要有以下几步组成:1)调用OSTask SwHook()2)OSPrioCur=OSPrioHighRdy3)OSTCBCur=OSTCBHighRdy4)SP=OSTCBHighRdy-&OSTCBStkPtr//获取高优先级的任务堆栈指针5)从高优先级的任务的堆栈中弹出高优先级的任务上下文6)执行高优先级的任务
型号/产品名
深圳市福田区新亚洲文佳新电子商行
深圳市赛恒电子科技有限公司
华强电子网测试账号-huangxiaobo21ic官方微信-->
GD32的抢占优先级和响应优先级辨析
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
本帖最后由 sunmeat 于
10:40 编辑
本帖子的框架基于零死角玩转STM32,但是基于GD的内容。里面的截图都来自GD32的数据手册,于STM32无关。
NVIC_Init()函数中NVIC_InitTypeDef结构体的定义如下:
GD32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续执行中断服务函数 A),抢占属性由 NVIC_IRQChannelPreemptionPriority的参数配置。
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由 NVIC_IRQChannelSubPriority的参数配置。
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
例如,现在有三个中断向量:
若内核正在执行 C 的中断服务函数,则它能被抢占优先级更高的中断 A 打断,由于 B 和 C 的抢占优先级相同,所以 C 不能被 B 打断。但如果 B 和 C 中断是同时到达的,内核就会首先响应响应优先级别更高的 B 中断。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
本帖最后由 sunmeat 于
11:20 编辑
在配置优先级的时候,还要注意一个很重要的问题,中断种类的数量。NVIC 只可以配置 16种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个 4 位的数字来决定, 把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。有 5 组分配方式:
****这个分组方式由SCB_AIRC(Application Interrupt and Reset Control 应用中断和复位控制寄存器)这个寄存器决定,准确的说,由这个寄存器中的三位决定。由下图可以看出。
第 0 组: 所有 4 位用来配置抢占优先级,即 NVIC 配置的 24 =16 种中断向量都是只有抢占属性,没有响应属性。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
第 1 组:最高 1 位用来配置抢占优先级,低 3 位用来配置响应优先级。表示有 21=2 种级别的抢占优先级(0 级, 1 级),有 23=8 种响应优先级,即在 16种中断向量之中,有 8 种中断,其抢占优先级都为 0 级,而它们的响应优先级分别为 0~7,其余 8 种中断向量的抢占优先级则都为 1 级,响应优先级别分别为 0~7。
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
第 2 组: 2 位用来配置抢占优先级, 2 位用来配置响应优先级。即 22=4 种抢占优先级, 22=4 种响应优先级。
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
第 3 组:高 3 位用来配置抢占优先级,最低 1 位用来配置响应优先级。即有 8 种抢占优先级, 2 种响应 2 优先级。
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
第 4 组:所有 4 位用来配置响应优先级。即 16 种中断向量具有都不相同的响应优先级。
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
要配置这些优先级组,可以采用库函数 NVIC_PriorityGroupConfig(),可输入的参数为 NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的 5 种分配组。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
高级工程师, 积分 6455, 距离下一级还需 1545 积分
于是,有读者觉得疑惑了,如此强大的GD32,所有 GPIO 都能够配置成外部中断, USART、 ADC 等外设也有中断,而 NVIC 只能配置 16 种中断向量,那在某个工程中使用了超过 16 个的中断怎么办呢?注意 NVIC 能配置的是 16种中断向量,而不是 16个,当工程之中有超过 16 个中断向量时,必然有 2 个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。
资深工程师, 积分 11855, 距离下一级还需 8145 积分
资深工程师, 积分 11855, 距离下一级还需 8145 积分
资深工程师, 积分 11855, 距离下一级还需 8145 积分
资深工程师, 积分 11855, 距离下一级还需 8145 积分
这个就是说优先级的有主从之分的呗。。
扫描二维码,随时随地手机跟帖
湍急之河流
发帖类勋章
技术高手奖章
人才类勋章
时间类勋章
无冕之王奖章
等级类勋章
您需要登录后才可以回帖温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
STM32是中断向量函数NVIC里的优先级怎么设置?NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQC&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;&&// 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;& &// 指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;& &// 指定响如上,NVIC_IRQChannelPreemptionPriority 和 NVIC_IRQChannelSubPriority 两个主要指什么呢?有什么区别,如我把两个中断的 // 指定响应优先级别都设置相同的.会不会冲突呢?它们的值是越大优先级越高还是越小越高呢?&取值范围又是如何的?能不能详细介绍下NVIC中断的设置吗?&( 11:32:41)看了这个有少少明白,但理解不清,如何才算是嵌套?stm32的中断设置优点突出在哪里?STM32(Cortex-M3)中的优先级概念STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。--------------------------------------------------------------------------------Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:&第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:NVIC_PriorityGroup_0 =& 选择第0组NVIC_PriorityGroup_1 =& 选择第1组NVIC_PriorityGroup_2 =& 选择第2组NVIC_PriorityGroup_3 =& 选择第3组NVIC_PriorityGroup_4 =& 选择第4组&接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:// 选择使用优先级分组第1组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);&&// 使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQCNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);&&// 使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQCNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);--------------------------------------------------------------------------------要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。&( 23:39:17)呵呵,进来一看,枫儿应该是很明白了(至少比我要明白)。&( 09:20:08)不是吧..你太虑心了.大家交流一下吧..可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:NVIC_PriorityGroup_0 =& 选择第0组NVIC_PriorityGroup_1 =& 选择第1组NVIC_PriorityGroup_2 =& 选择第2组NVIC_PriorityGroup_3 =& 选择第3组NVIC_PriorityGroup_4 =& 选择第4组\要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;我想问下.这分组是如何的呢?怎才算超出,如分组是4,那么其NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 值不能大于4吗?```应该不会吧? stm32中断源可有许多的哦~~~&( 09:45:21)第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级由上面可知,当选择分组4时,所有4位用于指定抢占式优先级,四位二进制能表示的最大值是什么?请枫儿自已算.它是用来设置中断优先级,与多少个中断无关.在程序中合理按排中断优先级可以达到具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。&( 09:55:20)哈哈,谢谢,我想糊了...2*2*2*2=16它是用来设置中断优先级,与多少个中断无关.在程序中合理按排中断优先级可以达到具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。这个我还想不明白.&( 22:20:00)优先级2正在处理事件,而优先级1这时有事件处理,优先级2暂停,让优先级1立即处理后,优先级2再处理事件;这是抢占优先。优先级2正在处理事件,优先级3排队有事件处理,而优先级1这时有事件处理,等优先级1处理后,优先级2立即处理事件;这是响应优先。&( 22:23:01)优先级2正在处理事件,而优先级1这时有事件处理,优先级2暂停,让优先级1立即处理后,优先级2再处理事件;这是抢占优先。优先级2正在处理事件,优先级3排队有事件处理,而优先级1这时有事件处理,等优先级2处理后,优先级3才处理事件;这是响应优先。&( 10:25:52)没怎么看帖子,不过推荐楼主参考一下“权威指南”那本书很神级,不知道出纸板了没有&( 15:21:06)[i=s] 本帖最后由 xdz 于
15:24 编辑&既然已经设置了先占优先级那么为什么还要再设置响应优先级,老是把这两个弄混。还有就是谁比较理解系统优先级介绍一下。&void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8&&SystemHandlerPreemptionPriority, u8 SystemHandlerSubPriority)&&Handler&&1&&SystemHandler Handler&&SectionSystemHandler&&2&&SystemHandlerPreemptionPriority Handler&&SectionSystemHandlerPreemptionPriority&&3&&SystemHandlerSubPriority Handler&&SectionSystemHandlerSubPriority& && && &SystemHandler Handler Table 308.&Table 308. SystemHandler&NVIC_ VectTab&&SystemHandler_MemoryManage&&Handler 存储器管理SystemHandler_BusFault&&Handler& && && & 总线错误SystemHandler_UsageFault&&Handler& &&&使用错误SystemHandler_SVCall&&SVCall Handler& &SVCallSystemHandler_DebugMonitor&&Handler&&除错监控SystemHandler_PSV&&PSV Handler& && && &&&PSVSystemHandler_SysTick&&Handler& && &&&系统滴答时钟&( 02:01:28)顶一下!!!&( 07:54:55)这个问题总是晕,还没看明白!谁能更详细的介绍一下!&( 09:20:15)如果相同的先占优先级别,就看谁响应优先级优级先,如果响应优先级也相同,就看谁的中断号小。&( 12:55:40)QUOTE:如果相同的先占优先级别,就看谁响应优先级优级先,如果响应优先级也相同,就看谁的中断号小。binglin 发表于
09:20&是不是号小的就优先呢?&( 14:34:58)印象中似乎是小号的有更高的优先权.&( 11:37:52)炳哥哥有没有试过中断优先级啊!我用了两个外部中断,设置了其中一个为先占优先级,在其中一个中断里面设置了死循环,另一个设置成先占优先级,然后触发它就是不进设有先占优先级的那个中断。&( 14:58:18)两个都要设置优先级,一个高一个低再试试。提示:如果死循环那一个不设置,它的默义优先级别多少?&( 16:55:35)这是我设置的两个优先级,也看了不少例子但是实际并不像我们想象的那样。高手们都发表一下自己的看法吧!&/* Enable the EXT5-9 Interrupt on PD.3 */&&NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQC&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&&NVIC_Init(&NVIC_InitStructure);& && &/* Enable the EXTI10-15 Interrupt on PD.3 */&&NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQC&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&&NVIC_Init(&NVIC_InitStructure);&( 18:47:35)当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。当两个中断源抢占式优先级不同时,当正在处理的中断的抢占式优先级比后来的低,则后来的中断将会打断前一个中断处理,先处理后来的抢占式优先级较高的中断。抢占式优先级与响应优先级,抢占式优先级是用于占先即可以中断比它较低抢占式优先级的中断处理过程。而响应优先级只在两个或多个中断源到达时,中断响应时起作用。因此我在13楼的描述是不正确的。&( 21:14:35)长知识了,谢谢了!
阅读(8723)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'STM32中断优先级理解及先占优先级和从优先级(转)',
blogAbstract:'
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 51中断优先级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信