打印
[ZLG-ARM]

关于 OSIntCtxSw_1 的一些想法

[复制链接]
1397|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
blueseed|  楼主 | 2009-12-28 18:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NTC, os, ps, RS, TE
我把这部分代码做了更改,先前的代码,改变了SVC的堆栈,而现在的代码不会更改SVC的堆栈,我这样改是不是更好的,如果不好,不好在哪里?
OSIntCtxSw_1
                                                    ;获取新任务堆栈指针
        
        LDR     R4, [R6]
        ADD     SP, R4, #68                         ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
        LDR     LR, [SP, #-8]
      
       //MSR     CPSR_c, #(NoInt | SVC32Mode)        ;进入管理模式
        MOV     SP, R4                              ;设置堆栈指针
        LDMFD   SP!, {R4, R5}                       ;CPSR,OsEnterSum
                                                    ;恢复新任务的OsEnterSum
        LDR     R3, =OsEnterSum
        STR     R4, [R3]
   
        MSR     CPSR, R5                       ;恢复CPSR
       // LDMFD   SP!, {R0-R12, LR, PC }^             ;运行新任务
      
        LDMFD   SP!, {R0-R12, LR, PC }

相关帖子

沙发
desert_hawk| | 2009-12-29 08:42 | 只看该作者
这样改应该会出现问题。我觉得主要问题可能会由“MSR  CPSR, R5”这条指令引起。若即将切换到的任务是thumb状态的任务,而目前处理器状态显然是ARM状态,这样改变处理器的运行状态会产生不确定的结果(因为流水线中还有预取到的ARM状态指令)。
而“LDMFD   SP!, {R0-R12, LR, PC }^”却不会出现问题,因为在这条指令中同时改变了PC和CPSR, 改变PC即为程序跳转,在跳转的过程中会清空流水线,所以切换到thumb状态不会引起不确定结果。

使用特权

评论回复
板凳
五谷道场| | 2010-1-1 11:51 | 只看该作者
想法不错啊,呵呵

使用特权

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

本版积分规则

6

主题

20

帖子

1

粉丝