搜索
bottom↓
回复: 17

探讨UCOII任务的调度

[复制链接]

出0入0汤圆

发表于 2011-6-15 11:22:18 | 显示全部楼层 |阅读模式
大家好,最近要搞UCOS,不过我一直不清出它的任务怎么调度的,
下面是MAIN函数的代码:
int  main (void)
{
    CPU_INT08U  err;

    BSP_IntDisAll();                 /* Disable all interrupts until we are ready to accept them */

    OSInit();                        /* Initialize "uC/OS-II, The Real-Time Kernel"              */

    Mcu_Init();

    OSTaskCreateExt(AppTaskStart,    /* Create the start task                                    */
                    (void *)0,
                    (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],
                    APP_TASK_START_PRIO,
                    APP_TASK_START_PRIO,
                    (OS_STK *)&AppTaskStartStk[0],
                    APP_TASK_START_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

#if (OS_TASK_NAME_SIZE > 13)
    OSTaskNameSet(APP_TASK_START_PRIO, "Start Task", &err);
#endif

    OSStart();        /* Start multitasking (i.e. give control to uC/OS-II)       */
}

我的问题是:我创建的任务AppTaskStart什么时候执行,我看了一下OSStart(); 发现它是个死循环,那我的任务就不能执行了吗?

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是段汇编

OSStartHighRdy
        PUSH    {R4,R5}
        
        LDR     R4, =NVIC_SYSPRI2       ; set the PendSV exception priority
        LDR     R5, =NVIC_PENDSV_PRI
        STR     R5, [R4]
      
        MOV     R4, #0                  ; set the PSP to 0 for initial context switch call
        MSR     PSP, R4

        LDR     R4, __OS_Running        ; OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]

        LDR     R4, =NVIC_INT_CTRL      ; trigger the PendSV exception (causes context switch)
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]
        
        POP     {R4,R5}
        
        CPSIE   I                       ; enable interrupts at processor level
OSStartHang
        B       OSStartHang             ; should never get here

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-6-15 11:41:47 | 显示全部楼层
在PendSV服务程序中会切换到你的创建的任务AppTaskStart。

出0入0汤圆

 楼主| 发表于 2011-6-15 13:37:51 | 显示全部楼层
回复【1楼】TimCheng
-----------------------------------------------------------------------

请问怎么到在PendSV服务程序中呢

出0入0汤圆

发表于 2011-6-15 15:56:20 | 显示全部楼层
//ucosII源程序
OSStart()
{
...
OS_SchedNew();      //找到最高优先级任务堆栈( 即OSTCBHighRdy )
...
OSStartHighRdy();   //根据OSTCBHighRdy 切换至目标任务堆栈( 即更新了PC,SP,REG... )
}

出0入0汤圆

 楼主| 发表于 2011-6-15 17:33:09 | 显示全部楼层
回复【3楼】lxx_sea_sky
-----------------------------------------------------------------------
这是OSStartHighRdy汇编,我就是没有看到那个地方更新了PC,能否解释一下
OSStartHighRdy
        PUSH    {R4,R5}
         
        LDR     R4, =NVIC_SYSPRI2       ; set the PendSV exception priority
        LDR     R5, =NVIC_PENDSV_PRI
        STR     R5, [R4]
      
        MOV     R4, #0                  ; set the PSP to 0 for initial context switch call
        MSR     PSP, R4

        LDR     R4, __OS_Running        ; OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]

        LDR     R4, =NVIC_INT_CTRL      ; trigger the PendSV exception (causes context switch)
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]
         
        POP     {R4,R5}
         
        CPSIE   I                       ; enable interrupts at processor level
OSStartHang
        B       OSStartHang             ; should never get here

出0入0汤圆

发表于 2011-6-15 18:13:30 | 显示全部楼层
trigger the PendSV exception (causes context switch)
这注释的还不够明显吗?

出0入0汤圆

发表于 2011-6-16 10:07:36 | 显示全部楼层
【5楼】 cht-rtos 已经指出了切换任务上下文的地方: "trigger the PendSV exception (causes context switch) ".

再详细点应该是:触发PendSV异常,PendSV异常会执行上下文切换(补:上下文切换会更新PC,SP等)。
(我也是个新手,查的是“ARM Cortex-M3权威指南.pdf - 第7.6节”,若说错了,还望cht-rtos指正)

出0入0汤圆

 楼主| 发表于 2011-6-16 13:59:13 | 显示全部楼层
回复【6楼】lxx_sea_sky
-----------------------------------------------------------------------

谢谢你的提示,请问pendsv异常在那个文件中.
我用的是STM32F103x8,也是Cortex™-M3.

出0入0汤圆

发表于 2011-6-16 16:18:27 | 显示全部楼层
我看的ucosII是基于msp430的,cortex-m3才刚看了一点。
ucosII的移植文件主要有三个os_cpu_c.c、os_cpu_a.*、os_cpu.h,应该在前两个文件中可以找到。
( 你找到OSStartHighRdy()的文件应该是os_cpu_a.*,不对的话,就帮不到你了。 )

出0入0汤圆

 楼主| 发表于 2011-6-17 15:18:40 | 显示全部楼层
大家好,通过几天学习,我发现任务切换是发生在以下函数中
OSPendSV
        MRS     R0, PSP                 ; PSP is process stack pointer
        THUMB         ;Barry346333764
        CBZ     R0, OSPendSV_nosave     ; skip register save the first time
  
        CPSID   I                       ;close cpu interrupt
        
        MRS     R0, MSP   
        SUB     R0, R0, #0x20           ; save remaining regs r4-11 on process stack
        STMIA   R0, {R4-R11}

        LDR     R4, __OS_TCBCur         ; OSTCBCur->OSTCBStkPtr = SP;
        LDR     R4, [R4]
        STR     R0, [R4]                ; R0 is SP of Main being switched out
        MSR     MSP, R0                 ; update MSP for next use
                                        ; at this point, entire context of process has been saved
OSPendSV_nosave
        MOV     R0, #0x2200
        MSR     PSP, R0
        
        PUSH    {R14}                   ; need to save LR exc_return value
        LDR     R0, __OS_TaskSwHook     ; OSTaskSwHook();
        BLX     R0
        POP     {R14}

        LDR     R4, __OS_PrioCur        ; OSPrioCur = OSPrioHighRdy
        LDR     R5, __OS_PrioHighRdy
        LDRB    R6, [R5]
        STRB    R6, [R4]

        LDR     R4, __OS_TCBCur         ; OSTCBCur  = OSTCBHighRdy;
        LDR     R6, __OS_TCBHighRdy
        LDR     R6, [R6]
        STR     R6, [R4]

        LDR     R0, [R6]                ; R0 is new Main SP; SP = OSTCBHighRdy->OSTCBStkPtr;
        LDMIA   R0, {R4-R11}            ; restore r4-11 from new Main stack
        ADD     R0, R0, #0x20
        MSR     MSP, R0                 ; load MSP with new Main SP
              
        CPSIE   I // ORR     LR, LR, #0x04           ; ensure exception return uses process stack
        
        BX      LR                      ; exception return will restore remaining context

        NOP

但是我看不太明白这段代码,所以我不知道,是那里发生了,以为我没有发现类似与LDR PC,=MAIN这样的命令,不知道那个地方更改了PC的值,希望大家一起来探讨一下.

出0入0汤圆

 楼主| 发表于 2011-6-17 17:08:03 | 显示全部楼层
请大都来解答一下

出0入0汤圆

发表于 2011-6-17 17:13:10 | 显示全部楼层
//仔细查阅Cortex-M3权威指南.pdf,应该都能找到的。
//注释了大致流程,应该没弄错

OSPendSV                                ; 程序入口,自动压栈 R0-R3,R12,LR,PC,PSR --(1)
                                        ; [疑问:此处堆栈指针是PSP or MSP ???]
        ...
         
        MRS     R0, MSP                 ; 加载旧的MSP->R0
        SUB     R0, R0, #0x20           ; save remaining regs r4-11 on process stack
        STMIA   R0, {R4-R11}            ; 以R0(旧的MSP)为堆栈指针,压栈 R4-R11  --(2)

        ...

        LDR     R0, [R6]                ; R0 is new Main SP; SP = OSTCBHighRdy->OSTCBStkPtr; 加载新的MSP->R0
        LDMIA   R0, {R4-R11}            ; 以R0(新的MSP)为堆栈指针,出栈 R4-R11  --(2)
        ADD     R0, R0, #0x20
        MSR     MSP, R0                 ; 从R0 更新MSP

        ...

        BX   LR                         ; 程序出口,自动出栈 R0-R3,R12,LR,PC,PSR --(1)
                                        ; [同入口处疑问,但应该是同一个堆栈指针PSP/MSP]

//注:(1)+(2)刚好是CM3的16个寄存器R0-R15

出0入0汤圆

 楼主| 发表于 2011-6-17 22:39:39 | 显示全部楼层
回复【11楼】lxx_sea_sky
-----------------------------------------------------------------------

兄弟,你有QQ吗

出0入0汤圆

发表于 2011-6-20 10:29:00 | 显示全部楼层
今天看到第9章,找到了11楼“[疑问:此处堆栈指针是PSP or MSP ???] ”的答案。
响应异常:
依次把xPSR, PC, LR, R12以及R3-R0由硬件自动压入适当的堆栈中。
如果当响应异常时,当前的代码正在使用PSP,则压入PSP,也就是使用进程堆栈;否则就压入MSP,使用主堆栈。
一旦进入了服务例程,就将一直使用主堆栈。

-----
不好意思,QQ只作私人用途。
而且我很懒,下班不工作是我的追求^-^

出0入0汤圆

发表于 2011-6-20 10:39:33 | 显示全部楼层
简单的做个了解,LS分析的很透侧啊

出0入0汤圆

 楼主| 发表于 2011-6-20 15:53:32 | 显示全部楼层
谢谢大家的关注,现在有新问题来了,
当任务1启动后,不知道怎么去切换到任务2种,应该有很多种方式,大家一起来讨论.
这里有小细节大家要注意一下,任务1是优先级别最高.

出0入0汤圆

 楼主| 发表于 2011-6-20 16:13:05 | 显示全部楼层
我决定就这个问题在发一个贴,我想应该能有更多的人来参与.

出0入0汤圆

发表于 2011-6-20 16:19:30 | 显示全部楼层
ucos-ii中文版教程(第二版).pdf  作者:邵贝贝(应该是,我下载的版本没标注作者,有点不确定)
第2章 实时系统概念 中的 2.6节 任务切换
建议通读全书,特别是第2-7章

-----
这些资料网上很多,本论坛也有
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-23 11:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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