打印

周立功ucos移植困惑1

[复制链接]
2347|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vipchenvip|  楼主 | 2012-2-7 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 vipchenvip 于 2012-2-7 17:29 编辑

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语言的中断处理程序
        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



这是中断处理的宏定义,我们假设中断执行到OSIntNesting++之前,发生了中断嵌套,这个高优先级的中断在OSIntExit()里更新了最高优先级的任务,接下来进行了任务切换,那岂不是在中断嵌套中切换了任务,最先的那个中断的处理函数岂不是要等到任务恢复最高优先级才能运行?
PS:感觉对OsEnterSum这个变量的操作没什么意义,求解释

相关帖子

沙发
xinzha| | 2012-2-8 08:54 | 只看该作者
OSIntNesting++之前没有中断嵌套,因为此时的cpsr中的I位已经被硬件禁止,想要重新开启中断必须利用某种手段更改cpsr。
OsEnterSum这个变量在新版的usos中没有出现,说实话我也实在被这段汇编绕迷糊了,不知道他们想干什么。后来的ucos代码比这个要干净很多,还是拿到最新的吧,既然ucos已经改了,说明还是对以前的不满意。另外要注意,ucos对arm/thumb混编处理极差,小心出问题。

使用特权

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

本版积分规则

1

主题

65

帖子

1

粉丝