首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S3C4480X平台上μC/OS-Ⅱ的中断系统设计 02

S3C4480X平台上μC/OS-Ⅱ的中断系统设计 02

与IRQ中断相比,FIQ中断处理过程比较简单,当发生FIQ中断时,处理器会执行地址0x20处的跳转指令直接转到具体的中断服务程序。

        3.2 arm处理器运行模式
   
        arm处理器有7种运行模式:用户模式(USR)、系统模式(SYS)、管理模式(SVC)、中止模式(ABT)、未定义模式(UND)、普通中断模式(IRQ)和快速中断模式(FIQ)。处理器在不同的情况下处于不同的模式中。在中断系统的设计中,主要涉及SVC、UND、IRQ和FIQ四种模式。
   
        在arm处理器中,SVC模式通常是操作系统内核代码的运行模式,μC/OS-II内核中主要代码在SVC模式下运行,系统任务代码运行在SVC模式下。
   
         IRQ/FIQ模式是在发生IRQ/FIQ中断后处理器强制进入的模式,用于中断处理。arm处理器在发生IRQ/FIQ中断时自动改写IRQ/FIQ模式中的LR寄存器,LR保存被中断模式的返回地址(进入中断前的PC值),以便中断退出时能够正确返回到被中断模式;同时,LR也是每个模式下函数调用的返回地址寄存器。也就是说,LR寄存器具有保存函数返回地址和中断返回地址两种功能,LR的双重功能在中断嵌套程序设计中会发生冲突。
   
        如果用IRQ/FIQ模式嵌套中断自身,则本模式的LR被改写后,本模式下原有的函数返回地址就无法还原。因此,应该在关闭中断的条件下,在IRQ/FIQ模式中进行基本的环境保护后,将中断服务程序切换到SYS模式下运行。这种处理方式能够保证产生中断嵌套时,被中断的模式是SYS模式而不是IRQ/FIQ模式自身,IRQ/FIQ模式中的LR保存着回到SYS模式的返回地址,SYS模式中的LR未被破坏,保存着函数返回地址。在移植中使用UND模式替代SYS模式作为中断服务的运行模式,这样可以实现中断嵌套的功能。

        3.3 中断嵌套方式
   
        嵌套应该采用半嵌套方式,并不需要完全嵌套方式。“半嵌套”是指不同设备中断之间可以嵌套,但是同一设备中断不能嵌套。这样设计既照顾了系统实时性的要求,又能让系统具有更明确和稳定的行为;否则,如果开发完全嵌套,中断服务的堆栈空间就存在不确定性,甚至中断响应时间上限也存在不确定性,这些显然不能满足嵌入式实时系统的需求。
   
        通过设置CPSR寄存器的中断屏蔽位F/I来屏蔽系统的中断,这样的保护称为“硬保护”;通过设置中断屏蔽寄存器中的相应位以屏蔽某一具体的中断,这样的保护称为“设备保护”。要实现半嵌套方式,需要在中断进入和退出时,在适当的时候进行两种保护方式的切换:
   
        ①在进入设备保护后还没有读取数据时退出硬保护。
        ②在即将退出ISR,使能设备中断位之前,再次恢复系统的硬保护。
   
        具体的实现过程如图4所示。

        3.4 IRQ中断设计
   
        IRQ中断处理过程中涉及中断环境保护、处理器运行模式切换和中断环境恢复等过程。中断处理过程如下:
   
        中断入口条件:IRQ中断屏蔽,LR是被中断模式的PC值,SPSR是被中断模式的当前处理器状态值,SP是IRQ模式的当前堆栈指针值。
   
        ①在IRQ模式下保存环境。
        ②判断是否为第一层中断,如果不是程序跳转到④。
        ③设置中断嵌套层数变量OSIntNesting值为1,切换到SVC模式以便将IRQ模式堆栈中保存的中断环境保存到任务堆栈中,当前任务SP指针保存到任务控制块中;然后切换到UND模式准备执行中断服务程序ISR,程序跳转到⑤。
       ④中断嵌套层数变量OSIntNesting加1,切换到UND模式,将保存在IRQ模式下的任务环境拷贝到ISR的堆栈中,即UND模式堆栈中。
      ⑤调用IRQ中断处理函数,执行中断服务程序。
      ⑥中断结束处理。屏蔽中断,递减中断嵌套计数,判断是否为最后一层。如果不是,继续执行中断服务;
返回列表