OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5222|回复: 4

ucos 第一次启动时OSStart相关代码提问

[复制链接]

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-11-27
在线时间
23 小时
发表于 2014-5-28 11:30:19 | 显示全部楼层 |阅读模式
5金钱
void  OSStart (void)
{
    if (OSRunning == OS_FALSE) {
        OS_SchedNew();                               /* Find highest priority's task priority number   */
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();                            /* Execute target specific code to start task     */
    }
}
OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI2                                   ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI ;设置PendSV异常优先级
    STRB    R1, [R0]


    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0    ;写通用寄存器R0的值到PSP

    LDR     R0, __OS_Running                                    ; OSRunning = TRUE,设置运行标志位
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET ;促发PendSV异常
    STR     R1, [R0]

    CPSIE   I   ;开总中断                                       ; Enable interrupts at processor level  

OSStartHang
    B       OSStartHang                                         ; Should never get here

;Cortex-M3进入异常服务例程时,自动压栈了R0-R3,R12,LR(R14,连接寄存器),PSR(程序状态寄存器)和PC(R15).并且在返回时自动弹出
OSPendSV
    ;MRS     R3, PRIMASK  ;             
    ;CPSID   I  ;
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, OSPendSV_nosave                                 ; skip register save the first time

    SUBS    R0, R0, #0x20                                       ; save remaining regs r4-11 on process stack
    STM     R0, {R4-R11}

    LDR     R1, __OS_TCBCur                                     ; OSTCBCur->OSTCBStkPtr = SP;
    LDR     R1, [R1]
    STR     R0, [R1]                                            ; R0 is SP of process being switched out

                                                                ; at this point, entire context of process has been saved
OSPendSV_nosave
    PUSH    {R14}                                              
    LDR     R0, __OS_TaskSwHook                                 ; OSTaskSwHook();
    BLX     R0
    POP     {R14}

    LDR     R0, __OS_PrioCur                                    ; OSPrioCur = OSPrioHighRdy;
    LDR     R1, __OS_PrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]

    LDR     R0, __OS_TCBCur                                     ; OSTCBCur  = OSTCBHighRdy;
    LDR     R1, __OS_TCBHighRdy
    LDR     R2, [R1]
    STR     R2, [R0]

    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
    LDM     R0, {R4-R11}                                        ; restore r4-11 from new process stack
    ADDS    R0, R0, #0x20
    MSR     PSP, R0                                             ; load PSP with new process SP
    ORR     LR, LR, #0x04                                       ; ensure exception return uses process stack
;MSR     PRIMASK, R3  ;
    BX      LR                                                  ; exception return will restore remaining context

问题1:OSStart()函数里面OSPrioCur     = OSPrioHighRdy;     OSTCBCur      = OSTCBHighRdy;为什么在OSPendSV_nosave里面再次赋值?
问题2:LDM R0,{R4-R11}
这句汇编于语言的意思是什么?
麻烦大家指导指导!

最佳答案

查看完整内容[请看2#楼]

1、俩段程序,一个只运行一次,一个会多次运行,做相同的事很正常;当然,你提到它们首次有重复是对的。  2、LDM是批量加载指令。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-5-28 11:30:20 | 显示全部楼层
1、俩段程序,一个只运行一次,一个会多次运行,做相同的事很正常;当然,你提到它们首次有重复是对的。
 2、LDM是批量加载指令。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-11-27
在线时间
23 小时
 楼主| 发表于 2014-5-28 15:09:26 | 显示全部楼层
LDR     R0, __OS_PrioCur                                    ; OSPrioCur = OSPrioHighRdy;
    LDR     R1, __OS_PrioHighRdy
    LDRB    R2, [R1] 
    STRB    R2, [R0]     我觉得这几行代码可以删除,大家觉得呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2014-5-28 23:20:14 | 显示全部楼层
帮顶....
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-11-27
在线时间
23 小时
 楼主| 发表于 2014-5-29 15:23:26 | 显示全部楼层
LDM R0,{R4-R11}这句汇编于语言的意思是什么?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 12:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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