精华内容
下载资源
问答
  • 中断寄存器记录

    2020-08-27 20:23:06
    中断请求寄存器IRR 8259A有8条外部中断请求输入信号线IR0-IR7,每一条请求线上有一个相应的触发器来保存请求...⑶中断服务寄存器ISR I.SR(Interrupt Service Register)存放当前正在进行服务的所有中断。ISR中 相

    ⑴中断请求寄存器IRR
    8259A有8条外部中断请求输入信号线IR0-IR7,每一条请求线上有一个相应的触发器来保存请求信号,它们形成了中断请求寄存器IRR(Interrupt Request Register)。
    ⑵中断屏蔽寄存器IMR
    I.MR(Interrupt Mask Register)用来存放屏蔽位信息,IMR的每一位可以禁止IRR中对应位的中断请求输入信号进入。
    ⑶中断服务寄存器ISR
    I.SR(Interrupt Service Register)存放当前正在进行服务的所有中断。ISR中
    相应位的置位是在中断响应的INTA脉冲期间,由优先权判决电路根据IRR中各请求位的优先权级别和IMR中屏蔽位的状态,将中断的最高优先级请求位选通到ISR中。

    展开全文
  •  ... 中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点  中断服务程序的限制
    
    在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。

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

         中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(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. };  

    展开全文
  •  中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点 中断服务程序的限制(1)ISR 没有参数并且返回...

           在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。

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

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

        中断服务程序的限制

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

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

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

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

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

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

     

         

    展开全文
  • 《VxWorks7编程指南》中有关中断服务程序的笔记

    目录

     

    1.中断服务程序ISR

    2.针对ISR的VxWorks配置

    3.ISR可用资源

    4.ISR编程与调试

    5.修改系统时钟ISR

    6.运行时的ISR信息

    7.ISR与工作队列死机


    1.中断服务程序ISR

    外部事件通常通过中断的方式通知系统,因此硬件中断处理是实时操作系统中的关键功能。

    为了以最快速度响应中断,VxWorks中断服务程序执行在独有的上下文,而非任何任务是上下文中。除非系统专门进行过配置,否则不会推迟ISR的执行。

    2.针对ISR的VxWorks配置

    VxWorks系统默认支持SIR。中断栈可以按大小和附加特性进行配置。中断栈必须足够大,以处理中断嵌套时的最坏情况。

    中断栈配置

    所有的的ISR使用相同的中断栈空间。系统将在初始化时根据设定的配置参数为中断栈分配空间。其大小必须足够大,以应付中断嵌套时的最坏情况。中断栈大小由宏ISR_STACK_SIZE定义。

    注意:某些架构不允许使用独立的中断栈,而需要使用被中断任务的栈空间。在这种架构下,必须确保创建任务时分配了足够大的栈空间,以处理中断嵌套和嵌套调用的最坏情况。

     

    中断栈填充

    默认情况下,中断栈空间被填充为0xEE。对栈空间进行填充的做法,对于开发过程中的调试很有帮助。具体可以使用checkStack()函数进行栈空间检查。

    在进行系统配置时,建议不要对中断栈空间进行填充,以获得更佳的性能。可以使用配置参数VX_GLOBAL_NO_STACK_FILL关闭栈空间填充功能。

     

    中断栈保护

    如果使能了MMU功能,系统就可以通过配置INCLUDE_PROTECT_INTERRUPT_STACK组件,提供对中断栈始末的guard zone保护。

    可以通过如下配置参数设置guard zone的大小:

    • INTERRUPT_STACK_OVERFLOW_SIZE:设置中断栈上溢大小;
    • INTERRUPT_STACK_UNDERFLOW_SIZE:设置中断栈下溢大小;

    当添加了guard zone,栈空间的大小通常是MMU大小的整数倍。

    3.ISR可用资源

    所有的VxWorks功能库,如链表、环形缓冲区,都可以在ISR中使用。然而对于从ISR中调用函数还是有一些限制。

    全局变量errno可以作为中断进入与退出代码的一部分而被保存和获取。所以,ISR刻意像其他代码一样引用和修改errno。

     

    4.ISR编程与调试

    对于ISR的最基础的要求就是,ISR代码应该尽可能的短。ISR中不应该添加耗时的函数,此外还有一些限制:ISR不能调用会导致ISR阻塞的函数,也不能调用使用浮点数协处理器的函数;对于C++使用也有限制。

    非阻塞函数

    虽然ISR中可以使用许多VxWorks功能,但是需要注意一些重要的限制条件。这些限制都是源于如下事实:ISR不是运行在常规的任务上下文中,且没有任务控制块,因此所有的ISR都共享同一个栈空间。

    因为上述原因,对于ISR的最基础的限制条件就是,不能在ISR中调用会导致ISR自身阻塞的函数。例如,在ISR中不能尝试获取一个信号量,因为如果当前无法获取该信号量,那么内核将尝试把ISR切换到挂起状态。然而,ISR可以释放信号量,从而释放任何在等待该信号量的任务。

    内存相关函数malloc()和free()中会尝试获取信号量,所以在ISR中不应该调用这两个函数。因此在ISR中不应该调用任何创建或删除函数。

    ISR也不能通过VxWorks驱动执行I/O操作。尽管对I/O系统没有内在的限制条件,大多数的设备驱动仍然需要一个任务上下文环境,因为它们可能阻塞等待设备的任务。一个例外时VxWorks pipe驱动,ISR可以使用该驱动执行写操作。VxWorks还提供了几个供ISR调用的函数,用于向系统控制台中输出信息:logMsg()、kprintf()、kputs()。

     

    浮点数协处理器函数

    默认条件下,中断驱动代码不保存和读取浮点数寄存器。如果一个ISR需要执行浮点数指令,那么它必须使用fppArchLib库中提供的函数,对浮点数协处理器中的寄存器进行显示的保存和读取。

     

    共享数据区的间接访问

    ISR不应该直接访问共享数据区。一个ISR将继承被它抢占的任务的内存环境,如果该任务不包括共享数据区,那么ISR就不能访问共享内存,否则会导致系统异常。

    为了可靠地访问共享数据区,ISR必须使用一个已经包含了共享数据区的任务。该任务在ISR执行完毕后可以执行对共享数据区的相关操作。

     

    中断与任务之间的通信

    尽管VxWorks支持直接连接运行在中断级的ISR,但是中断事件通常会传播到任务级代码中。许多VxWorks功能不适用于中断级代码,包括任何设备的I/O(除了pipe)。然而,如下技术可以用于ISR到任务级代码之间的通信。

    • 共享内存与环形缓冲区

    ISR可以与任务级代码共享变量、缓冲区和环形缓冲区。

    • 信号量

    ISR可以释放任务所需要的信号量(除了互斥信号量和VxMP共享信号量)。

    • 消息队列

    ISR可以向等待接收消息队列中的消息的任务发送消息(除了VxMP中使用的共享消息队列)。如果队列已满,则该消息将被丢弃。

    • 管道

    ISR可以向供任务读取的管道中写入消息。任务和ISR可以向同一个管道中写入消息。因为ISR不能被阻塞,所以如果管道已满,那么写入的消息将被丢弃。除了write()函数,ISR中不能在管道中触发任何I/O函数。

    • 信号

    ISR可以向任务发送信号,从而异步调度相关的信号处理函数。

    • VxWorks事件

    ISR可以向任务发送VxWorks事件。

     

    高中断优先级保留

    大多数应用程序都可以使用VxWorks中断。但是有些情况下,类似于关键运动控制或系统失效响应等事件,需要拥有低级别的控制。在这些情况下,最好能够保留最高级别的中断,确保以零延时响应这些事件。为了实现零延时,VxWorks提供了intLockLevelSet()函数,用于将系统范围内的中断锁级别设定到一个特定的级别。如果没有指定一个级别,那么将使用处理器架构所支持的最高级别。

     

    对高中断级别ISR的限制

    对链接到未屏蔽的中断优先级(既可以是比intLockLevelSet()函数设置的中断优先级高的级别,也可以是由硬件定义的非屏蔽中断优先级)的ISR由特殊的限制:

    • ISR只能通过intVecSet()函数连接
    • ISR不能使用任何基于中断锁的VxWorks操作系统功能。否则后果就是,除了系统重启,ISR不能安全地执行任何VxWorks函数调用。

     

    对于I/O的使用限制

    通常,ISR不能通过VxWorks驱动执行I/O操作,因为这些操作会导致ISR阻塞。这意味着标准的I/O函数,如printf()和puts()不能用于调试ISR。基础的供ISR调试使用的方法包括:

    • 在ISR中使用全局变量,该全局变量可以根据相关数据进行更新。之后就可以在运行时通过shell显示这些变量的值。
    • 在ISR中使用如下函数向控制台输出信息:logMsg()、kprintf()、kputs()。

    使用全局变量的优点在于:实现简单且对ISR执行的性能影响最小。缺点在于如果系统因为ISR中的某个bug导致挂起,就不能使用shell显示变量的值了。

    使用logMsg()函数的优点在于:可以自动向控制台打印消息,相较于kprintf()和kputs(),对于ISR的执行性能的影响更小。缺点在于,如果系统在调用该函数后短暂地挂起了,那么消息可能无法显示在控制台中。原因是由于logMsg()的异步操作首先是把消息写入到一个消息队列,然后logging任务将消息打包再发送到控制台。

    使用kprintf()与kputs()的优点在于:它们可以同步地输出消息(使用轮询模式),因此可以在bug出现时精确地反映出ISR已经执行到哪个阶段(也可用于内核启动期间或任务切换钩子函数中)。缺点在于,因为它们使用串口输出信息,所以或显著影响ISR的执行性能。

     

    中断级异常

    当一个任务产生了硬件异常,如非法指令或总线错误,那么该任务将被挂起。系统中的其他任务将继续执行,而不被中断。然而,当一个ISR导致了类似的异常,系统中将没有相应的安全保障用于处理这些异常。ISR不具备可以挂起的上下文环境。相反,VxWorks将这些异常描述信息保存在内存空间的一个特殊区域,并执行系统重启。

    VxWorks的BootLoader将检测低内存空间中的异常描述信息是否存在,如果检测到,则会在系统控制台中显示出来。BootLoader的“e”命令用于重新显示异常描述信息。类似的异常信息如下:

    workQPanic:Kernel work queued from ISR overflowd.

     

    ISR与内核工作队列死机(work queueu panic)

    为了减少工作队列溢出,可以使用WIND_JOBS_MAX内核配置参数增加内核工作队列大小。

    与内核工作队列死机相关的错误信息如下:

    workQPanic:kernel work queue overflow

    5.修改系统时钟ISR

    可以根据应用程序需要,在usrClock()函数中添加相关的函数。

    在系统启动的初始化过程中,系统时钟ISR usrClock()函数被挂接到系统时钟定时器中断上。每个系统时钟中断都将调用usrClock(),用于更新系统tick值并执行调度。

    在usrClock()函数中添加代码也要遵守在ISR中调用函数的要求。

    6.运行时的ISR信息

    针对每个与VxWorks连接的ISR,系统都创建了一个内核对象。ISR对象提供了一种管理系统中所有ISR信息的方法。

    可以参考isrLib和isrShow API参考手册,了解用于获取ISR信息的相关函数。

    INCLUDE_ISR_SHOW组件提供了isrShow(),INCLUDE_ISR_OBJECT提供了isrLib。

    7.ISR与工作队列死机

    如果ISR以非常高的频率填充内核工作队列,导致内核处理不过来,那么会将工作队列填满,使得无法再将新的工作项添加到工作队列中。这将导致称为工作队列死机(work queue panic)的致命错误。

    为了降低中断响应时间,VxWorks内核在执行关键区代码时不会锁中断,如任务状态改变、上下文切换、重新调度等等。使能中断后,ISR将以尽可能快的速度执行。如果在内核执行关键区代码的过程中产生了一个中断,而ISR同样调用了需要执行关键代码的内核函数,那么内核将延迟关键区代码的执行,知道具备安全执行的条件为止。这个过程是通过内核工作队列实现的。工作队列可以高效地将内核关键区排入队列,并且不会阻塞ISR中非关键区的代码执行。

    考虑到性能因素,工作队列被设计为一个具有固定大小的环形缓冲区。可以通过WIND_JOBS_MAX配置参数配置其大小,该大小必须是2的幂次。

     

    工作队列死机(work queue panic)

    通常,工作队列死机是由于设备驱动不恰当的写操作导致的。例如:

    • 确认中断失败。如果一个ISR未能确认一个中断,那么将导致一直产生相同的中断。
    • 在中断上下文执行了太多的操作。为了最佳的实时性能,可以将ISR中的复杂操作转移到与中断源相关的合适优先级的任务中执行。ISR应该使用一个内核调用唤醒该任务(例如semGive()).
    • 将设备突发事件作为独立中断处理。应该在关闭设备相关的中断之后在任务上下文中处理突发事件。当没有再检测到未处理的事件且任务将会挂起时,就可以再次使能中断源了。
    展开全文
  • 一、中断模块寄存器介绍   本节我们主要介绍C6748的中断模块。  中断是硬件系统的基本功能,DSP通过中断实现和其他芯片的实时交互。中断是指DSP在执行程序的过程中,当出现异常情况或特殊请求时,DSP停止...
  • S5PV210中的中断相关寄存器有很多,这里我只详细介绍我们常用的几个比较重要的寄存器: * VICnINTENABLE和VICnINTENCLEAR * VICnINTSELECT * VICnIRQSTATUS和VICnFIQSTATUS * VICnVECTPRIORITY0~VICnVECTPRIORITY31...
  • S3C2440 中断解析(各个中断相关寄存器分析) 2011-06-02 12:32:36 分类: 嵌入式 http://wenku.baidu.com/view/3a4f734fe518964bcf847caa.html 转自:...
  •  SUBSRCPND 寄存器被用来标识 INT_RXD0、INT_TXD0 等中断(S3C2410中这类中断有 11 个,而 S3C2440 中有 15 个)是否已经发生,每位对应一个中断。当这些中断发生并且没有被 INTSUBMSK 寄存器屏蔽,则它们中的若干位...
  • 中断处理(中断向量寄存器

    千次阅读 2014-04-08 20:10:45
     /* 在中断控制器里使能这些中断 */  VIC0INTENABLE |= (0x3); /* bit0: eint0~3, bit1: eint4~11 */  VIC0VECTADDR0 = eint0_3_irq;  VIC0VECTADDR1 = eint4_11_irq; } void do_irq(void...
  • ARM中断嵌套寄存器NVIC使用说明

    千次阅读 2016-11-03 16:07:03
    在ARM9系列中,针对某种具体的芯片如stm23f103zet6,...在ARM9中,中断与内核紧密联系,要实现某一外设的中断功能就必须对内部控制系统(NVIC)进行设定。  转自:秦工的博客http://www.arm32.com/post/304.html  1)
  • 当进程发出一个系统调用的请求时,由应用态切换到内核态。这样的内核控制路径被成为进程内核路径,也叫进程上下文。当CPU执行一个与中断有关的内核控制路径的时候,被成为中断...中断的上半部和下半部都属于ISR上下文。
  • 1.6. 异常中断处理 摘要 1.6.1. macros stmia /* ************************************************************************* * * Interrupt handling * *****************...
  • 中断服务子程序 ISR

    千次阅读 2017-06-06 16:28:36
    中断是嵌入式系统中重要的组成部分,这导致了很多...下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_area (double radius)  {  
  • 从 STM32中文参考手册 上面摘录下来的,因为上面是图片,摘录下来作为文档方便查询.
  • 请看下面的程序(一个中断服务子程序ISR),请指出这段代码的错误。)[中国台湾某著名CPU生产公司2005年面试题] 答案:(1)ISR不能返回一个值。如果你不懂这个,那么是不会被雇用的。(2)ISR不能传递参数。...
  • WinCE中断处理程序ISR 详解

    千次阅读 2014-03-04 17:01:22
    首先来解释一下, OAL实际上就是一个硬件的抽象层,WinCE的内核通过OAL来和硬件进行通信,应该... WinCE实际上使用 ISR来处理中断,即默认的中断入口函数  ISR是OEM实现的一段这段处理代码,它属于OAL层的一部
  • 中断服务程序(ISR)

    千次阅读 2012-08-13 22:23:56
    中断服务程序 关键词:软中断中断向量、中断向量表、TSR内存驻留、DOS重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( )、disable ( )、enable ( )、geninterrupt ( )、...
  • ISR:中断服务程序

    千次阅读 2011-02-27 22:36:00
    中断服务程序(Interrupt Service Routines,ISRISR:当前中断服务寄存器(In Service Register) 该寄存器用于存放正在被服务的所有中断级,包括尚未服务完而中途被别的中断打断了的中断级。...
  • 中断寄存器详解

    千次阅读 2011-11-30 12:41:49
    当这些中断发生并且没有被INTSUBMSK寄存器屏蔽,则它们中的若干位将汇集出现在SRCPND寄存器的某一位上。要清除中断,往此寄存器中某位写1。 ●INTSUBMSK寄存器:与SUBSRCPND寄存器对应,它用
  • TinyThread源码分析之中断 转载请注明来源:cuixiaolei的技术博客 ... TinyThread 是基于Cortex-... IPSR(中断程序状态寄存器),IPSR包含了当前正在执行的中断服务程序编号,用于识别当前中断。  Cortex-M0处理器...
  •  前面我们的按键程序已经能工作了,但是有一个缺点,就是它在中断处理函数里是一个一个判断中断的(虽然用了循环),如果有一天我们程序中有好多好多中断,比如触摸屏中断,按键中断,UART中断等等。我们难道要一个...
  • 中断是嵌入式系统中重要的组成部分,这...下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_area (double radius) { double area = P
  • 中断服务子程序(ISR)

    千次阅读 2018-09-11 20:33:36
    中断是嵌入式系统中重要的组成部分,这导致...下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_area (double radius)  { double are...
  • 6713中断寄存器配置及存储映射

    千次阅读 2016-09-06 22:13:01
    介绍6713中断寄存器配置和存储器映射
  • ISR 中断服务子程序的几个特点

    千次阅读 2014-02-14 12:53:12
    中断是嵌入式系统中重要组成部分,很多编译器开发商都让标准c支持中断,并引入关键字_interrupt.但是 ISR不能有返回值;ISR不能传递参数;ISR应该是短而高效的,在ISR中做浮点运算是不明智的;ISR中不应该有...
  • 中断服务子程序(ISR

    千次阅读 2014-06-08 18:30:25
    中断是嵌入式系统中重要的组成部分,这导致了很多...下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_area (double radius)  {  
  • ucOS 时钟中断ISR

    千次阅读 2012-03-24 22:54:56
    中断一旦被系统识别,CPU则保存部分(或全部)现场(context),即部分(或全部)寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后执行任务调度,程序回到就绪态优先级...
  • 这是一个尚未解决的问题,关于多个中断向量指向同一个ISR时,ISR如何获得调用者身份的信息(即本次调用是哪个中断触发的),大概描述一下:一颗IC,拥有N个相同类型的接口(比如多个I2C、UART、SPI、USB、McBSP、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,273
精华内容 5,709
关键字:

中断服务寄存器isr