OpenEdv-开源电子网

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

UCOSIII就绪任务列表的疑惑

[复制链接]

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-9-30 14:22:30 | 显示全部楼层 |阅读模式
3金钱
void  OS_RdyListInsert (OS_TCB  *p_tcb),里面为啥要根据任务的优先级是否是当前优先级,如果是当前优先级就尾插到就绪任务列表,如果不是就头插。我想问WHY?另外吐槽我粘贴代码过来是C格式不是不行?



void  OS_RdyListInsert (OS_TCB  *p_tcb)
{
    OS_PrioInsert(p_tcb->Prio);
    if (p_tcb->Prio == OSPrioCur) {                         /* Are we readying a task at the same prio?               */
        OS_RdyListInsertTail(p_tcb);                        /* Yes, insert readied task at the end of the list        */
    } else {
        OS_RdyListInsertHead(p_tcb);                        /* No,  insert readied task at the beginning of the list  */
    }
#if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
        TRACE_OS_TASK_READY(p_tcb);                         /* Record the event.                                      */
#endif
}

最佳答案

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

我觉得这样可能是因为运行的永远是最新就绪的任务。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-7-31
在线时间
31 小时
发表于 2017-9-30 14:22:31 | 显示全部楼层
1547674987 发表于 2017-10-10 14:26
所以我的问题还是为啥不都搞成尾插,新加个任务排在该优先级就绪任务链表最前面,不知道为啥这么干?

我觉得这样可能是因为运行的永远是最新就绪的任务。
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
 楼主| 发表于 2017-9-30 17:27:55 | 显示全部楼层
我的主要疑惑在于,为啥如果任务不是当前优先级,就头插到就绪任务列表,这不是赤果果的插队吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-10-9 00:48:10 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-7-31
在线时间
31 小时
发表于 2017-10-10 11:53:06 | 显示全部楼层
首先如果是当前优先级的话,也就是ucosiii允许了时间片轮转调度,所以插入就绪标表的尾端。ucosiii在做任务切换的时候总是切换到该优先级下的就绪表的第一个任务。当不是同一个优先级的时候,不确定该优先级是否有任务就绪,所以直接插入到头部。
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
 楼主| 发表于 2017-10-10 14:25:13 | 显示全部楼层
就绪任务的尾插函数是会对该优先级下的就绪链表的数量进行判断的啊,我贴出来。
void  OS_RdyListInsertTail (OS_TCB  *p_tcb)
{
    OS_RDY_LIST  *p_rdy_list;
    OS_TCB       *p_tcb2;



    p_rdy_list = &OSRdyList[p_tcb->Prio];
    if (p_rdy_list->NbrEntries == (OS_OBJ_QTY)0) {          /* CASE 0: Insert when there are no entries               */
        p_rdy_list->NbrEntries  = (OS_OBJ_QTY)1;            /*         This is the first entry                        */
        p_tcb->NextPtr          = (OS_TCB   *)0;            /*         No other OS_TCBs in the list                   */
        p_tcb->PrevPtr          = (OS_TCB   *)0;
        p_rdy_list->HeadPtr     = p_tcb;                    /*         Both list pointers point to this OS_TCB        */
        p_rdy_list->TailPtr     = p_tcb;
    } else {                                                /* CASE 1: Insert AFTER the current tail of list          */
        p_rdy_list->NbrEntries++;                           /*         One more OS_TCB in the list                    */
        p_tcb->NextPtr          = (OS_TCB   *)0;            /*         Adjust new OS_TCBs links                       */
        p_tcb2                  = p_rdy_list->TailPtr;
        p_tcb->PrevPtr          = p_tcb2;
        p_tcb2->NextPtr         = p_tcb;                    /*         Adjust old tail of list's links                */
        p_rdy_list->TailPtr     = p_tcb;
    }
}
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
 楼主| 发表于 2017-10-10 14:26:57 | 显示全部楼层
所以我的问题还是为啥不都搞成尾插,新加个任务排在该优先级就绪任务链表最前面,不知道为啥这么干?
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-7-31
在线时间
31 小时
发表于 2017-10-10 14:52:24 | 显示全部楼层
1547674987 发表于 2017-10-10 14:25
就绪任务的尾插函数是会对该优先级下的就绪链表的数量进行判断的啊,我贴出来。
void  OS_RdyListInsertTa ...

看代码的话不就是如果该优先级下的就绪任务为0则插入头,如果不为0插入入尾啊。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 13:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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