打印
[ZLG-ARM]

中断嵌套问题

[复制链接]
1392|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiger84|  楼主 | 2008-3-27 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/************************************/


NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

    CODE32

    AREA    IRQ,CODE,READONLY

    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; The label for exports 输出的标号
        IMPORT  $IRQ_Exception_Function         ; The imported labels 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; Calculate the returning address 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; Protects the task environments 保存任务环境
        MRS     R3, SPSR                        ; Protects the status variable 保存状态
        STMFD   SP, {R3,LR}^                    ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写
                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
        NOP
        SUB     SP, SP, #4*2

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; Switch to the System Mode 切换到系统模式 
       
        BL      $IRQ_Exception_Function         ; call the C interrupt handler funtion 调用c语言的中断处理程序

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; Switch bak to IRQ mode 切换回irq模式
        LDMFD   SP, {R3,LR}^                    ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写
                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
        MSR     SPSR_cxsf, R3
        ADD     SP, SP, #4*2                    ; 

        LDMFD   SP!, {R0-R3, R12, PC}^          ;
    MEND

;/* 以下添加中断句柄,用户根据实际情况改变 */
;/* Add interrupt handler here,user could change it as needed */

;Timer0_Handler  HANDLER Timer0
Timer1_Handler  HANDLER Timer1
I2C_Handler  HANDLER I2C
    END
/************************************/
其中
Timer1_Handler  HANDLER Timer1
I2C_Handler  HANDLER I2C
是我自己加的,
写中断函数,Timer1,I2C都没有加关键字“_irq”
初始化IRQ中断时,是初始化Timer1_Handler,I2C_Handler,
编译的时候出现错误,说是undefined。
这个应该怎么解决呢?
还有,中断嵌套还有什么要注意的

相关帖子

沙发
zlgarm| | 2008-3-27 17:18 | 只看该作者

tiger84,您好!

关于中断嵌套的使用,请参考我们光盘中提供的示例,以及相关资料。

                                                                                     On duty: zlgarm_Zhangxiaomeng

使用特权

评论回复
板凳
tiger84|  楼主 | 2008-3-27 17:55 | 只看该作者

光盘里没有IRQ嵌套中断的例子

我就直接用了FIQ,效果目前还不错。

不过还是想了解IRQ中断嵌套,我是严格按照书上的要求做的,只是编译时会出现我用HANDLER 定义的Timer1_Handler,I2C_Handler没有定义。
望大侠指点一二。

使用特权

评论回复
地板
tiger84|  楼主 | 2008-3-27 17:58 | 只看该作者

还有,觉得LPC2300的IRQ的优先级没什么意义了

既然发生IRQ中断后,就不允许别的IRQ中断了,那优先级又有什么意义呢?
望大侠指教。

使用特权

评论回复
5
biao.l| | 2008-3-31 16:42 | 只看该作者

re

$IRQ_Label HANDLER $IRQ_Exception_Function
$IRQ_Label  Timer1_Handler初始化VIC中断所用地址,声明一下
$IRQ_Exception_Function Timer1中断处理函数名,不要加__irq
应该编译不会出错的,

为了响应高优先级,进中断后应该关掉这个中断和低优先级的中断,中断标志清0,退出中断前恢复所有中断.

使用特权

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

本版积分规则

101

主题

862

帖子

0

粉丝