打印
[ZLG-ARM]

SmartARM2200的UCOS移植模板中IRQ.S文件中一段代码求解

[复制链接]
1343|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
id001|  楼主 | 2009-4-19 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在IRQ中断处理宏中有以下一段代码: 

   MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
   LDR     R2, =OsEnterSum; OsEnterSum,使OSIntExit退出时中断关闭
   MOV     R1, #1
   STR     R1, [R2]

   BL      OSIntExit

   LDR     R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0
   MOV     R1, #0
   STR     R1, [R2]

我想求教大家的是:
   LDR     R2, =OsEnterSum; OsEnterSum,使OSIntExit退出时中断关闭
   MOV     R1, #1
   STR     R1, [R2]



   LDR     R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0
   MOV     R1, #0
   STR     R1, [R2]

这两个部分什么作用???我个人觉的好像是多余的···请指点·

另:这段代码之前的:MSR CPSR_c, #(NoInt | SYS32Mode); 切换到系统模式
    这条语句意义也不是很明确,请大家讲解一下,谢谢····
 
---------------------------------------------------------------------
文件中IRQ部分完成的代码是:
    CODE32

    AREA    IRQ,CODE,READONLY

    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; 输出的标号
        IMPORT  $IRQ_Exception_Function         ; 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP, {R3, SP, LR}^               ; 保存用户状态的R3,SP,LR,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        LDR     R2,  =OSIntNesting              ; OSIntNesting++
        LDRB    R1, [R2]
        ADD     R1, R1, #1
        STRB    R1, [R2]

        SUB     SP, SP, #4*3
        
        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
        CMP     R1, #1
        LDREQ   SP, =StackUsr
        
        BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
        LDR     R2, =OsEnterSum                 ; OsEnterSum,使OSIntExit退出时中断关闭
        MOV     R1, #1
        STR     R1, [R2]

        BL      OSIntExit

        LDR     R2, =OsEnterSum                 ; 因为中断服务程序要退出,所以OsEnterSum=0
        MOV     R1, #0
        STR     R1, [R2]

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
        LDMFD   SP, {R3, SP, LR}^               ; 恢复用户状态的R3,SP,LR,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        LDR     R0, =OSTCBHighRdy
        LDR     R0, [R0]
        LDR     R1, =OSTCBCur
        LDR     R1, [R1]
        CMP     R0, R1

        ADD     SP, SP, #4*3                    ; 
        MSR     SPSR_cxsf, R3
        LDMEQFD SP!, {R0-R3, R12, PC}^          ; 不进行任务切换
        LDR     PC, =OSIntCtxSw                 ; 进行任务切换
    MEND

相关帖子

沙发
id001|  楼主 | 2009-4-20 09:54 | 只看该作者

自己来回答


   LDR     R2, =OsEnterSum; OsEnterSum,使OSIntExit退出时中断关闭
   MOV     R1, #1
   STR     R1, [R2]



   LDR     R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0
   MOV     R1, #0
   STR     R1, [R2]

自己仔细的分析了一下,这段代码的作用是避免调用函数OSIntExit时打开IRQ中断,避免一些情况下的任务切换次数统计错误。

使用特权

评论回复
板凳
initer| | 2009-4-20 10:31 | 只看该作者

好像有些复杂啊

使用特权

评论回复
地板
qingfengyishi| | 2009-4-20 13:22 | 只看该作者

建议仔细看看ucosii的书

建议仔细看看ucosii的书

使用特权

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

本版积分规则

35

主题

107

帖子

0

粉丝