硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5780|回复: 8
收起左侧

[有问必答] RTX的SVC中断问题

[复制链接]

11

主题

122

回帖

160

积分

初级会员

积分
160
发表于 2015-12-11 19:22:27 | 显示全部楼层 |阅读模式
看了楼主新发的RTX教程,关于RTX的SVC中断问题还是有点疑惑:

#define os_sys_init(tsk)              os_set_env();                           \
                                      _os_sys_init((U32)rt_sys_init,tsk,0,NULL)

extern void      _os_sys_init(U32 p, void (*task)(void), U32 prio_stksz,
                                     void *stk)                        __SVC_0;//网上查了资料,四个参数用r0~r3传递,不知对不对,#define __SVC_0         __svc_indirect(0)
到这就进SVC_Handler()里面了,
       .......
        MRS     R0,PSP                  ; Read PSP
        LDR     R1,[R0,#24]             ; Read Saved PC from Stack
        LDRB    R1,[R1,#-2]             ; Load SVC Number
        CBNZ    R1,SVC_User//非零跳转

        LDM     R0,{R0-R3,R12}          ; Read R0-R3,R12 from stack
        BLX     R12                     ; Call SVC Function
        ......
        疑问就在这,R12里是这么东西呢,为什么要调到R12中的地址运行。
        网上资料又说APCS标准,R12此时是指令指针ip,很多说法ip = sp,或是ip = lr;想不明白,请论坛大神帮忙解答下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106872
QQ
发表于 2015-12-11 19:44:52 | 显示全部楼层
这里的R12就是函数地址。
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2015-12-11 21:53:43 | 显示全部楼层

回 eric2013 的帖子

eric2013:这里的R12就是函数地址。 (2015-12-11 19:44) 
仿真看,确实是这样。只是不明白为什么这个这么特殊要用R12传递第一个参数,没找到相关资料。
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2015-12-11 22:13:57 | 显示全部楼层
终于找到为什么了,RealView编译工具3.1版里面有。 123页.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106872
QQ
发表于 2015-12-12 00:55:53 | 显示全部楼层

回 有梦为马 的帖子

有梦为马:终于找到为什么了,RealView编译工具3.1版里面有。 (2015-12-11 22:13) 
[s:142]
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2015-12-14 20:54:35 | 显示全部楼层

回 eric2013 的帖子

eric2013:这里的R12就是函数地址。 (2015-12-11 19:44) 
遇到个想了好久无法理解的问题,不知道是不是我断章取义了:
Sys_Switch
       .......
        LDR     R12,[R2,#TCB_TSTACK]    ; os_tsk.new->tsk_stack
        LDMIA   R12!,{R4-R11}           ; Restore New Context,这里恢复R4~R11寄存器
        MSR     PSP,R12                 ; Write PSP。此时R12指向的就是栈中R0的位置

        LDRB    R3,[R2,#TCB_RETUPD]     ; Update ret_val?
        CBZ     R3,Sys_Exit
        LDRB    R3,[R2,#TCB_RETVAL]     ; Write os_tsk.new->ret_val
        STR     R3,[R12]   ;这里是向R0中写值?
       这样的话不是破坏栈中R0数据了吗。
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2015-12-16 00:36:05 | 显示全部楼层

回 有梦为马 的帖子

有梦为马:遇到个想了好久无法理解的问题,不知道是不是我断章取义了:
Sys_Switch
       .......
        LDR     R12,[R2,#TCB_TSTACK]    ; os_tsk.new->tsk_stac .. (2015-12-14 20:54) 
貌似理解了些,不知对不对,请坛主指正。
P_TCB->ret_upd = 1
在SVC_Handler中被置1.
SVC中断服务被系统内核或用户调用,根据需要用R0~R3返回结果
用户级SVC服务:
__svc(x),为汇编编译器关键字,被它修饰的函数参数与普通子函数调用返回值规则一致
系统内核SVC服务:
__svc_indirect(int svc_num) return-typefunction-name(int real_num, [argument-list]);
real_num该值通过r12寄存器传递到中断处理函数中(异常时r12会入栈,
得从栈里取出)。此时r12为指令指针IP;

P_TCB->ret_upd = 0
在PENSV_Handler中被置0.

    R2 = os_tsk.new;
    LDRB    R3,[R2,#TCB_RETUPD]     ; Update ret_val?
    CBZ     R3,Sys_Exit                          //ret->upd = 0,任务就绪是在pensv中切换
    //ret->upd = 1.该任务在SVC中失能,此处又就绪,则返回结果到R0中。
        LDRB    R3,[R2,#TCB_RETVAL]     ; Write os_tsk.new->ret_val
        STR     R3,[R12]
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2015-12-16 09:18:31 | 显示全部楼层

回 有梦为马 的帖子

有梦为马:遇到个想了好久无法理解的问题,不知道是不是我断章取义了:
Sys_Switch
       .......
        LDR     R12,[R2,#TCB_TSTACK]    ; os_tsk.new->tsk_stac .. (2015-12-14 20:54) 
是的  就是要破坏r0的值  这个是rtx给每个系统调用赋予的一个有意义的返回值

rtx有很多返回值选项 例如ok tmo mbx等等

比如获得某个邮箱消息: 马上得到是ok ,通过等待成功是mbx ,超时是tmo
就是通过修改这个返回值的方式做到的
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2015-12-16 12:40:20 | 显示全部楼层

回 myxiaonia 的帖子

myxiaonia:是的  就是要破坏r0的值  这个是rtx给每个系统调用赋予的一个有意义的返回值

rtx有很多返回值选项 例如ok tmo mbx等等

....... (2015-12-16 09:18) 
明白你意思了。之前是按ucos的调度来理解的,所以对R0返回值问题有困惑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 10:46 , Processed in 0.316462 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表