当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

【.Net MF深入研究】中断处理机制

    .Net Micro Framework的中断处理机制相对比较简单,不支持中断嵌套,中断优先级功能的实现由相关硬件提供支持,软件层面仅仅进行相关优先级的设定即可。

    下面以TI DM335开发板为例简单介绍一下相关技术细节(这里仅介绍普通中断IRQ)。

    1 中断向量表

    我们知道中断向量表一般默认的存放在内存0起始地址处。

    先让我们在NativeSample或TinyCLR目录中找到Scatterfile_tools_xxx.xml文件,我们会发现在其中都会有如下这么一段文字:

    <ExecRegion Name="ER_RAM_RO" Base="0x00000000" Options="ABSOLUTE" Size="0x1A000">

    <FileMapping Name="VectorsTrampolines.obj" Options="(+RO, +FIRST)" />

    </ExecRegion>

    这是一个编译选项,告诉arm编译器,连接时把VectorsTrampolines.obj的相关内容放在位置0处(我们可以用WinHex查看编译后的Bin文件,我们会发现Bin文件中最开始的内容就是中断向量表的内容)。

    下面是VectorsTrampolines.s文件的汇编代码:

    ;**************************************************************************

    IMPORT UNDEF_SubHandler

    IMPORT ABORTP_SubHandler

    IMPORT ABORTD_SubHandler

    IMPORT IRQ_Handler ; from stubs.cpp

    EXPORT arm_Vectors

    ;**************************************************************************

    AREA |.text|, CODE, READONLY

    ; ARM directive is only valid for arm/THUMB processor, but not CORTEX

    IF :DEF:COMPILE_arm :LOR: :DEF:COMPILE_THUMB

    arm

    ENDIF

    arm_Vectors

    ; RESET

    RESET_VECTOR

    b UNDEF_VECTOR

    ; UNDEF INSTR

    UNDEF_VECTOR

    ldr pc, UNDEF_SubHandler_Trampoline

    ; SWI

    SWI_VECTOR

    DCD 0xbaadf00d

    ; PREFETCH ABORT

    PREFETCH_VECTOR

    ldr pc, ABORTP_SubHandler_Trampoline

    ; DATA ABORT

    DATA_VECTOR

    ldr pc, ABORTD_SubHandler_Trampoline

    ; unused

    USED_VECTOR

    DCD 0xbaadf00d

    ; IRQ

    IRQ_VECTOR

    ldr pc, IRQ_SubHandler_Trampoline

    ; FIQ

    ; we place the FIQ handler where it was designed to go, immediately at the end of the vector table

    ; this saves an additional 3+ clock cycle branch to the handler

    FIQ_Handler

    IF :DEF: FIQ_SAMPLING_PROFILER

    ldr pc,FIQ_SubHandler_Trampoline

    FIQ_SubHandler_Trampoline

    DCD FIQ_SubHandler

    ENDIF

    UNDEF_SubHandler_Trampoline

    DCD UNDEF_SubHandler

    ABORTP_SubHandler_Trampoline

    DCD ABORTP_SubHandler

    ABORTD_SubHandler_Trampoline

    DCD ABORTD_SubHandler

    ; route the normal interupt handler to the proper lowest level driver

    IRQ_SubHandler_Trampoline

    DCD IRQ_Handler

    ;**************************************************************************

    从中我们可以看出,当硬件触发IRQ中断时,跳转的最终位置为IRQ_Handler.

    「疑问」中断向量表的内容最开始的时候一定是存放在Flash(或其它存储介质)中,它是如何被转移到内存0处的呢(当然调试时也可以通过调试器把中断向量表直接Download到内存中去)?

    「解答」在FirstEntry.s汇编代码中有这么一句代码 “bl BootstrapCode”,BootstrapCode是一个子函数,该函数优先于“b BootEntry”执行,在BootstrapCode函数中又调用了一个子函数PrepareImageRegions,在PrepareImageRegions函数中我们就可以看到拷贝中断向量表的相关代码:

    UINT32* src = (UINT32*)&LOAD_RAM_RO_BASE;

    UINT32* dst = (UINT32*)&IMAGE_RAM_RO_BASE;

    UINT32 len = (UINT32 )&IMAGE_RAM_RO_LENGTH + (UINT32)&Image$$ER_RAM_RW$$Length;

    Prepare_Copy( src, dst, len );

    注:FIQ_SAMPLING_PROFILER选项是没有定义的,所以在DM335开发板上支持FIQ是有问题的。

    2 中断函数(IRQ_Handler)

    中断向量表一经设置,则触发相关中断时,CPU会把PC指针指到相关的入口地址处,对IRQ中断来说,其入口地址就是IRQ_Handler.

    对DM335平台,IRQ_Handler函数的内容如下:

    void __irq IRQ_Handler(void)

    {

    DM335_INTC_Driver::IRQ_Handler();

    }

    void /*__irq*/DM335_INTC_Driver::IRQ_Handler(void)

    {

    DM335_INTC &pAic = DM335::INTC();

    unsigned int index;

    // set before jumping elsewhere or allowing other interrupts

    SystemState_SetNoLock(SYSTEM_STATE_ISR);

    SystemState_SetNoLock(SYSTEM_STATE_NO_CONTINUATIONS);

    while(pAic.IRQENTRY != 0x0)

    {

    index = (pAic.IRQENTRY>>2) - 1;

    if(index < 32)

    pAic.IRQ0 |= 1 << index;

    else

    pAic.IRQ1 |= 1 << (index % 32);

    s_IsrTable[index].Handler.Execute(); //执行对应的中断处理函数

    }

    SystemState_ClearNoLock(SYSTEM_STATE_NO_CONTINUATIONS); // nestable

    SystemState_ClearNoLock(SYSTEM_STATE_ISR); // nestable

}

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接