精华内容
下载资源
问答
  • 中断嵌套

    2018-04-15 18:42:02
    linux2.4.0内核中断嵌套处理,可能性分析如下: 1,同一中断线:是否可嵌套,取决于ack是否发屏蔽中断线信号给硬件? 可嵌套中断: 场景:[cpu0 A进程 i ii] [cpu1 B进程] ,先i中断执行后执行ii。若有iii,同理...

    linux2.4.0内核中断嵌套处理,可能性分析如下:

    1,同一中断线:是否可嵌套,取决于ack是否发屏蔽中断线信号给硬件?
    可嵌套中断:
    场景:[cpu0 A进程 i ii] [cpu1 B进程] ,先i中断执行后执行ii。若有iii,同理。
    两中断(i及ii)被中断控制器分配到同一核cpu0处理,此时使用的堆栈空间均为A的
    i ii中断嵌套处理使用边缘触发方式,即i在可中断环境 handle_IRQ_event中处理未返回,ii中断进入do_IRQ流程,发现此时i未完成(简单这样理解),不做handle_IRQ_event处理即刻返回,多嵌套同理。返回i中断处理时,判断当前中断线是否有pending,因该场景pending者ii,为保证所有中断都得到处理机会,会触发再遍历处理一次,ii得以处理。

    场景:[cpu0 A进程 i] [cpu1 B进程 ii]
    两中断(i及ii)分别被中断控制器分配到cpu0 cpu1中处理 此时各自使用命中进程的堆栈空间,此时无中断嵌套。

    不可嵌套中断:
    在进入do_IRQ时便ack屏蔽了该中断线,使得同一中断线上中断无法嵌套。
    场景:[cpu0 A进程 i ii] [cpu1 B进程]
    严格串行化处理
    场景:[cpu0 A进程 i] [cpu1 B进程 ii]
    处理等同于可嵌套中断的场景:[cpu0 A进程 i] [cpu1 B进程 ii]

    2,混合中断线:不同中断线定是可以中断嵌套的
    若同线可嵌套:
    场景:[cpu0 A进程 i ii iii] [cpu1 B进程],其中:i ii iii同线。
    i 先中断 后ii中断嵌套 又i与iii中断嵌套
    iii可边缘触发对本端cpu0 ii(未处理直接返回了)的处理。
    场景:[cpu0 A进程 i ii iii] [cpu1 B进程 iiii],其中:i ii iiii同线。
    i 先中断 后ii中断嵌套 又i与iii中断嵌套
    iiii可边缘触发对对端cpu0 ii(未处理直接返回了)的处理。

    若同线不可嵌套:
    场景:[cpu0 A进程 i ii iii] [cpu1 B进程 iiii],其中:i iii iiii同线
    i 先中断 后ii中断嵌套 又ii与iii中断嵌套 iiii最后中断。
    iiii可边缘触发对iii(未处理直接返回了)的处理。
    无所谓对本端cpu中断的边缘触发

    linux2.4.0 vs linux2.6.37(其实2.6以上基本相同了)
    1>、后者只允许不同线的嵌套中断,在检测到来自同一中断线的中断时会发送ack屏蔽该中断线,前者若不管是相同中断线还是不同中断线都允许中断嵌套。引出问题:若存在256中断号,则对于后者来说,极端情况也就被中断嵌套255次,而前者会是无限次。
    2>、前者中断处理占用命中进程的堆栈空间,后者在中断处理时有堆栈环境的切换动作,有独立的中断栈。问题:中断多时前者会出现堆栈溢出。

    展开全文
  • 外部中断是单片机一个比较重要的部分,这次,用最简单的方法让你去实现中断嵌套的功能,通过下面这个小实验,相信你对中断的认识会更加的深刻。如果还对中断这方面不太了解的话,请看这篇文章。 链接: 单片机的外部...
  • linux中断--中断嵌套&中断请求丢失.docx
  • MSP430中断嵌套问题

    2020-08-03 03:04:10
    本文介绍了MSP430单片机中断嵌套相关问题。
  • ARM中断嵌套

    2012-08-22 15:27:47
    ARM中断嵌套简要介绍了在ARM中哪些2处理器可以处理ARM中断嵌套
  • 1. 了解中断嵌套及中断优先级的概念,掌握同时使用定时器中断与外部中断的编程方法。 2. 体验中断对定时器的中断嵌套
  • linux中断--中断嵌套&中断请求丢失.docx
  • 断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记。废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断...
  • 这可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套
  • msp430中断嵌套程序

    2012-08-16 18:38:31
    msp430中断嵌套程序中断嵌套程序中断嵌套程序
  • 基于 STM32 的中断嵌套

    2016-11-30 23:06:17
    基于 STM32 的中断嵌套
  • 单片机外部中断—中断嵌套

    千次阅读 2020-03-26 16:33:46
    51单片机的默认(此时的IP寄存器不做设置)中断优先级为: 外部中断0 > 定时/...这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不是可提供中断嵌套能力的优先级。这种优先级被称为逻辑优先级。

    1.相关的寄存器

    • 中断允许寄存器IE在这里插入图片描述

    1.EA:cpu总中断允许控制位。EA=1,cpu开放中断。
    2.ET0/ET1:定时器T0和定时器T1溢出中断允许位。ET0/ET1=1;允许中断。
    3.EX0/EX1:外部中断0和外部中断1中断允许位。EX0/ET1=1;允许中断。

    • 定时器/计数器控制寄存器TCON
      在这里插入图片描述

    与外部有关的仅仅是后四位,前四位与定时器有关,在这不做描述。
    IE0:外部中断0请求标志,IE0=1外部中断0向cpu请求中断,响应中断后硬件自动清0;
    IE1:外部中断1请求标志,IE0=1外部中断1向cpu请求中断,响应中断后硬件自动清0;
    IT0:外部中断0中断源类型选择位,IT0=0;低电平触发方式。IT0=1;下降沿触发方式。
    IT1:外部中断0中断源类型选择位,IT1=0;低电平触发方式。IT1=1;下降沿触发方式。

    • 中断优先级寄存器IP
      在这里插入图片描述

    PS:串口中断优先级控制位。
    PT1:定时器1中断优先级控制位。
    PX1:外部中断1中断优先级控制位。
    PT0:定时器0中断优先级控制位。
    PX0:外部中断0中断优先级控制位。

    2.外部中断0的使用

    1.简单的通过外部中断控制P0^0口LED灯的亮灭

    sbit led=P0^0;
    void Init0();
    void delayms(unsigned int ms);
    int main()
    {
    	Init0();
    	while(1);
    }
    void delayms(unsigned int ms)//延迟函数
    {
    	int i,j;
    	for(i=0;i<ms;i++)
    	 for(j=100;j>0;j--);
    }
    void Init0()//外部中断0的初始化
    {
    	IT0=1;//选择跳沿触发方式
    	EX0=1;
    	EA=1;
    }
    void Int0() interrupt 0
    {
    	delayms(5);//按键的消抖
    	if(P3^2==0)//外部中断0的管脚在P3^2
    	{
    		led=~led;
    	}
    
    }
    
    

    3.中断优先级的配置

    51单片机的默认(此时的IP寄存器不做设置)中断优先级为:
    外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;
    但这种优先级只是逻辑上的优先级,当同时有几种中断到达时,高优先级中断会先得到服务。这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不是可提供中断嵌套能力的优先级。这种优先级被称为逻辑优先级。[^1]

    要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。


    • 例如:当计数器0中断和外部中断1(优先级 计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
      要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。

    - 设置外部中断1优先级大于外部中断0优先级。实现二级中断嵌套,当执行外部中断0的时候外部中断1能打断外部中断0程序的运行。

    void Init();
    void delayms(unsigned int ms);
    int main()
    {
    	Init();
    	while(1);
    }
    void delayms(unsigned int ms)//延迟函数
    {
    	int i,j;
    	for(i=ms;i>0;i--)
    	 for(j=100;j>0;j--);
    }
    void Init()//外部中断初始化
    {
    	IT0=1;//选择跳沿触发方式
    	EX0=1;//打开外部中断0允许位
    	IT1=1;//选择跳沿触发方式
    	EX1=1;//打开外部中断1允许位
    	EA=1;//打开总中断
        IP=0X01;//设置外部中断0的优先级大于外部中断1
    }
    
    void Int0() interrupt 0 using 0//外部中断0的执行程序。
    { 
    	unsigned char i;
    	delayms(5);
    	if(P3^2==0)
    	{
    		for(i=0;i<8;i++)
    		{
    			P0=~(0x01<<i);
    			delayms(1000);
    		}
    			
    	}
    
    }
    void Int1() interrupt 2 using 1//外部中断1的执行程序。using x代表用那个工作区。
    {
    	unsigned char i;
    	delayms(5);
    	if(P3^3==0)
    	{
    			for(i=8;i>0;i--)
    		{
    			P0=~(0x01<<i);
    			delayms(500);
    		}
    	}
    }
    

    - 外部中断的主要内容

    在这里插入图片描述
    接下来让我们做一个中断嵌套的小练习吧。链接: link.
    如果这篇文章对你有帮助,就点个小♥吧!

    展开全文
  • 本文给大家分享了一个单片机两级中断嵌套的示例C程序。
  • 单片机中断嵌套实验 汇编语言设计 姓名 : 陈志强 班级通信 1401 学校安徽工程大学机电学院 时间 2016.4.6 实验内容 使用一个外部中断和定时器中断通过 P1 口连接的 8 个发光二极管来显示中断的作用 外部中断未发生时...
  • FreeRTOS中断嵌套问题

    千次阅读 2020-01-02 15:40:08
    任务优先级和中断优先级之间经常会出现混淆。中断优先级,即中断服务程序(ISR)相对于彼此执行的优先级。... 支持中断嵌套的端口需要在FreeRTOSConfig.h中定义下表中详细说明的一个或两个常量,configMAX...

        任务优先级和中断优先级之间经常会出现混淆。中断优先级,即中断服务程序(ISR)相对于彼此执行的优先级。分配给任务的优先级与分配给中断的优先级没有任何关系。硬件决定ISR何时执行,而软件决定任务何时执行。响应硬件中断而执行的ISR将中断任务,但是任务无法抢占ISR。

          支持中断嵌套的端口需要在FreeRTOSConfig.h中定义下表中详细说明的一个或两个常量,configMAX_SYSCALL_INTERRUPT_PRIORITY和configMAX_API_CALL_INTERRUPT_PRIORITY都定义相同的属性。较旧的FreeRTOS端口使用configMAX_SYSCALL_INTERRUPT_PRIORITY,较新的FreeRTOS端口使用configMAX_API_CALL_INTERRUPT_PRIORITY。

    常量

    描述

    configMAX_SYSCALL_INTERRUPT_PRIORITY或configMAX_API_CALL_INTERRUPT_PRIORITY

    设置最高的中断优先级,从中可以调用中断安全的FreeRTOS API函数。

     

    configKERNEL_INTERRUPT_PRIORITY

    设置滴答中断使用的中断优先级,并且必须始终将其设置为最低的中断优先级。

     

    如果正在使用的FreeRTOS端口也未使用configMAX_SYSCALL_INTERRUPT_PRIORITY

    常量,那么使用中断安全的FreeRTOS API函数的任何中断也必须以由定义的优先级执行

    configKERNEL_INTERRUPT_PRIORITY。

    每个中断源都有一个数字优先级和一个逻辑优先级:
        1. 数值优先级
        数字优先级只是分配给中断优先级的数字。例如,如果将中断的优先级分配为7,则其数字优先级为7。同样,如果将中断的优先级分配为200,则其数字优先级为200。
        2. 逻辑优先级
        中断的逻辑优先级描述了该中断相对于其他中断的优先级。

        如果两个优先级不同的中断同时发生,则处理器将为两个中断中优先级较高的中断执行ISR,然后再为两个中断中较低优先级的中断执行ISR。
        中断可以中断(嵌套)具有较低逻辑优先级的任何中断,但是中断不能中断(嵌套)具有相同或更高逻辑优先级的任何中断。
    中断的数字优先级和逻辑优先级之间的关系取决于处理器体系结构。在某些处理器上,分配给中断的数字优先级越高,则中断的逻辑优先级越高;而在其他处理器体系结构上,分配给中断的数字优先级越高,则中断的逻辑优先级就越低。
    通过将configMAX_SYSCALL_INTERRUPT_PRIORITY设置为比configKERNEL_INTERRUPT_PRIORITY更高的逻辑中断优先级,可以创建完整的中断嵌套模型,下图显示该模型。

    • 处理器具有七个独特的中断优先级

    • 数值越大,其逻辑优先级越高

    • configKERNEL_INTERRUPT_PRIORITY设置为1

    • configMAX_SYSCALL_INTERRUPT_PRIORITY设置为3

         1. 当内核或应用程序位于关键部分内时,将阻止执行使用优先级1至3(包括1和3)的中断。以这些优先级运行的ISR可以使用中断安全的FreeRTOS API函数。。

         2.使用优先级4或更高优先级的中断不受关键部分的影响,因此调度程序所做的任何事情都不会阻止这些中断立即执行-在硬件本身的限制内。以这些优先级执行的ISR不能使用任何FreeRTOS API函数。

         3.通常,要求非常严格的定时精度的功能(例如,电动机控制)将使用高于configMAX_SYSCALL_INTERRUPT_PRIORITY的优先级,以确保调度程序不会在中断响应时间中引入抖动。


    对于ARM Cortex-M  和ARM GIC 

          Cortex-M处理器上的中断配置令人困惑,并且容易出错。在开发过程中,可以通过FreeRTOS Cortex-M端口会自动检查中断配置,但前提是已定义configASSERT()。

           ARM Cortex内核和ARM通用中断控制器(GIC)使用低优先级数字表示逻辑上高优先级的中断。这似乎违反直觉,并且很容易忘记。如果希望将中断分配为逻辑低优先级,则必须为其分配较高的数值。如果希望将中断分配为逻辑高优先级,则必须为其分配较低的数值。
    Cortex-M中断控制器最多允许使用八位来指定每个中断优先级,使255为最低可能的优先级。零是最高优先级。但是,Cortex-M微控制器通常仅实现八个可能位的子集。实际实现的位数取决于微控制器系列。

    #define __NVIC_PRIO_BITS          2    /*!< Number of Bits used for Priority Levels   

    当仅实现了八个可能位的子集时,仅可以使用字节的最高有效位,而使最低有效位未实现。未实现的位可以取任何值,但是将它们设置为1是正常的。下图显示了二进制文件101的优先级如何存储在实现四个优先级位的Cortex-M微控制器中。

    在上图中,因为未实现最低有效的四位,所以二进制值101已移入最高有效的四位。未实现的位已设置为1。

    1.有的库函数是在将优先级值上移至已实现(最高有效)位后指定优先级值。当使用这种功能时,可以将上图所示的优先级指定为十进制95。十进制95是二进制101向上移四以形成二进制101nnnn(其中“ n”是未实现的位),并且未实现的位设置为1制作二进制1011111。

    2.有些库函数是在将优先级值上移到已实现(最高有效)位之前指定优先级值。当使用这种功能时,必须将上图所示的优先级指定为十进制5。十进制5是二进制101,无任何移位。

    configMAX_SYSCALL_INTERRUPT_PRIORITY和configKERNEL_INTERRUPT_PRIORITY必须以允许将它们直接写入Cortex-M寄存器的方式指定,以便在将优先级值上移至实现的位之后。configKERNEL_INTERRUPT_PRIORITY必须始终设置为最低的中断优先级。可以将未实现的优先级位设置为1,因此无论实际实现了多少个优先级位,常量都可以始终设置为255。

    NOTE:Cortex-M中断的默认优先级为零,即最高优先级。Cortex-M硬件的实现不允许将configMAX_SYSCALL_INTERRUPT_PRIORITY设置为0,因此使用FreeRTOS API的中断的优先级绝不能保持其默认值。

     

     

    展开全文
  • 单片机中断嵌套实验 汇编语言设计 姓名:陈志强 班级通信1401 学校安徽工程大学机电学院 时间2016.4.6 实验内容 使用一个外部中断和定时器中断通过P1口连接的8个发光二极管来显示中断的作用 外部中断未发生时即引脚的...
  • LPC2000中断嵌套

    2011-12-15 12:58:19
    LPC2000系列的中断嵌套的设计,内含部分汇编和C代码
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • AT89X51单片机中断嵌套程序,定时器1与外部中断0相互嵌套
  • 中断嵌套 是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断...

    中断向量:

    中断服务程序的入口地址

    中断嵌套

    是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套

    链接:https://www.nowcoder.com/questionTerminal/2e85847c06684c2faeaf8728f72e5045?toCommentId=426573

    保护现场

    主程序和中断服务子程序都要使用CPU内部寄存器等资源,为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容压入堆栈保护起来,再进入的中断中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场

     

    中断返回:

    由用户编程完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止处理。现场保护是由用户使用PUSH指令来实现的。

    恢复现场

    当中断处理完毕后,用户通过POP指令将保存在堆栈中的各个寄存器的内容弹出,即恢复主程序断点处寄存器的原值。

     

    中断服务

    中断服务是执行中断的主体部分,不同的中断请求,有各自不同的中断服务内容,需要根据中断源所要完成的功能,事先编写相应的中断服务子程序存入内存,等待中断请求响应后调用执行

    https://zhidao.baidu.com/question/552583801.html

    展开全文
  • 在linux内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中断,这时候新的中断会被...
  • Linux内核中断嵌套

    千次阅读 2016-10-30 14:47:36
    假设读者对Linux内核的中断一定的理解,下面来介绍Linux内种的中断嵌套和抢占规则。 1 中断运行过程中的开关情况 在进入硬中断的时候,CPU会自动将硬中断功能关闭;进入软件中断的时候不会关闭中断功能。为了支持...
  • 要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断、定时器中断、中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新(一)寄存器1....
  • 使用中断,就一定会涉及到中断嵌套的处理。下面就来看看28335如何实现中断嵌套。 1,28335默认是禁止中断的。 在进入中断后,CPU默认关全局中断,保存IER,进入ISR,执行完后恢复IER,再开全局中断。 但可通过...
  • STM32中断嵌套实验基于神舟3号开发板

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,500
精华内容 21,800
关键字:

中断嵌套