打印

有个函数没想明白,也没找到资料,问一下

[复制链接]
1074|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aolongzx|  楼主 | 2015-3-16 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucosII中,任务删除函数 OSTaskDel (INT8U prio);中做了如下操作
1、从各种list中删除我们想要删除的任务
2、
OSLockNesting++;
OS_EXIT_CRITICAL();  
OS_Dummy();  
OS_ENTER_CRITICAL();
OSLockNesting--;
加锁,保证任务删除中不会切换到其他任务中去
开中断,然后执行一条空指令,关中断
3、删除任务tcb
我想问一下,2 这里为什么不把这几句话直接全都去掉,只有1和3,直接把任务从list中删除,再把tcb删除,全都完成之后在打开中断,为什么中间要加这几句,强制开一下中断执行1条中断指令后再返回来?


相关帖子

沙发
keer_zu| | 2015-3-16 15:09 | 只看该作者
很久没有关注过ucos了,难道是为了增加对中断的响应机会?提高实时性? @ayb_ice

使用特权

评论回复
板凳
ayb_ice| | 2015-3-16 16:25 | 只看该作者
keer_zu 发表于 2015-3-16 15:09
很久没有关注过ucos了,难道是为了增加对中断的响应机会?提高实时性? @ayb_ice  ...

怕过长的影响中断程序,也就是提高中断实时性,

因为进去就关掉中断了,处理时间长了,期间可能会有中断产生,处理完一部分后,开中断,这时可以响应中断,中断完了再后续处理。。。

使用特权

评论回复
地板
keer_zu| | 2015-3-17 09:32 | 只看该作者
ayb_ice 发表于 2015-3-16 16:25
怕过长的影响中断程序,也就是提高中断实时性,

因为进去就关掉中断了,处理时间长了,期间可能会有中断 ...

@aolongzx 我也这样想。

使用特权

评论回复
5
keer_zu| | 2015-3-25 12:57 | 只看该作者
yyy71cj 发表于 2015-3-19 14:56
这段代码我看了也脚得很神奇,又是信号量又是临界区的,真是要看了其中原理才晓得是做什么的了…… ...

其实很直观,目的也应该是这样。

使用特权

评论回复
6
keer_zu| | 2015-3-26 09:23 | 只看该作者
yyy71cj 发表于 2015-3-25 19:09
那好,我很想知道OS_Dummy();是做啥子滴……

OS_Dummy(); //该函数相当于NOP指令,空执行,等待一个时间周期
                     //在部分CPU中规定,中断开启后必须这样至少执行一个周期
                     //如果开启中断后立即关闭将可能导致中断关闭无效


UCOS_II学习笔记---任务管理之删除任务函数分析

使用特权

评论回复
7
keer_zu| | 2015-3-26 09:23 | 只看该作者
任务的删除意味着:

a) 它的任务控制块从OSTCBList链表中移到OSTCBFreeList,这样时钟节拍函数中就不会处理它了,这样调度把它置入就绪表的可能性就没了;

b) 如果它已经处于就绪表中,那么它将被移出,这样调度器函数就不会处理它,这样它被调度运行的机会就没了;

c) 如果任务处于邮箱、消息队列、信号量的等代表中,那么一旦条件满足(譬如邮箱接收到一条消息或者信号量被增1),它就有可能被置入就绪表,为此也要把它移出等待表!这些都完成了,任务就不会有机会占用CPU了,但是他的代码并不会被删除[至少目前这个版本(2.54)不会,如果你让他运行在RAM里面,而且丰富内存处理函数的话,那么可以象Linux那样删除它的代码在RAM中所占用的空间[RR3] ,rom里的不会被删除。其实任务删除函数做的就是让任务失去调度的可能性,它占用的资源并没有释放,为此系统提供了请求删除任务函数,它在可能被删除的任务中被调用,用来释放占用的资源:该任务可能占用那些资源可以从你写的任务代码中看出,所以你该知道怎么去释放!

@aolongzx @ayb_ice  

使用特权

评论回复
8
keer_zu| | 2015-3-26 09:25 | 只看该作者
本帖最后由 keer_zu 于 2015-3-26 09:27 编辑

函数名
OSTaskDel
参数
prio删除任务的优先级(0xFF表示当前任务)
功能描述
删除任务
函数原型
INT8U OSTaskDel(INT8U prio)
{
    OS_ENTER_CRITICAL(); //进入临界区0
    if (prio == OS_PRIO_SELF)//如果调用该函数时使用0XFF表示当前任务
    {             //就获取当前任务的优先级
        prio = OSTCBCur->OSTCBPrio;
    }

    ptcb = OSTCBPrioTbl[prio];
    if (ptcb != (OS_TCB *) 0) //判断删除的任务是否存在
    {
        //取消当前删除的任务在就绪表中的登记
        if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00)
        {
             OSRdyGrp &= ~ptcb->OSTCBBitY;
        }

        ptcb->OSTCBDly = 0;       //设置等待时间为0,防止系统时钟中断更新此值
        ptcb->OSTCBStat = OS_STAT_RDY;//设置状态为OS_STAT_RDY,防止此任务再次回复执行

        //调度器加锁
        if (OSLockNesting < 255)
        {
            OSLockNesting++;//任务调度锁定次数加1
        }                  //(上锁的任务是可以中断)

        OS_EXIT_CRITICAL();//退出临界区0                              
       OS_Dummy(); //该函数相当于NOP指令,空执行,等待一个时间周期
                     //在部分CPU中规定,中断开启后必须这样至少执行一个周期
                     //如果开启中断后立即关闭将可能导致中断关闭无效

        OS_ENTER_CRITICAL();//进入临界区1

        //调度器解锁                    
        if (OSLockNesting > 0)
        {
             OSLockNesting--;//任务调度锁定次数减1
        }

        OSTaskCtr--; //任务数减1
        OSTCBPrioTbl[prio] = (OS_TCB *) 0; //清除该任务的TCB相关项
        if (ptcb->OSTCBPrev == (OS_TCB *) 0)//判断是否位于当前任务TCB位于链头
        {
             ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *) 0;//从TCB链中删除当前任务的TCB
             OSTCBList = ptcb->OSTCBNext;
        }
        else//当前任务TCB不在链表头
        {
             ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
             ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
        }

        ptcb->OSTCBNext = OSTCBFreeList;//将删除任务的TCB添加到空闲TCB链表中
        OSTCBFreeList  = ptcb;    //

        OS_EXIT_CRITICAL();   //退出临界区1
        OS_Sched();      //从就绪表中找出最高优先级并执行对应的代码段

        return (OS_NO_ERR);   //如果调度器上锁,就执行该语句
    }
    OS_EXIT_CRITICAL();//退出临界区0

    return (OS_TASK_DEL_ERR);//删除的任务不存在,返回错误信息
}


@ayb_ice @aolongzx

使用特权

评论回复
9
keer_zu| | 2015-3-30 10:29 | 只看该作者
yyy71cj 发表于 2015-3-26 14:18
啊,原来是这么回事……
看来,有BUG不要紧,只要有解决BUG的方法就行…… ...

楼主消失了?

使用特权

评论回复
10
aolongzx|  楼主 | 2015-3-30 17:57 | 只看该作者
谢谢各位的帮助,之前想明白了就没再看,不好意思

使用特权

评论回复
11
keer_zu| | 2015-3-31 09:10 | 只看该作者
aolongzx 发表于 2015-3-30 17:57
谢谢各位的帮助,之前想明白了就没再看,不好意思

想明白了?结果分享一下呗

使用特权

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

本版积分规则

5

主题

18

帖子

0

粉丝