打印
[NXP ARM]

请问有关IRQ.S的2个问题

[复制链接]
1425|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无冕之王|  楼主 | 2010-6-7 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ST, ps, TI, DSP
问题如下:
1:此段程序是IRQ.S中的,请问在什么地方将调用它.

2.如$IRQ_Label 此类的写法中$是什么意思,后面的Label指的有那些?

多有不懂之处请指教,请大家知道的说一下,解决我的疑惑.在此先谢大家了.

程序如下:

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

相关帖子

沙发
火箭球迷| | 2010-6-8 20:39 | 只看该作者
是这样的这是为IRQ中断处理所写的一个宏汇编,目的用于处理进入中断后的保护工作和执行玩中断后退出时的恢复工作,因为所有IRQ的这部分都差不多所有写了一个通用的宏。

使用特权

评论回复
板凳
火箭球迷| | 2010-6-8 20:39 | 只看该作者
编译后宏展开每个中断服务程序都会包含这部分代码,唯一不同的是下面一句:
BL      $IRQ_Exception_Function         ; call the C interrupt

IRQ_Exception_Function 是你用c写的IRQ中断服务函数。

$是宏参数标志。

看一下ARMc编译知识。

使用特权

评论回复
地板
zwll| | 2010-6-8 22:51 | 只看该作者
楼上正解

使用特权

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

本版积分规则

个人签名:喜欢远行

160

主题

3331

帖子

0

粉丝