精华内容
下载资源
问答
  •  在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。  中断处理过程:一次完整的中断过程由中断请求、中断响应和中断处理三个阶段组成。... 中断服务程序的限制
    
    在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。

         中断处理过程:一次完整的中断过程由中断请求、中断响应和中断处理三个阶段组成。

         中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点

        中断服务程序的限制

    (1)ISR 没有参数并且返回类型为 void
    2ISR 不可以重复进入,不要在 ISR内允许中断。

    3)当中断发生时系统会自己响应。用户不要调用它。

    4ISR 中不要调用任何 C 自定义函数,但是内置的函数没有关系。ISR 中可调用汇编函数。
    5)如果 ISR 内包含嵌入汇编指令,那么由于执行这些指令而影响到的寄存器就需要在执行这些指令之前预先保留,待执行完毕恢复寄存器。 因为Holtek C编译器只保存由于C语句造成影响的寄存器。

    6ISR内不能有可能导致阻塞的语句如:malloc

    7)避免在ISR中做浮点运算,在许多处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就不允许在ISR中做浮点运算。此外,ISR应该是段而有效率的,在ISR中做浮点运算是不明智的。

    有了以上知识,下面的题目应该是小Case了

    1. 下面的ISR有何问题(华硕公司2005年软件工程师面试)  
    2. _interrupt double compute_area(double radius)  
    3. {  
    4.     double area = PI*radius*radius;  
    5.     printf("/nArea=%f",area);  
    6.     return area;  
    7. };  

    展开全文
  • 还请各位朋友能够给我指出来,我将不胜感激,谢谢~前言笔者在《程序是如何在 CPU 中运行(二)》中从 PC 指针寄存器角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务程序又是如何被执行的呢?...

    笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~

    前言

    笔者在 《程序是如何在 CPU 中运行的(二)》中从 PC 指针寄存器的角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务子程序又是如何被执行的呢?两者的相同点和不同点是什么呢?该篇文章笔者将详细地阐述这个概念。

    中断的概念

    当 CPU 正在处理某件事情的时候,外部发生的某一事件请求 CPU 迅速去处理,于是,CPU 暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件以后,再回到原来被中止的地方,继续原来的工作,这样的过程称之为中断,示意图如下:

    35868748ad181bd1a5a8f0239a4751ae.png
    中断执行示意图

    中断响应及处理过程

    回顾函数调用的过程,子程序由主程序进行调用,从而完成执行。但是中断服务子程序并没有被主程序进行调用,中断服务子程序的执行是通过中断请求完成的,也就是说中断服务子程序可以发生在主程序执行的随意位置,那现在就面临一个问题了,如果当CPU 正在执行函数调用的子程序的内容的时候产生了一个中断请求,那么这个时候 CPU 将暂停执行函数调用的子程序的内容,转而去执行中断服务子程序的内容,如果不进行额外的处理,那么函数调用的子程序的相关数据将丢失,因此在执行中断服务子程序之前,CPU 必须要保存发生中断的那个地方的相关信息,这个操作用专业的术语来讲就是保护现场,保护现场之后,CPU 将执行中断服务子程序的内容,执行完中断服务子程序的内容之后,CPU 要回到刚刚暂停的地方继续执行,另外在返回之前,CPU 还要进行恢复现场,恢复现场之后,就可以返回到暂停的地方继续执行了,下面是整个过程的示意图:

    7fef795bdf3fe0d3b2acfe27c85541da.png
    中断响应示意图

    通过上述示意图我们也可以看到在返回地址这个地方,中断服务子程序和函数调用子程序的返回地址所遵循的原理是一样的,函数调用子程序的返回地址是函数调用指令的下一条指令的地址,而在上述示意图中的 N 和 N+1 的含义也是类似的,当 CPU 执行到第 N 条指令的时候,CPU 接收到了一个中断请求,在执行完第 N 条指令之后,转而去执行中断服务子程序的内容,然后中断服务子程序的返回地址对应的是第 N+1 条指令的地址。

    中断的堆栈占用

    在刚刚所述的内容中,说到 CPU 在执行中断服务子程序的内容之前,需要保护现场,那保护现场这个操作具体是怎么实现的呢?这个时候,就要用到我们的堆栈了。在这里拿 ARM Cortex M3 举例,在响应中断时所做的第一个操作就是保护现场,它会依次把 xPSR,PC,LR,R12以及 R3-R0 由硬件自动压入适当的堆栈中,注意,这里是自动压入堆栈,也就是说如果我们看对应的汇编代码是看不到这部分压栈操作的。另外,我们知道对于 ARM Cortex M3 的堆栈指针来说,它存在两个,一个是主堆栈指针(MSP),一个是线程堆栈指针(PSP),其中主堆栈指针是复位后默认使用的堆栈指针,用于操作系统内核和中断处理程序,线程堆栈指针(PSP)是由用户的应用程序代码所使用。那么在执行现场保护时将相关寄存器的值压入堆栈,应该使用哪个堆栈指针呢?这也是存在一个原则的,如果在响应中断时,当前的代码正在使用线程堆栈(PSP),那么将使用线程堆栈指针(PSP)进行压栈,否则将使用主堆栈指针(MSP)。另外在 CPU 进入中断服务子程序之后,所涉及的堆栈操作所使用的堆栈一直是主堆栈指针(MSP)。为了更直观的展示这个过程,下图是发生中断请求后,堆栈的变化示意图:

    d55062e6124715fd82875ffcaba5c920.png
    中断堆栈调用示意图

    通过上图我们可以很清楚地看到在响应中断时产生的保护现场操作,堆栈明显增长了,而在执行完中断服务子程序的内容之后,又将执行恢复现场的操作,这个时候堆栈的内容又减少了。为了更清楚地展示压入堆栈寄存器的操作,笔者在这里也给出上述图中堆栈粉色部分的详细内容,图片如下:

    f30f1a088b4394859500ec21467cbe0a.png
    保护现场堆栈内容

    上述就是保护现场时所压入堆栈的相关寄存器,另外还需注意的一点是当所涉及的中断服务子程序逻辑比较复杂的时候,就需要更多的寄存器了,这个时候就需要用到 R4-R11 了,但是这部分寄存器是不能进行自动压栈的,也就是说如果在中断服务子程序中使用到这部分寄存器的时候就需要进行手动压栈,那么这部分的压栈操作在汇编层面就能看到了。

    中断向量表

    在上述所阐述的内容中,我们知道了中断会在主程序的任意发生中断请求,从而执行中断服务子程序的内容,也阐述了在执行中断服务子程序的内容之前需要进行保护现场的操作,以及执行完中断服务子程序的内容之后需要进行恢复现场。现在我们再来思考,在 CPU 中,中断源不止一种,可以是按键按下所触发的一个外部中断,也可能是在使用串行通信时,收到数据所触发的一个中断,亦或是在 CPU 中定义的一个定时中断由于设置的时间到了而触发的定时中断,这个时候,就浮现一个问题了,要如何将这一个一个的中断源与其各自的中断服务子程序所一一对应起来呢?换句更为通俗的话来讲就是当 CPU 接收到一个中断信号时,CPU 将如何找到对应的中断服务子程序进行执行呢?这个时候,就需要中断向量表了,下面是中断向量表的特点:

    • 中断向量表在 CPU 中是一段连续的存储空间

    • 中断向量表在 CPU 复位后有默认的起始地址

    • 每一个中断在中断向量表中都有对应的表项,该表项的值为该中断源对应的中断服务程序的地址

    • 由程序代码确定中断向量表中的每个表项

    上述特点说中断向量表都存在默认的起始地址,在这里依旧拿 ARM Cortex M3 内核来看,它的中断向量表默认的起始地址是从地址 0x0000 0000 开始的,如下图所示:

    fdb2711341594712634347f3edb508d2.png
    中断向量表

    当然这只是一部分,并不是全部的表项。有了中断向量表之后,那么当 CPU 接收到中断请求的时候,就会根据这个中断请求的信号去查这个表,从而查找到其所对应的中断服务子程序的地址,然后将这个地址赋值给 PC 指针寄存器就,那么 CPU 就可以完成中断服务子程序的执行了,对于 PC 指针寄存器不是太清楚地朋友可以看笔者的这篇文章 《程序是如何在 CPU 中运行的(二)》

    中断服务函数的写法

    中断服务函数的写法不同的 CPU 有各自不同的写法,对于 ARM Cortex M3 的 CPU 来说,因为其内核的特点,在执行完中断服务函数后的返回指令与普通函数调用的返回指令是一样的,因此中断服务函数的写法与 C 语言中普通函数的定义没有区别,比如下面是 STM32F103 的一个外部中断的服务函数

    void EXTI0_IRQHandler(void){
        /* 确保是否产生了中断 */
        if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
        {   
            /*用户代码*/
            /*清除中断标志位*/
            EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
        }  
    }

    通过上述的代码我们可以看到中断服务函数的另一个特点,就是它的返回值和形参都为 void ,这也是由原因的,因为中断服务函数本来就不是由主程序进行调用的,既然中断服务函数不会被其他函数所调用,那么其返回值和形参自然是 void 了,要使得 CPU 能够找到中断服务子程序,那么这个函数的函数名不是随意命名的,比如这里的 EXTI0_IRQHandler,这个函数名与中断向量表中表项的值是对应起来的,因为函数名从数值上看代表的是函数的入口地址。
    上述说到是因为 ARM Cortex M3 的 CPU 在处理中断服务函数的返回地址时用的指令和普通函数调用时的返回地址的指令一致,所以才能够使中断服务函数的写法与普通 C 语言函数没有差异,下面举一个 51 单片机的定时器中断服务函数的例子:

    void InterruptTimer0() interrupt 1{
        /*省略*/
    }

    上述的这个中断服务函数, InterruptTimer0可以任意命名,但是括号后面的是有严格规定的,为了 51 单片机能够进行中断处理,C51 编译器对函数进行了扩展,增加了一个扩展关键字interrupt,从而让 CPU 知道这个是一个中断服务函数。

    中断的嵌套

    C 语言函数能够进行嵌套调用,同样的中断服务函数也能够进行嵌套,同样的用一张图来表明中断的嵌套:

    508a43d48f431c4cf5e375a304e23575.png
    中断嵌套示意图

    可以看到中断的嵌套也是在消耗堆栈的,和使用函数嵌套调用一个道理,这里需要注意的是中断是存在优先级的,如果发生了一个比当前执行的中断优先级低的中断请求,那么新产生的中断请求会等待正在执行的中断执行完成之后才开始响应新的中断,如果产生的中断的优先级比当前的优先级要高,那么也就会像上图所示一样进行执行。另外需要注意的是,中断的优先级是有限的,也就是说中断嵌套的层数是有限的,如果再考虑堆栈溢出的话,那么中断嵌套的层数还和堆栈的大小有关。

    总结

    上述就是关于中断的相关内容,简单地叙述了中断是如何响应的,如何执行保护现场和恢复现场的操作,CPU 如何根据中断向量表找到对应的中断服务函数,以及中断的嵌套,这就是这次分享的全部内容啦~

    ad51c1ca84ed20414189473d31445a42.gif

    如果觉得我的文章对您有所帮助,欢迎点击在看鼓励一下呐~

    展开全文
  • 中断服务程序是如何被执行的

    千次阅读 2020-05-25 00:07:18
    笔者在 《程序是如何在 CPU 中运行(二)》中从 PC 指针寄存器角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务程序又是如何被执行的呢?两者相同点和不同点是什么呢?该篇文章笔者将详细地阐述...

    前言

    笔者在 《程序是如何在 CPU 中运行的(二)》中从 PC 指针寄存器的角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务子程序又是如何被执行的呢?两者的相同点和不同点是什么呢?该篇文章笔者将详细地阐述这个概念。

    中断的概念

    当 CPU 正在处理某件事情的时候,外部发生的某一事件请求 CPU 迅速去处理,于是,CPU 暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件以后,再回到原来被中止的地方,继续原来的工作,这样的过程称之为中断,示意图如下:
    中断执行示意图

    中断响应及处理过程

    回顾函数调用的过程,子程序由主程序进行调用,从而完成执行。但是中断服务子程序并没有被主程序进行调用,中断服务子程序的执行是通过中断请求完成的,也就是说中断服务子程序可以发生在主程序执行的随意位置,那现在就面临一个问题了,如果当CPU 正在执行函数调用的子程序的内容的时候产生了一个中断请求,那么这个时候 CPU 将暂停执行函数调用的子程序的内容,转而去执行中断服务子程序的内容,如果不进行额外的处理,那么函数调用的子程序的相关数据将丢失,因此在执行中断服务子程序之前,CPU 必须要保存发生中断的那个地方的相关信息,这个操作用专业的术语来讲就是保护现场,保护现场之后,CPU 将执行中断服务子程序的内容,执行完中断服务子程序的内容之后,CPU 要回到刚刚暂停的地方继续执行,另外在返回之前,CPU 还要进行恢复现场,恢复现场之后,就可以返回到暂停的地方继续执行了,下面是整个过程的示意图:
    中断响应示意图
    通过上述示意图我们也可以看到在返回地址这个地方,中断服务子程序和函数调用子程序的返回地址所遵循的原理是一样的,函数调用子程序的返回地址是函数调用指令的下一条指令的地址,而在上述示意图中的 N 和 N+1 的含义也是类似的,当 CPU 执行到第 N 条指令的时候,CPU 接收到了一个中断请求,在执行完第 N 条指令之后,转而去执行中断服务子程序的内容,然后中断服务子程序的返回地址对应的是第 N+1 条指令的地址。

    中断的堆栈占用

    在刚刚所述的内容中,说到 CPU 在执行中断服务子程序的内容之前,需要保护现场,那保护现场这个操作具体是怎么实现的呢?这个时候,就要用到我们的堆栈了。在这里拿 ARM Cortex M3 举例,在响应中断时所做的第一个操作就是保护现场,它会依次把 xPSR,PC,LR,R12以及 R3-R0 由硬件自动压入适当的堆栈中,注意,这里是自动压入堆栈,也就是说如果我们看对应的汇编代码是看不到这部分压栈操作的。另外,我们知道对于 ARM Cortex M3 的堆栈来说,它存在两个,一个是主堆栈指针(MSP),一个是线程堆栈指针(PSP),其中主堆栈指针是复位后默认使用的堆栈指针,用于操作系统内核和中断处理程序,线程堆栈指针(PSP)是由用户的应用程序代码所使用。那么在执行现场保护时将相关寄存器的值压入堆栈,应该使用哪个堆栈指针呢?这也是存在一个原则的,如果在响应中断时,当前的代码正在使用线程堆栈指针(PSP),那么将使用线程堆栈指针(PSP)进行压栈,否则将使用主堆栈指针(MSP)。另外在 CPU 进入中断服务子程序之后,所涉及的堆栈操作所使用的堆栈一直是主堆栈指针(MSP)。为了更直观的展示这个过程,下图是发生中断请求后,堆栈的变化示意图:
    中断堆栈调用示意图
    通过上图我们可以很清楚地看到在响应中断时产生的保护现场操作,堆栈明显增长了,而在执行完中断服务子程序的内容之后,又将执行恢复现场的操作,这个时候堆栈的内容又减少了。
    为了更清楚地展示压入堆栈寄存器的操作,笔者在这里也给出上述图中堆栈粉色部分的详细内容,图片如下:
    保护现场堆栈内容
    上述就是保护现场时所压入堆栈的相关寄存器,另外还需注意的一点是当所涉及的中断服务子程序逻辑比较复杂的时候,就需要更多的寄存器了,这个时候就需要用到 R4-R11 了,但是这部分寄存器是不能进行自动压栈的,也就是说如果在中断服务子程序中使用到这部分寄存器的时候就需要进行手动压栈,那么这部分的压栈操作在汇编层面就能看到了。

    中断向量表

    在上述所阐述的内容中,我们知道了中断会在主程序的任意发生中断请求,从而执行中断服务子程序的内容,也阐述了在执行中断服务子程序的内容之前需要进行保护现场的操作,以及执行完中断服务子程序的内容之后需要进行恢复现场。现在我们再来思考,在 CPU 中,中断源不止一种,可以是按键按下所触发的一个外部中断,也可能是在使用串行通信时,收到数据所触发的一个中断,亦或者在 CPU 中定义的一个定时中断由于设置的时间到了而触发的定时中断,这个时候,就浮现一个问题了,要如何将这一个一个的中断源与其各自的中断服务子程序所一一对应起来呢?换句更为通俗的话来讲就是当 CPU 接收到一个中断信号时,CPU 将如何找到对应的中断服务子程序进行执行呢?这个时候,就需要中断向量表了,下面是中断向量表的特点:

    • 中断向量表在 CPU 中是一段连续的存储空间
    • 中断向量表在 CPU 复位后有默认的起始地址
    • 每一个中断在中断向量表中都有对应的表项,该表项的值为该中断源对应的中断服务程序的地址
    • 由程序代码确定中断向量表中的每个表项

    上述特点说中断向量表都存在默认的起始地址,在这里依旧拿 ARM Cortex M3 内核来看,它的中断向量表默认的起始地址是从地址 0x0000 0000 开始的,如下图所示:
    中断向量表
    当然这只是一部分,并不是全部的表项。有了中断向量表之后,那么当 CPU 接收到中断请求的时候,就会根据这个中断请求的信号去查这个表,从而查找到其所对应的中断服务子程序的地址,然后将这个地址赋值给 PC 指针寄存器就,那么 CPU 就可以完成中断服务子程序的执行了,对于 PC 指针寄存器不是太清楚地朋友可以看笔者的这篇文章 《程序是如何在 CPU 中运行的(二)》

    中断服务函数的写法

    中断服务函数的写法不同的 CPU 有各自不同的写法,对于 ARM Cortex M3 的 CPU 来说,因为其内核的特点,在执行完中断服务函数后的返回指令与普通函数调用的返回指令是一样的,因此中断服务函数的写法与 C 语言中普通函数的定义没有区别,比如下面是 STM32F103 的一个外部中断的服务函数

    void EXTI0_IRQHandler(void)
    {
    	/* 确保是否产生了中断 */
    	if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
    	{	
    		/*用户代码*/
    		/*清除中断标志位*/
    		EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
    	}  
    }
    

    通过上述的代码我们可以看到中断服务函数的另一个特点,就是它的返回值和形参都为 void ,这也是由原因的,因为中断服务函数本来就不是由主程序进行调用的,既然中断服务函数不会被其他函数所调用,那么其返回值和形参自然是 void 了。
    上述说到是因为 ARM Cortex M3 的 CPU 在处理中断服务函数的返回地址时用的指令和普通函数调用时的返回地址的指令一致,所以才能够使中断服务函数的写法与普通 C 语言函数没有差异,下面举一个 51 单片机的定时器中断服务函数的例子:

    void InterruptTimer0() interrupt 1
    {
        /*省略*/
    }
    

    上述的这个中断服务函数, InterruptTimer0可以任意起,但是括号后面的是有严格规定的,为了 51 单片机能够进行中断处理,C51 编译器对函数进行了扩展,增加了一个扩展关键字interrupt,从而让 CPU 知道这个是一个中断服务函数。

    中断的嵌套

    C 语言函数能够进行嵌套调用,同样的中断服务函数也能够进行嵌套,同样的用一张图来表明中断的嵌套:
    中断嵌套示意图
    可以看到中断的嵌套也是在消耗堆栈的,和使用函数嵌套调用一个道理,这里需要注意的是中断是存在优先级的,如果发生了一个比当前执行的中断优先级低的中断请求,那么新产生的中断请求会等待正在执行的中断执行完成之后才开始响应新的中断,如果产生的中断的优先级比当前的优先级要高,那么也就会像上图所示一样进行执行。另外需要注意的是,中断的优先级是有限的,也就是说中断嵌套的层数是有限的,如果再考虑堆栈溢出的话,那么中断嵌套的层数还和堆栈的大小有关。

    总结

    上述就是关于中断的相关内容,简单地叙述了中断是如何响应的,如何执行保护现场和恢复现场的操作,CPU 如何根据中断向量表找到对应的中断服务函数,以及中断的嵌套,这就是这次分享的全部内容啦~

    展开全文
  • 中断服务处理完该事件后,再返回到原来被中止地方继续原来工作,这样的过程称为中断。中断是嵌入式系统中最关键技术之一,它有效地保证了系统实时性。当我们在Linux下开发软件时,想要自己写一个中断处理...

    首先来看一下中断的定义:当CPU当CPU正在处理某事件的时候,外部或者内部发生的某一事件请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件后,再返回到原来被中止的地方继续原来的工作,这样的过程称为中断。

    中断是嵌入式系统中最关键的技术之一,它有效地保证了系统的实时性。当我们在Linux下开发软件时,想要自己写一个中断处理程序去执行自己的代码,那么我们首先就必须知道在Linux中是如何使用中断的。我们需要明确一个概念,Linux是一个大型操作系统,毫无疑问系统中的所有资源都归它管理及调度,所以我们想要实现某一个中断时就必须向Linux内核申请,再使用完毕后再释放该中断归还给Linux内核。

    分析request_irq()如何申请注册中断,free_irq()如何注销中断

    request_irq()的函数原型

    request_irq()的函数原型如下所示:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id),这里对参数进行说明:

    unsigned int irq:为要注册中断服务函数的中断号,比如外部中断0就是16,定义在mach/irqs.h中

    irq_handler_t handler:为要注册的中断服务函数,就是(irq_desc+ irq )->action->handler

    unsigned long irqflags:触发中断的参数,比如边沿触发,定义在linux/interrupt.h中

    const char *devname:中断服务程序的名字,使用cat /proc/interrupt 可以查看中断服务程序的名字

    void *dev_id:传入中断服务程序的参数,注册共享中断时不能为NULL,因为卸载时需要这个做参数,避免卸载到其它中断的服务函数

    request_irq()的函数代码

    request_irq代码如下:

    ed18ad94fbc20a898acc31ac7d6250ea.png

    request_irq()

    从上面代码可以知道,request_irq()函数主要是注册了一个irqaction型的action,然后把参数都赋给这个action结构体,最后进入setup_irq(irq, action)设置irq_ desc[irq]->action 。

    setup_irq(irq, action)是如何设置irq_ desc[irq]->action的

    setup_irq()函数的代码如下:

    5f1303b1eb01fd3e194e68729156fe40.png

    setup_irq()的上半部分

    b2068c9035bf174ee086c6389fff81db.png

    setup_irq()的下半部分

    从上面代码可以看出setup_irq(irq, action)实际上主要是将action中断服务函数放在irq_ desc[irq]->action中,然后设置中断引脚,最后开启中断使能中断。

    free_irq()的函数原型

    free_irq()的函数原型如下所示:free_irq(unsigned int irq, void *dev_id),下面是对参数的说明:

    unsigned int irq:要卸载的中断号

    void *dev_id:要卸载的中断action下具体的服务函数

    free_irq()的函数代码

    f412525ded6a47d7d3f5c9301298c2e5.png

    free_irq()的上半部分

    a99a40dc1ec00ef7c285982e8168fdac.png

    free_irq()的下半部分

    从上面的代码可以知道free_irq()函数实际上主要是通过irq和dev_id来寻找需要释放的中断action,如果释放的中断不是共享中断的话,那就将当前的action释放掉,然后释放中断服务函数相关的东西,最后关闭中断禁止中断,但是如果释放的中断是共享中断的话,那么就不执行后面的关闭中断和禁止中断的操作。

    cc920d35c1bb68257d1c273466e37173.png

    结尾

    request_irq()和free_irq()是我们在Linux中使用中断时所必须的系统调用,它们的作用分别是注册中断和注销中断,既然在Linux操作系统下开发,那我们就得遵循规范(其实都是套路),这两个与中断相关的函数我们在初学阶段实际上不需要深入的去研究,只需要知道如何使用即可。当然,我建议后期有了一定的开发经验后再来研究这些实现原理,这将会大大提高你对Linux黑盒的掌控,并且一定程度上提升你的编码能力。

    展开全文
  •  中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点 中断服务程序的限制(1)ISR 没有参数并且返回...
  • 还请各位朋友能够给我指出来,我将不胜感激,谢谢~前言笔者在《程序是如何在 CPU 中运行(二)》中从 PC 指针寄存器角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务程序又是如何被执行的呢?...
  • 1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。 2、 掌握中断服务程序的设计方法。 2.7.2 实验预习要求 1、 复习中断的...
  • 系统要想能够应对各种不同中断信号,总来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。...
  • 中断——执行过程

    2021-04-13 08:52:24
    ①CPU正常执行程序 ②定时器TH0,TL0计满溢出,中断标志位TF0置1 ③CPU执行到正在进行指令最后一个机器周期,例行检测中断标志位 ...⑧进入中断服务函数,擦除中断标志位(软件清零),执行中断服务函数 ⑨中断返
  • 一、中断处理的过程   根据Intel 64 and IA-32 Architectures Software Developer’s Manual 介绍,在中断或异常产生是,CPU会将当前执行的指令(或下一条指令)在内存中地址,也就是EIP值,放入栈中,同时...
  • 这段时间准备学习RTOS,准备从UCOSIII入手。 由于手头项目正在使用TIRM48系列MCU,cotex-R4F内核。就从官网下载了一个RM48L952例程。 大概熟悉后,就简单修改了一些关键参数,移植...在此过程中出现了问题: R...
  • 在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。 中断处理过程:一次完整的中断过程由中断请求、中断响应和中断... 中断服务程序的限制 (1)ISR 没有参数并且返回类型为 v
  • 计算机在执行正常程序的过程中,出现异常事件,迫使CPU暂时中止现行程序的执行,转去执行事件处理程序,处理完毕后,CPU再返回到 被暂时中止的程序继续执行。通过调用鼠标功能中断INT 33H读取鼠标状态,再通过屏幕...
  • 条件转移指令中断服务程序 第1章 课程设计简介 1.1实验目的 (1)从硬件、软件结合角度,模拟单级中断和中断返回的过程; (2)通过简单中断系统,掌握中断控制器、中断向量、中断屏蔽等概念; (3)了解微...
  • 《Linux内核设计艺术:图解Linux操作系统架构设计与实现原理》第1章从开机...本节为大家介绍启动BIOS,准备实模式下中断向量表和中断服务程序。 AD: 第1章 从开机加电到执行main函数之前的过程
  • 出现问题是,程序开始,调用void test1(void)函数,在执行void test1(void)函数的过程之中,向串口发送数据,触发串口中断中断执行完后,会继续执行void test1(void)函数,但在执行完void test1(void)函数后,就...
  • 中断服务函数的过程_20160206

    千次阅读 2016-02-17 08:44:22
    我们有如下定义:所谓中断是指CPU对系统发生某个事件做出一种反应,即CPU暂停正在执行的程序,保留现场后自动转去执行相应处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。引起中断的事件成为...
  • 中断是个很重要一个概念,在计算机组成原理中曾经讲过这一概念,对于嵌入式方向来说,也是一个非常重要一个知识点,...第二步:跳转到中断服务程序执行中断服务程序; 第三步:恢复现场,将栈顶值回送给PC; 第
  • 最近用采用远程连接服务站运行大型程序,为了避免程序中段问题,我采用了nohup后台运行指令。但在运算过程程序仍然意外终端。根据疯狂打铁经验,发现问题出于以下几点: 在Xshell提示nohup成功后还需要按键盘...
  • 一、中断是什么所谓中断,是指PLC按顺序执行程序扫描的过程中,当有需要立即反应请求发出时,立即中断当前执行的扫描工作,优先地去执行请求所指定的服务工作。服务工作完成后,再回到刚才被中...
  • 而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作为trap区,所以在CE下arm使用高地址向量。下面我们来了解...
  • 2.5 异常处理类中断服务程序挂接(1) 不论是用户进程还是系统内核都要经常使用中断或遇到很多异常情况需要处理,如CPU在参与运算过程中,可能会遇到除零错误、溢出错误、边界检查错误、缺页错误……免不了需要...
  • 关于中断一个完整的中断过程中断请求、中断判优及屏蔽、中断响应、中断处理及中断返回五个部分组成。在8086/8088微机系统中,中断优先权由高到低顺序依次为:除零数、INT n、INT o、NMI(非屏蔽中断)、INTR...
  • 中断服务处理完该事件后,再返回到原来被中止地方继续原来工作,这样的过程称为中断。中断是嵌入式系统中最关键技术之一,它有效地保证了系统实时性。当我们在Linux下开发软件时,想要自己写一个中断处理...
  • 单片机中断的过程

    千次阅读 2019-02-18 10:19:46
    1.根据响应的中断源的中断优先级, 使相应的优先级状态触发器置1...5.把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC, 从而转入相应的中断服务程序。 6.中断返回,程序返回断点处继续执行。  ...
  • 中断处理过程

    万次阅读 2019-08-13 16:05:45
    中断全过程指是从中断源发出中断请求开始,CPU响应这个请求,现行程序被中断,转至中断服务程序,直到中断服务程序执行完毕,CPU再返回原来程序继续执行整个过程。 执行过程 大体上可以把中断全过程分为5个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 808
精华内容 323
关键字:

中断服务程序的执行过程