打印
[ZLG-ARM]

lpc2200开发版带的ucos-2移植的高效版的软件中断的问题

[复制链接]
1490|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlwg|  楼主 | 2007-9-26 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

;软件中断的程序部分如下:
SoftwareInterrupt
        CMP     R0, #12
        LDRLO   PC, [PC, R0, LSL #2]
        MOVS    PC, LR   ;根据r0值来决定swi的功能

SwiFunction
        DCD     TASK_SW                 ;0
        DCD     ENTER_CRITICAL          ;1
        DCD     EXIT_CRITICAL           ;2
        DCD     ISRBegin                ;3
        DCD     ChangeToSYSMode         ;4
        DCD     ChangeToUSRMode         ;5
        DCD     __OSStartHighRdy        ;6
        DCD     TaskIsARM               ;7
        DCD     TaskIsTHUMB             ;8
        DCD     OSISRNeedSwap           ;9
        DCD     GetOSFunctionAddr       ;10
        DCD     GetUsrFunctionAddr      ;11

TASK_SW    ;任务中的任务切换由此进入
        MRS     R3, SPSR                        ;保存任务的CPSR
        MOV     R2, LR                          ;保存任务的PC
        
        MSR     CPSR_c, #(NoInt | SYS32Mode)    ;切换到系统模式
        STMFD   SP!, {R2}                       ;保存PC到堆栈
        STMFD   SP!, {R0-R12, LR}               ;保存R0-R12,LR到堆栈
        
                           ;因为R0~R3没有保存有用数据,所以可以这样做?
                                                
        B       OSIntCtxSw_0                    ;真正进行任务切换


以上只是截取了软件中断程序的开始一部分,我的问题是在软件中断的最开始为什么没有保存全部的寄存器r0-r12到堆栈哪?因为实际的工程中,若用c语言写程序,则无法保证c函数不会使用某一个在寄存器,例如r2或r3等等,若软件中断的最开始没有保存r2或r3,而软件中断中有使用了r2,r3,则就很有可能破坏掉c函数中的r2或r3的值.
所以我觉得这个程序只适用于简单的事先已经知道程序中不会用到r0-r3的情况,若复杂一些的系统直接使用此移植代码则会出问题.不知我的理解对不对?

相关帖子

沙发
jlwg|  楼主 | 2007-9-28 06:20 | 只看该作者

我的想法是对的,我没仔细看源文件,源文件注释摘录如下

提高SWI异常服务程序的效率--只有一个默认的公共功能号(0),而具体执行何种软件中断;通过参数R0来确定,通过这种方法省去了常规的需要判断功能号和判断发生软中断时是arm;还是thumb状态的步骤,提高了一定的效率,但要注意这种方法不是通用的,只适用于swi;程序比较简单的r0不被用来传递其他参数的情况,例如本列。

使用特权

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

本版积分规则

20

主题

146

帖子

0

粉丝