打印

请教W90P710 IRQ中断的问题

[复制链接]
1674|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3B1105|  楼主 | 2010-8-12 20:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我写的IRQ_Handler程序。

        EXPORT IRQ_Handler
    IMPORT Fake_Interrupt ,WEAK
    IMPORT Int1_Interrupt ,WEAK
    IMPORT Int2_Interrupt ,WEAK
    IMPORT Int3_Interrupt ,WEAK
    IMPORT Int4_Interrupt ,WEAK
    IMPORT Int5_Interrupt ,WEAK
    IMPORT Int6_Interrupt ,WEAK
    IMPORT Int7_Interrupt ,WEAK
    IMPORT Int8_Interrupt ,WEAK
    IMPORT Int9_Interrupt ,WEAK
        IMPORT Int10_Interrupt ,WEAK
        IMPORT Int11_Interrupt ,WEAK
        IMPORT Int12_Interrupt ,WEAK
        IMPORT Int13_Interrupt ,WEAK
        IMPORT Int14_Interrupt ,WEAK
        IMPORT Int15_Interrupt ,WEAK
        IMPORT Int16_Interrupt ,WEAK
        IMPORT Int17_Interrupt ,WEAK
        IMPORT Int18_Interrupt ,WEAK
        IMPORT Int19_Interrupt ,WEAK
        IMPORT Int20_Interrupt ,WEAK
        IMPORT Int21_Interrupt ,WEAK
        IMPORT Int22_Interrupt ,WEAK
        IMPORT Int23_Interrupt ,WEAK
        IMPORT Int24_Interrupt ,WEAK
        IMPORT Int25_Interrupt ,WEAK
        IMPORT Int26_Interrupt ,WEAK
        IMPORT Int27_Interrupt ,WEAK
        IMPORT Int28_Interrupt ,WEAK
        IMPORT Int29_Interrupt ,WEAK
        IMPORT Int30_Interrupt ,WEAK
        IMPORT Int31_Interrupt ,WEAK

AIC_IPER EQU 0xFFF8210C

        AREA    IRQ , CODE ,READONLY

IRQ_Handler
        SUB     LR, LR, #4                     
                STMFD   SP!, {R0-R12, LR}   
        MSR     CPSR_c, #0X9F                     ;// Switch to User module
        LDR R2, =AICBase
        
        LDR R3, =AIC_IPER
        LDR R3,[R3]
        LDR R1, [R2,R3] ; gets the highest pendingvector
        LDR PC, [PC, R1] ; jump to correct handler
        NOP
        ;table of handler start address
AICBase
                DCD Fake_Interrupt
        DCD Int1_Interrupt
        DCD Int2_Interrupt
        DCD Int3_Interrupt
        DCD Int4_Interrupt
        DCD Int5_Interrupt
        DCD Int6_Interrupt
        DCD Int7_Interrupt
        DCD Int8_Interrupt
        DCD Int9_Interrupt
        DCD Int10_Interrupt
        DCD Int11_Interrupt
        DCD Int12_Interrupt
        DCD Int13_Interrupt
        DCD Int14_Interrupt
        DCD Int15_Interrupt
        DCD Int16_Interrupt
        DCD Int17_Interrupt
        DCD Int18_Interrupt
        DCD Int19_Interrupt
        DCD Int20_Interrupt
        DCD Int21_Interrupt
        DCD Int22_Interrupt
        DCD Int23_Interrupt
        DCD Int24_Interrupt
        DCD Int25_Interrupt
        DCD Int26_Interrupt
        DCD Int27_Interrupt
        DCD Int28_Interrupt
        DCD Int29_Interrupt
        DCD Int30_Interrupt
        DCD Int31_Interrupt
        
        rAIC_EOSCR = 0;
        MSR     CPSR_c, #0X92                ;// Switch to IRQ module
        LDMFD   SP!, {R0-R12, PC}^                                       
    END   




这些是在IQR_Handler里面的,而Int1_Interrupt ~Int31_Interrupt是准备用C语言实现的中断函数。比如

void Int1_Interrupt(void)
{
         
}


请大家找出错误与不合理之处。万分感激

相关帖子

沙发
3B1105|  楼主 | 2010-8-12 20:10 | 只看该作者
问题是:
这样写是通过LDR PC, [PC, R1] 语句跳转到中断服务函数中的,但是如果中断服务函数运行完的话PC还会跳回到
LDR PC, [PC, R1] 后面的语句,也就是NOP 语句执行吗,这样写是不是不科学?

使用特权

评论回复
板凳
6019实验室| | 2010-8-12 20:44 | 只看该作者
肯定不科学呢,你在进去IRQ_Handler的时候不是保存了LR和cpsr了么,你出来的时候要恢复他们的值啊,中断是中断了一个正在运行的进程,但是当中断完成的时候,你得恢复这个进程继续执行,而不是进到一个nop里面啥也不做,系统不就挂掉了么。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

315

主题

1645

帖子

4

粉丝