中断管理API(中断管理的三个层次)

网友投稿 347 2023-03-04


本篇文章给大家谈谈中断管理API,以及中断管理的三个层次对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享中断管理API的知识,其中也会对中断管理的三个层次进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求教哪个API函数能实现网络中断与切换!

1. API之网络函数
WNetAddConnection 创建同一个网络资源的永久性连接
WNetAddConnection2 创建同一个网络资源的连接
WNetAddConnection3 创建同一个网络资源的连接
WNetCancelConnection 结束一个网络连接
WNetCancelConnection2 结束一个网络连接
WNetCloseEnum 结束一次枚举操作
WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接
WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接
WNetEnumResource 枚举网络资源
WNetGetConnection 获取本地或已连接的一个资源的网络名称
WNetGetLastError 获取网络错误的扩展错误信息
WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称
WNetGetUser 获取一个网络资源用以连接的名字
WNetOpenEnum 启动对网络资源进行枚举的过程

freertos 为什么要提供中断使用api

您好,我来为您解答:
内核提供的中断接口包括注册和注销中断处理程序,禁止中断,屏蔽中断线,以及检查中断系统的状态。
要分配的中断号,通常是预先设计固定的。某些情况可以通过探测获得,如PCI。
在设备驱动程序的初始化阶段,必须通过request_irq()函数将对相应的中断服务例程挂入中断请求队列,注册并激活一个中断处理程序,以便处理中断。转载,仅供参考。
如果我的回答没能帮助您,请继续追问。

C#如何调用中断

Windows中断编程
(加入日期:2001-4-27 点击数:26528)
【对此文发表评论】 【编程爱好者论坛】 【保存文章至硬盘】 【打印文章】
一、前 言
Windows提供强大的功能以及友好的图形用户界面(GUI),使得它不仅广泛的用作管理事务型工作的支持平台,也被工业领域的工程人员所关注。但Windows3.1并非基于优先级来调度任务,无法立即响应外部事件中断,也就不能满足工业应用环境中实时事件处理和实时控制应用的要求。因此,如何在Windows环境中处理外部实时事件一直是技术人员尤其是实时领域工程人员所关注的问题。目前已有的方法大都采用内挂实时多任务内核的方式,如 windows的实时控制软件包FLX等,而iRMX实时操作系统则把Windows3.1当作它的一个任务来运行。对于大型的工程项目,开发人员可采用购买实时软件然后集成方式。对中小项目,从投资上考虑就不很经济。如何寻找一种简明的方法来处理外部实时事件依然显得很必要。
本文首先阐述windows的消息机制及中断机制,然后结合DPMI接口,给出一种保护模式下中断程序的设计方法,以处理外部实时事件。经实际运行结果表明,该方法具有简洁、实用、可靠的特点,并同样可运行于Win95。
二、Windows的消息机制
Windows是一消息驱动式系统,。 Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的于段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。
Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由 Windows监控,当一个事件发生时,windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中”应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必须经历上述过程。值得注意的是消息的非抢先性,即不论事件的急与缓,总是按到达的先后排队(一些系统消息除外),这就使得一些外部实时事件可能得不到及时的处理。
三、windows的保护模式及中断机制
1.Windows的保护模式
保护模式指的是线性地址由一个选择符间接生成的,该选择符指向描述表中的某一项;而实模式中则通过一个段/偏移量对来直接寻址。80386 (486) CPU提仪的保护模式能力包括一个64K的虚拟地址空间和一个4G的段尺寸。Windows3.1实现时有所差别,它支持标准模式和增强模式。标准模式针对286机器,不周本文探讨范围。增强模式是对386以上CPU而言,windows正是使用保护模式来打破lM的屏障并且执行简单的内存保护。它使用选择器、描述器和描述器表控制访问指定内存的位置和段。描述器表包括全局描述器表局部描述器表、中断描述器表。保护模式与实模式有许多不同。其中显著的差异是访问内存的机制不同。
2.中断机制
(1)实模式中断
为了便于理解,我们先回顾实模式中断。
在实模式下,中断向量表IVT起到相当重要的作用。无论来自外部硬件的中断或是内部的软中断INTn,在CPU中都产生同样的响应。
①CPU将当前的指令指针寄存器(IP)、代码段寄存器(CS)、标志寄存器压入堆栈。
②然后CPU使用 n值作为指向中断向量表IVT的索引,在IVT中找出服务例程的远地址。
②CPU将此远地垃装入CS:IP寄存器中,并开始执行服务例程。
④中断例程总以IRET指令结束。此指令使存在堆栈中的三个值弹出并填入CS、IP和标志寄存器,CPU继续执行原来的指令。
(2)保护模式中断
保护模式中断过程与实模式中断过程类似,但它不再使用中断向量表IVT,而使用中断描述符表(IDT)。值得一提的是,Windows运行时IVT还存在,应用程序并不使用它,Windows仍然使用,但含义已不同‘
(1)IVT结构:IVT在RAM的 0000:0000之上,占据开始的1024字节。它仍然由 BIOS启动例程设置,由DOS填充到RAM中。
②IDT中断描述符表:保护模式下,Windows操作系统为实现中断机制而建立的一个特殊表,即中断描述符表IDT。该表被用来保存中断服务例程的线性地址,它们是真正的24位或32位地址,没有段:偏移值结构。中断描述器表最多可含有256个例
程说明,详细说明请见[3]。 IDT结构见图2。
②当中断或异常发生时,处理过程与实模式类丁当前的CS; IP值和标志寄存器值被存储。保存的内容还包括CPU其他内部寄存器的值,以及目
前正在被执行的任务的有关信息(若必须发生任务切换的话)。CPU设法获取中断向量后,以它为索引值查找IDT中的服务例程远地址,接着将控制转移到该处的服务例程。这是与实模式转移到IVT的不同所在。保护模式使用IDTR寄存器分配和定位内存中的IDT中断描述符表。IDT在内存中是可移动的,与 IVT固定在内存中刚好相反。 IDT中断描述符表在 Windows中起决定性的作用。理解了windows保护模式的中断机制。有助于我们理解中断服务程序的设计,它的关键就在于如何将服务例程的地址放入 IDT中断描述符表中。当中断发生时,如何将断点地址及CPU各寄存器值保护起来,中断结束时,如何将保护的值恢复。 windows系统本身并不提供实现上述功能的API,而DOS保护模式接口DPMI正具备了上述的功能。
下面我们首先介绍DPMI接口,然后基于它实现Windows下中断服务程序的设计。
四、DOS保护模式接口 DMPI Windows除了标准服务外,还支持一组特殊的DOS服务,称为DOS保护模式接口 DPMI,由一些INT2FH和INT31H服务组成。它使应用程序能够访问 PC系列计算机的扩充内存,同时维护系统的保护功能。 DPMI通过软件中断31h来定义了一个新的接口,使得保护模式的应用程序能够用它作分配内存,修改描述符以及调用实模式软件等工作。
Windows为应用程序提供 DPMI服务。即Windows是DPMI的宿主(host),应用程序是DPMI的客户(client),可通过INT31H调用得到DPMI服务。 INT 31H本身提供多功能。其中它的中断管理服务允许保护模式用于拦截实模式中断,并且挂住处理器异常。有些服务能够和 DPMI宿主合作,以维护应用程序的虚拟中断标志。
可以用INT31H来挂住保护模式中断向量,以中断方式处理外部实时事件。利用 INT 21H,功能0205H:设置保护模式中断向量,将特定中断的保护模式处理程序的地址置入中断向量里。调用方式:
AX=0205H,BL=中断号,CX:(E)DX=中断处理程序选择符:偏移值。返回:执行成功CF=清零,执行失败CF,置位。
挂住/解挂中断向量的时机很重要。主窗口第一次被创建时会传送它WM—CREATE消息,这时是挂住中断向量的最好时机。退出时需解挂向量,否则 Windows可能崩溃。上窗口接收到WM_DESTROY之后进行解挂工作,是最适合的。解挂向量可先用INT35H,0204H功能将老的中断向量保存,退出时用INT35H,0205H恢复。
五、编程实现
有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以Windows3.1平台下中断方式实现的串行通信为例,说明中断程序的编制和实现。为便于参考,给出了详细的代码。开发平台BC3.1/BC4.5,其本身支持0.9版的DPMI,无需运行其它支持 DPMI的软件。编程语言C,可与C++混合编译。
初始化COM1,9600波特率,每字符8bits,1个停止位,中断接收,查询发送。
//windows asy COmmunica60n
//by Li Xiumi98
//last modified on June25,1996
#include <windows.h
#include <dos.h
void interrupt far DataReceive() ;
void interrupt far( * old_vector)();
unsigned char dataCom_r[1024],datacom_s[1024]:
int inflag=0 ;
unsigned int s8259;
int InitCom1()
{
s8259=inportb(0x21);
outportb(0x21,s82590xe8);
outportb(0x3fb,0x83);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00);
outportb(0x3fb,0x03);
outportb(0x3fc,0x08);
outportb(0x3f9,0x01);
return 1;
}
void interrupt far DataReceive()
{
static int i=0 ;
char rechar =0 ;
rechar=inportb(0x3f8);
if(inflag==0)
{
if(rechar!= 's 'i==0)
{
i=0;
goto l1;
}
datacom_r[i++]=rechar;
if(rechar== 'e ')
{
inflag=1;
i=0;
}
}
l1:outportb(0x20,0x20);
}
void InitCom(void)
{
asm{
cli;
mov ax,204h
mov bl,0ch
int 31h
sti
}
old_vector=MK_FP(_CX,_DX);
asm{
cli
mov ax,205h
mov bl,0ch
mov cx,seg datareceive
mov dx,offset datareceive
int 31h
sti
}
InitCom();
}
void restore_Comm(void)
{
outportb(0x21,s8259);
asm{
cli
mov ax,205h
mov bl,0ch
mov cx,seg old_vector
mov dx,offset old_vector
int 31h
sti
}
}
在窗口第一次被创建时会传送它WM_CREATE消息,这时调用initCom()即可。在主窗口关闭时,即主窗口中收到 WM_DESTROY消息时,调用Restore Comm()恢复原来的状态。
这样在对串口初始化,设置中断服务例程后,通信事件发生时,会立即跳入中断子程序中执行,越过系统的消息队列,达到实时处理通信事件的目的。而数据处理模块可通过全局标志f1,8访问全局的数据通信缓冲区获取实时数据。这种实现方式与基于消息机制的Windows通信API实现相比具有实时性强的的特点,因为它超过了Windows 系统的两极消息机制,上述程序已在实际系统中得到应用。在windows3.1支持下同时运行
三个Windows任务,服务器SERVER(内有实时串行通信,多个网络数据子服务,),客户CLIENT,FOXPRO数据库系统。整个系统运行良好。切换到WIN95平台下,系统也运行良好 。

rtss程序,rtss dll和rtdll的区别

实时系统RTX之理解实时系统RTX之理解实时系统RTX之理解实时系统RTX之理解实时系统RTX之理解实时系统RTX之理解实时系统RTX之理解实时系统RTX之理解
开发。Win32和RTSS程序都支持全部的RTX API中断管理API,但是有不同的响应时间和性能特点。
1. Win32 and Real-Time API
RTX支持Win32 API的一个子集,加附加了一个特殊的实时函数集,即RTAPI(实时API)。RTAPI函数在函数名的最前面都有标识“Rt”,一些RTAPI函数只是在标识头方面与Win32不同,而有一些则是RTX所特有的,如中断管理函数。RTX API仔细挑选了对实时应用有关的函数,而刻意忽略了一些对实时编程用处不大的函数(如GUI相关的函数调用)。一个期望的目标是大多数程序包含至少两个同时工作的部分——一个是基于Win32的进程(利用GUI和其他的Win32-only函数),另一个是执行实时处理的基于RTSS的进程。
2. RTX可执行映像
RTX提供了三种类型的可执行映像中断管理API:RTSS程序,RTSS DLL和RTDLL。RTSS程序等同于Win32程序。RTSS DLL是用来链接以提供一个导出函数库供其他RTSS程序使用的RTSS程序。RTSS DLL是纯RTSS程序,并且必须在调用它的RTSS程序之前被手工运行。RTDLL是被动的代码容器,在功能上与Win32 DLL类似,但在RTSS中运行。

上次电脑坏了,是因为资源不足,开机开不了,说是API不允许,请问API是个什么东西?

1。中断/异常相量中断管理API的装入和执行方式。
中断和异常都是异步发生的事件中断管理API,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作为trap区,所以在CE下arm使用高地址向量。下面我们来了解一下中断/异常向量的安装和执行过程。
在kernelStart的过程中通过程序将如下代码复制到ffff0000的位置.
VectorInstructions
ldr pc, [pc, #0x3E0-8] ; reset
ldr pc, [pc, #0x3E0-8] ; undefined instruction
ldr pc, [pc, #0x3E0-8] ; SVC
ldr pc, [pc, #0x3E0-8] ; Prefetch abort
ldr pc, [pc, #0x3E0-8] ; data abort
ldr pc, [pc, #0x3E0-8] ; unused vector location
ldr pc, [pc, #0x3E0-8] ; IRQ
ldr pc, [pc, #0x3E0-8] ; FIQ
而在ffff03e0的位置放上如下的数据,每一项(32bit)对应一个异常的跳转地址也就是winCE的异常/中断向量跳转表。该表项的内容就是发生异常后将要执行的服务程序的入口地址。具体如下。
VectorTable
DCD -1 ; reset
DCD UndefException ; undefined instruction
DCD SWIHandler ; SVC
DCD PrefetchAbort ; Prefetch abort
IF :DEF:ARMV4T :LOR: :DEF:ARMV4I
DCD OEMDataAbortHandler ; data abort
ELSE
DCD DataAbortHandler ; data abort
ENDIF
DCD -1 ; unused vector
DCD IRQHandler ; IRQ
DCD FIQHandler ; FIQ
在上面的这些代码/数据在内存空间上按照上述要求放置好以后,每次触发一个异常就自动运行到相应跳转表项所对应的地址执行。

2.异常/中断服务程序
在arm下,由于有7种异常状态包括reset、Undef exception�oftware interrupt(swi)、Prefech Abort、DataAbort、IRQ、FIQ七种异常/中断。reset仅在复位时发生,其中断管理API他6种都是在系统运行时发生。当任何一个异常发生并得到响应时,ARM 内核自动完成以下动作:
拷贝 CPSR 到 SPSR_<mode
设置适当的 CPSR 位:
改变处理器状态进入 ARM 状态
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断
更新 LR_<mode
设置 PC 到相应的异常向量
同时不管异常发生在ARM 还是Thumb 状态下,处理器都将自动进入ARM 状态。并且中断使能会自动被关闭。在这个时候由于部分通用寄存器是不同模式公用的,所以还需要保存这些将会被破坏的寄存器,待到处理完成的时候恢复这些寄存器被中断前的状态。另外在进入异常模式后,lr的值不一定就是我们所需恢复执行的位置,该位置受到异常类型和流水线误差的影响。在SWI模式下,LR就是返回值。在IRQ和FIQ中LR=LR-4,DataAbort下LR=LR-8;具体原因我们就不讨论了,有兴趣可以参看<基于ARM 的嵌入式程序开发要点一文。下面分别对这些服务程序进行分析。

2-1.undef exception服务程序

undef exception在执行到过非法的指令时产生,通常来模拟一些处理器不支持的功能,如浮点运算。简单说一下undef exception的过程:当当前指令为一条处理器不支持的指令时,处理器会自动动将该指令送交各协处理器(如MMU、FPU)处理,如果这些协处理器都无法识别这条指令的时候,就产生该异常。下面开始看相应的代码。
NESTED_ENTRY UndefException
sub lr, lr, #4 ; (lr) = address of undefined instruction
stmdb sp, {r0-r3, lr}
mov r1, #ID_UNDEF_INSTR
b CommonHandler
ENTRY_END UndefException
上面就是undef Exception的服务程序的入口处(已经将不参与编译和Thumb模式下的代码去掉),通过lr-=4计算出触发异常前的指令地址,同时保存r0-r3和lr入undef_exception stack用于最后恢复现场和取得异常指令本身,随后进入分发程序CommonHandler.CommonHandler是一个公共的异常服务程序,它通过不同的传入参数来进行处理,在这里mov r1,#ID_UNDEF_INSTR就是指定异常模式为undef Exception.

2-2.swi服务程序

按在ARM处理器的设计意图,系统软件的系统调用(SystemCalls)都是通过SWI指令完成。SWI相当于一个中断指令,不同的是SWI不是由外部中断源产生的,同时对应于SWI的异常向量位于0xc的位置或0xffff 000c的位置。也就是说当执行一个swi指令后,当前程序流中断,并转入0xc或0xffff000c执行,同时将CPSR_mode(当前程序状态寄存器)复制入SPSR_svc,转入SVC模式运行(使用特权模式的寄存器组)。也就是说系统通过执行SWI引发系统swi异常后切换入特权模式,系统调用功能号由swi xx后的xx决定,在运行完指定功能的代码后返回异常时的地址并恢复用户模式。我们看看,Wince中这部分代码是如何实现的。
DCD SWIHandler ; SVC<<--------------------------SWI入口点。

LEAF_ENTRY SWIHandler
IF {FALSE}
...
ENDIF
movs pc, lr
ENTRY_END SWIHandler
上面IF {FALSE}到ENDIF之间的代码在编译的时候是得不到编译的(事实上这部分代码是用于开发中调试使用的,针对特殊的硬件平台,一般与我们使用的硬件平台无关。所以下面摘抄的代码都不将不参与编译的内容写入),因此SWI服务程序就是一句话。movs pc, lr也就是直接回到SWI的地方,同时将SPSR_svc恢复到CPSR_mode中。这个过程中并没有进行在系统态执行特定系统指令序的工作,而仅仅是简单的返回,所以这不是系统调用,系统调用还需要根据调用号的不同运行指定的核心态代码。也就是说Wince的系统调用不是通过SWI来完成的,而是通过其他的异常处理手段达成的。
2-3 中断服务程序
IRQ(大概是最熟悉的异常方式了)在外部中断源在需要向处理器请求服务时发生,比如:时钟、外围器件FIFO上/下溢出、按键等等。IRQHandler就是中断的处理句柄,下面我们来具体看看。
----------------------------------------------------------------------------------
NESTED_ENTRY IRQHandler
sub lr, lr, #4 ; fix return address
stmfd sp!, {r0-r3, r12, lr} ;保存将要用到的寄存器和lr压入stack_irq
PROLOG_END
和上面一样,服务程序的入口处都是例行公事的计算返回位置以抵消流水线误差。再将要用到的寄存器压入STACK_IRQ,这样,准备工作就做完了。
; Test interlocked API status.
;INTERLOCKED_START EQU USER_KPAGE+0x380
;INTERLOCKED_END EQU USER_KPAGE+0x400
sub r0, lr, #INTERLOCKED_START
cmp r0, #INTERLOCKED_END-INTERLOCKED_START
bllo CheckInterlockedRestart
上面这部分的内容是关于互锁的检测,由于如信号量这些同步手段都必须作为原子操作进行,不允许打断。所以如果中断发生在互锁API的执行过程中,就需要专门的处理了。这些API都是放在INTERLOCKED_START和INTERLOCKED_END之间的,通过LR很容易就检查出是否是INTERLOCKEDXXX的过程中。这里并不关心互锁的实现就绕开这部分代码继续往下看,当作中断没有发生在interlock过程处理。
;
; CAREFUL! The stack frame is being altered here. It's ok since
; the only routine relying on this was the Interlock Check. Note that
; we re-push LR onto the stack so that the incoming argument area to
; OEMInterruptHandler will be correct.
;
mrs r1, spsr ; (r1) = saved status reg
stmfd sp!, {r1} ; save SPSR onto the IRQ stack
mov r0,lr ; parameter to OEMInterruptHandler
msr cpsr_c, #SVC_MODE:OR:0x80 ; switch to supervisor mode w/IRQs disabled
stmfd sp!, {lr} ; save LR onto the SVC stack
stmfd sp!, {r0} ; save IRQ LR (in R0) onto the SVC stack (param)
;
; Now we call the OEM's interrupt handler code. It is up to them to
; enable interrupts if they so desire. We can't do it for them since
; there's only on interrupt and they haven't yet defined their nesting.
;
CALL OEMInterruptHandler
ldmfd sp!, {r1} ; dummy pop (parameter)
ldmfd sp!, {lr} ; restore SVC LR from the SVC stack
msr cpsr_c, #IRQ_MODE:OR:0x80 ; switch back to IRQ mode w/IRQs disabled
; Restore the saved program status register from the stack.
;
ldmfd sp!, {r1} ; restore IRQ SPSR from the IRQ stack
msr spsr, r1 ; (r1) = saved status reg
ldr lr, =KData ; (lr) = ptr to KDataStruct
cmp r0, #SYSINTR_RESCHED ;-时间片已到,进行调度
beq %F10
;SYSINTR_DEVICES EQU 8 ;是否设备中断,中断号是否有效
;SYSINTR_MAX_DEVICES EQU 32
sub r0, r0, #SYSINTR_DEVICES
cmp r0, #SYSINTR_MAX_DEVICES
;由此可以看出windowsCE的系统中断号最大支持32种从9-40.
;其中第16号(24)被定义为SYSINTR_FIRMWARE
; If not a device request (and not SYSINTR_RESCHED)

ldrhsb r0, [lr, #bResched] ; (r0) = reschedule flag
bhs %F20 ; not a device request

;PendEvents EQU 0x340 ; offset 0x10*sizeof(DWORD) of aInfo
;device 中断
ldr r2, [lr, #PendEvents] ; (r2) = pending interrupt event mask
mov r1, #1
orr r2, r2, r1, LSL r0 ; (r2) = new pending mask
str r2, [lr, #PendEvents] ; save it
;*PendEvents = *PendEvents|(1<<InterruptNO);
;
; mark reschedule needed
;情况1:r0=SYSINTR_RESCHED=1
;情况2: r0 =r0-SYSINTR_DEVICES=SYSINTR_MAX_DEVICES
10 ldrb r0, [lr, #bResched] ; (r0) = reschedule flag
orr r0, r0, #1 ; set "reschedule needed bit"
strb r0, [lr, #bResched] ; update flag
20 mrs r1, spsr ; (r1) = saved status register value
and r1, r1, #0x1F ; (r1) = interrupted mode
cmp r1, #USER_MODE ; previously in user mode?
cmpne r1, #SYSTEM_MODE ; if not, was it system mode?
cmpeq r0, #1 ; user or system: is resched == 1
;if(SytemMode(spsr)||UserMode(spsr))r0!=1) return;
ldmnefd sp!, {r0-r3, r12, pc}^ ; can't reschedule right now so return
*************************************************************************************
sub lr, lr, #4
ldmfd sp!, {r0-r3, r12}
stmdb lr, {r0-r3}
ldmfd sp!, {r0}
str r0, [lr] ; save resume address
mov r1, #ID_RESCHEDULE ; (r1) = exception ID
b CommonHandler
ENTRY_END IRQHandler
将spsr_irq压入IRQ堆栈保存。为调用OEMInterruptHandler作准备。(通常中断处理程序切换入系统态执行的目的在于避免使用终端模式下的寄存器,以方便是实现终端套嵌,这儿切入系统态时终端使能是关闭的,对于模态切换的原因我很迷惑。)OEMInterrupt需要在特权模式下执行,所以这里增加了切换入特权(SVC)模式的内容。紧接着将要用与传递参数的寄存器保存。设定传入参数,r0就可以开始调用OEMInterruptHandler了,这里的调用规则遵循windowsCE的规范而不是ATPCS的规范。具体过程参考ARM Parameter Passing@msdn。下面是函数原形。int OEMInterruptHandler(unsigned int ra);这里传入的参数就是上面的r0,事实上r0代表的参数ra并没有实质的作用在这里仅仅是形式上的实现一下而已,不过在这儿可以看到这个传入的ra实际上就是被中断的地址,如果需要知道被中断的位置可以通过ra来查询,而msdn里面说这个参数是保留的。返回的参数也是保存在r0中。其中返回值是系统中断类型。其中SYSINTR_RESCHED为系统时钟中断,每次时间片用完,该时钟便产生中断,并设置kData结构的bResched位,进入调度流程。如果中断类型是系统设备中断,那就设置PendEvents,待再次调度的时候处理中断。所以OEMInterruptHandler必须提前就要对中断进行响应对该中断源设置mask,防止在这过程中同一中断不停发生,导致中断饱和影响程序流的执行,直道中断处理真正完成后再次开放该中断的mask。在这里还可以看到的是系统设备中断号的范围是从SYSINTR_DEVICES到SYSINTR_MAX_DEVICES,也就是从9-40一共32个设备中断号,其中SYSINTR_FIRMWARE为8+16号,这个在编写OAL的中断服务程序时需要注意。如果当前的返回值既不是设备中断号又不是调度中断号,则读出当前调度标示,根据该标示进行判断是否调度/或返回.如果是进入调度流程则恢复初始的寄存器状态,再按CommonHandler的要求保存寄存器。进入CommonHandler,等待分发。

2-3 FIQ服务程序
照例看看程序
NESTED_ENTRY FIQHandler
sub lr, lr, #4 ; fix return address
stmfd sp!, {r0-r3, r12, lr}
PROLOG_END
CALL OEMInterruptHandlerFIQ
ldmfd sp!, {r0-r3, r12, pc}^ ; restore regs return for NOP
ENTRY_END FIQHandler
LTORG
FIQ是arm体系下特有的异常方式,其工作过程与IRQ类似都是由外部引脚触发但设计用途不同,IRQ用于通常的外部中断源的处理,是作为统一、通用的与外部器件交互的手段,而IRQ仅仅用于处理周期短同时又需要快速处理的场合其触发的事件源通常也来此外部FIQ中断。如:更换电池、数据传输这类工作。可想而知FIQ讲究的是快速,精干。因此FIQ服务程序通常没有分发,而仅仅是针对单一的工作进行处理保证处理的实时性。因此FIQ的处理相对IRQ就简单很多,直接调用
OEMInterruptHandlerFIQ进行处理后返回就完成了整个 FIQ服务程序。 关于中断管理API和中断管理的三个层次的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 中断管理API的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于中断管理的三个层次、中断管理API的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口开发标准(接口开发是什么意思)
下一篇:自研API网关(api网关 bff)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~