打印
[uCOS/RTOS]

请教前辈:OSTaskSuspend函数 与 OSTaskResume函数?

[复制链接]
6008|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robotouch|  楼主 | 2014-2-18 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我看到有文献说“OSTaskResume函数并不要求和OSTaskSuspend函数成对使用”,那如果我在未调用过OSTaskSuspend函数挂起某任务的情况下,调用了OSTaskResume函数,会有什么效果?

相关帖子

沙发
robotouch|  楼主 | 2014-2-23 12:45 | 只看该作者

使用特权

评论回复
板凳
贾丝文| | 2014-2-24 00:11 | 只看该作者
如果被恢复的任务级别比较低,则只登记任务就绪;如果级别高,就会任务切换。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
robotouch + 2
地板
ballack_linux| | 2014-2-25 00:00 | 只看该作者
建议楼主看下UCOS源码,里面写的很清楚,如果当前指定优先级的任务之前不是挂起状态,则直接返回,否则,会清除挂起标志,并判断是否进入就绪状态,接着继续判断多任务调度标志是否置位,如果已经置位,那么发生任务调度!!
#if OS_TASK_SUSPEND_EN > 0
INT8U  OSTaskResume (INT8U prio)
{
    OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3                                   /* Storage for CPU status register       */
    OS_CPU_SR  cpu_sr = 0;
#endif

#if OS_ARG_CHK_EN > 0
    if (prio >= OS_LOWEST_PRIO) {                             /* Make sure task priority is valid      */
        return (OS_ERR_PRIO_INVALID);
    }
#endif
    OS_ENTER_CRITICAL();
    ptcb = OSTCBPrioTbl[prio];
    if (ptcb == (OS_TCB *)0) {                                /* Task to suspend must exist            */
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_RESUME_PRIO);
    }
    if (ptcb == OS_TCB_RESERVED) {                            /* See if assigned to Mutex              */
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_NOT_EXIST);
    }
    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended                */
        ptcb->OSTCBStat &= ~(INT8U)OS_STAT_SUSPEND;           /* Remove suspension                     */
        if (ptcb->OSTCBStat == OS_STAT_RDY) {                 /* See if task is now ready              */
            if (ptcb->OSTCBDly == 0) {
                OSRdyGrp               |= ptcb->OSTCBBitY;    /* Yes, Make task ready to run           */
                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                OS_EXIT_CRITICAL();
                if (OSRunning == OS_TRUE) {
                    OS_Sched();                               /* Find new highest priority task        */
                }
            } else {
                OS_EXIT_CRITICAL();
            }
        } else {                                              /* Must be pending on event              */
            OS_EXIT_CRITICAL();
        }
        return (OS_ERR_NONE);
    }
    OS_EXIT_CRITICAL();
    return (OS_ERR_TASK_NOT_SUSPENDED);
}
#endif

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
robotouch + 2
5
llpanda| | 2014-2-26 21:42 | 只看该作者
因为如果你对未挂起的任务使用OSTaskResume,因为TCB的OSTCBStat对应的位不为1,代码在检查中发现未挂起,就退出了
即 ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY
所以,结果是什么也没做,并返回一个OS_ERR_TASK_NOT_SUSPENDED
剩下的分给我吧,谢谢!

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
robotouch + 2
6
杨爱林林| | 2014-3-4 10:49 | 只看该作者
好贴

使用特权

评论回复
7
robotouch|  楼主 | 2014-3-4 14:24 | 只看该作者
杨爱林林 发表于 2014-3-4 10:49
好贴

:handshake

使用特权

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

本版积分规则

58

主题

313

帖子

2

粉丝