请教一个关于RL-ARM 代码中os_set_env的问题

[复制链接]
5595|14
 楼主| onsunsl 发表于 2012-8-6 09:21 | 显示全部楼层 |阅读模式
最近看了RL-ARM代码,在初始化调用了os_set_env ,有点不解:


/*--------------------------- os_set_env ------------------------------------*/

__asm void os_set_env (void) {
        /* Switch to Unpriviliged/Priviliged Thread mode, use PSP. */
        MOV     R0,SP                            //; R0 = MSP
        MSR     PSP,R0
       //; PSP = R0
        LDR     R0,=__cpp(&os_flags)      //; R0 = &os_flags
        LDRB    R0,[R0]
      //; R0 = *R0
        LSLS    R0,#31
      //; R0 = R0 << 31逻辑左移
        MOVNE   R0,#0x02                   //; Priviliged Thread mode, use PSP   if(R != 0x02)
        MOVEQ   R0,#0x03                  //; Unpriviliged Thread mode, use PSP
if(R == 0x03)
        MSR     CONTROL,R0
    //; CONTROL = R0
        BX      LR
    //; return

        ALIGN
}


这个一段RL-ARM的代码,功能是根据os_flags来设定CM3的CONTROL寄存器,即改变模式和使用PSP

问题是:程序返回时,直接进了SVC_Handler ,难道对CONTROL写操作会引发异常?



/*-------------------------- SVC_Handler -----------------------------------*/
// 11# 异常服务,执行系统服务调用指令SVC引发的异常
__asm void SVC_Handler (void)
{
}
   


求高手签定,谢谢
shyinyang 发表于 2012-8-6 12:32 | 显示全部楼层
虽然我不会!但是这个帖子不能沉了!顶起来让更多的人知道
 楼主| onsunsl 发表于 2012-8-6 20:35 | 显示全部楼层
真是沉了
看来用RTL的人少啊,RTL是一个不错的os
 楼主| onsunsl 发表于 2012-8-6 20:43 | 显示全部楼层
RL-ARM不错。

    描述                RX Kernel
支持的进程数             最多256
支持的信箱数             无限制
支持的信号量数           无限制
支持的互斥量数           无限制
支持的信号量数           每个进程16个
支持的用户定时器数       无限制
RAM 要求                 最少500字节
代码要求                 小于5 K字节
硬件要求                 一个或多个片上时钟可用
用户进程优先级           1 - 255
进程切换的时间          小于5µs @60MHz, 0 ws.
中断停止时间            小于1.8 µ @60MHz, 0 ws
pattywu 发表于 2012-8-6 21:40 | 显示全部楼层
你肯定是没有仔细跟踪代码。
你查一下<rtx.h>头文件中,有关os_set_env ()函数的宏定义,就明白是怎么回事。
 楼主| onsunsl 发表于 2012-8-7 18:40 | 显示全部楼层
顶起来
 楼主| onsunsl 发表于 2012-8-7 18:42 | 显示全部楼层
你肯定是没有仔细跟踪代码。
你查一下头文件中,有关os_set_env ()函数的宏定义,就明白是怎么回事。
pattywu 发表于 2012-8-6 21:40

5楼也用RT-ARM?
 楼主| onsunsl 发表于 2012-8-7 18:43 | 显示全部楼层
搞明白了

#define __SVC_0         __svc_indirect(0)
extern void      _os_sem_init (U32 p, OS_ID semaphore,
                                      U16 token_count)                 __SVC_0;

异常是由__svc_indirect(0)产生的
 楼主| onsunsl 发表于 2012-8-7 18:46 | 显示全部楼层
RL-ARM 实时库用户指南.zip (718.6 KB, 下载次数: 563)
火箭球迷 发表于 2012-8-7 18:47 | 显示全部楼层
解决问题的速度还是很快的
pkat 发表于 2012-8-7 19:01 | 显示全部楼层
118245
onsunsl 发表于 2012-8-7 18:46

很不错的指南,多谢共享
dfsa 发表于 2012-8-7 19:06 | 显示全部楼层
你肯定是没有仔细跟踪代码。
你查一下头文件中,有关os_set_env ()函数的宏定义,就明白是怎么回事。
pattywu 发表于 2012-8-6 21:40

应该就是头文件的问题
pattywu 发表于 2012-8-7 21:48 | 显示全部楼层
你在***论坛不是也问了啊?
    我在那边回答了你。
 楼主| onsunsl 发表于 2012-8-11 16:53 | 显示全部楼层
谢谢,楼上
bd7qwmcu 发表于 2016-12-14 10:48 | 显示全部楼层
搜到了,看看。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

27

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部