使一个任务进入就绪态,OSEventTaskRdy()

2024-06-19 14:08

本文主要是介绍使一个任务进入就绪态,OSEventTaskRdy(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序清单 L6.6是函数OSEventTaskRdy()的源代码。当发生了某个事件,该事件等待任务列表中的最高优先级任务(Highest Priority Task – HPT)要置于就绪态时,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用OSEventTaskRdy()实现该操作。换句话说,该函数从等待任务队列中删除HPT任务(Highest Priority Task),并把该任务置于就绪态。图 F6.4给出了OSEventTaskRdy()函数最开始的4个动作。

该函数首先计算HPT任务在.OSEventTbl[]中的字节索引[L6.6/F6.4(1)],其结果是一个从0到OS_LOWEST_PRIO/8+1之间的数,并利用该索引得到该优先级任务在.OSEventGrp中的位屏蔽码[L6.6/F6.4(2)](从表T6.1可以得到该值)。然后,OSEventTaskRdy()函数判断HPT任务在.OSEventTbl[]中相应位的位置[L6.6/F6.4(3)],其结果是一个从0到OS_LOWEST_PRIO/8+1之间的数,以及相应的位屏蔽码[L6.6/F6.4(4)]。根据以上结果,OSEventTaskRdy()函数计算出HPT任务的优先级[L6.6(5)],然后就可以从等待任务列表中删除该任务了[L6.6(6)]。

任务的任务控制块中包含有需要改变的信息。知道了HPT任务的优先级,就可以得到指向该任务的任务控制块的指针[L6.6(7)]。因为最高优先级任务运行条件已经得到满足,必须停止OSTimeTick()函数对.OSTCBDly域的递减操作,所以OSEventTaskRdy()直接将该域清澈0[L6.6(8)]。因为该任务不再等待该事件的发生,所以OSEventTaskRdy()函数将其任务控制块中指向事件控制块的指针指向NULL[L6.6(9)]。如果OSEventTaskRdy()是由OSMboxPost()或者OSQPost()调用的,该函数还要将相应的消息传递给HPT,放在它的任务控制块中[L6.6(10)]。另外,当OSEventTaskRdy()被调用时,位屏蔽码msk作为参数传递给它。该参数是用于对任务控制块中的位清零的位屏蔽码,和所发生事件的类型相对应[L6.6(11)]。最后,根据.OSTCBStat判断该任务是否已处于就绪状态[L6.6(12)]。如果是,则将HPT插入到µC/OS-II的就绪任务列表中[L6.6(13)]。注意,HPT任务得到该事件后不一定进入就绪状态,也许该任务已经由于其它原因挂起了。[见4.07节,挂起一个任务,OSTaskSuspend(),和4.08节,恢复一个任务,OSTaskResume()]。

另外,.OSEventTaskRdy()函数要在中断禁止的情况下调用。

程序清单 L6.6 使一个任务进入就绪状态

void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)

{

    OS_TCB *ptcb;

    INT8U   x;

    INT8U   y;

    INT8U   bitx;

    INT8U   bity;

    INT8U   prio;

 

 

    y    = OSUnMapTbl[pevent->OSEventGrp];                          (1)

    bity = OSMapTbl[y];                                             (2)

    x    = OSUnMapTbl[pevent->OSEventTbl[y]];                       (3)

    bitx = OSMapTbl[x];                                             (4)

    prio = (INT8U)((y << 3) + x);                                   (5)

    if ((pevent->OSEventTbl[y] &= ~bitx) == 0) {                   (6)

        pevent->OSEventGrp &= ~bity;

    }

    ptcb                 =  OSTCBPrioTbl[prio];                     (7)

    ptcb->OSTCBDly       =  0;                                      (8)

    ptcb->OSTCBEventPtr  = (OS_EVENT *)0;                           (9)

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN

    ptcb->OSTCBMsg       = msg;                                    (10)

#else

    msg                  = msg;

#endif

    ptcb->OSTCBStat     &= ~msk;                                   (11)

    if (ptcb->OSTCBStat == OS_STAT_RDY) {                          (12)

        OSRdyGrp        |=  bity;                                  (13)

        OSRdyTbl[y]     |=  bitx;

    }

}

这篇关于使一个任务进入就绪态,OSEventTaskRdy()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075237

相关文章

如何设置windows计划任务

如何设置windows计划任务 前言:在工作过程中写了一个python脚本,用于调用jira接口查询bug单数量,想要在本地定时任务执行,每天发送到钉钉群提醒,写下操作步骤用于记录。 1. 准备 Python 脚本 确保你的 Python 脚本已经保存到一个文件,比如 jira_reminder.py。 2. 创建批处理文件 为了方便任务计划程序运行 Python 脚本,创建一个批处理文

linux cron /etc/crontab 及 /var/spool/cron/$USER 中定义定时任务

简介 定时任务在linux上主要体现在两个地方,一个是/etc/crontab ,另一个就是定义了任务计划的用户/var/spool/cron/$USER 1、crontab -e 或者直接编辑/etc/crontab文件,这种方式用的人比较多,/etc/crontab是系统调度的配置文件,只有root用户可以使用,使用时需root权限,而且必须指定运行用户,才会执行 * * * * * *

任务5.1 初识Spark Streaming

实战概述:使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架,用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统,能够处理流式数据并统计文本中的单词出现频率。 2. 技术要点 Spark Streaming集成: 与Spark生态的其他组件如Spark SQL、ML

【FreeRTOS】任务管理与调度

文章目录 调度:总结 调度: 相同优先级的任务轮流运行最高优先级的任务先运行 可以得出结论如下: a 高优先级的任务在运行,未执行完,更低优先级的任务无法运行b 一旦高优先级任务就绪,它会马上运行(假设厨房着火了,会马上去灭火)c 如果最高优先级的任务有多个,他们轮流运行 他们都是使用链表进行管理 打开CubeMX,最高优先级56 56个List, Rad

biostar handbook: 第五周笔记汇总+第六周任务布置

简单总结下第五周的笔记: biostarhandbook(五)|序列从何而来和质量控制YXF-测序仪和质量控制Biostar学习笔记(5)测序平台、测序原理及质量控制Biostar第六课 测序仪和QC 顺便发布第六周的任务: 第六周的任务是第十章和第十一章。其中第十一章介绍的是序列模式,是对正则表达式的温故知新。第十一章则是开始序列分析的重要一步:序列联配。任务如下: 什么是正则表达式什么

biostar handbook: 第四周笔记汇总+第五周任务布置

不知不觉已经过去了四周,这个系列的开篇语写于2017年10月14日,距离今天差不多是一个月的时间了。这个月的时间学的内容并不算多,大致也就是如下几个内容: *nux基础: 这个尤为重要,学会了*nix(Linux或unix)之后,如果能够在日常科研生活中进行使用,那么你的效率将会大大提高。数据格式: 数据的保存具有一定的格式,处理数据的前提在于知己知彼,这样才能选择合适的工具。这个部分内容包括知

biostar handbook: 第三周笔记汇总+第四周任务布置

就目前来看,这一周主要以补交上次作业为主,所以上一周的总结增加了很多新内容。但是关于本体论和富集分析,大家还是有点小困难。当然我自己交东西也慢了很多,因为时间也总是不太够,完全靠周末挤出来。 第三周笔记汇总如下 Biostar学习笔记(3)Gene set analysis related topics.本体论biostarhandboo(四)|本体论和功能分析基因本体论 第四周作业发布

biostar handbook: 第二周笔记汇总+第三周任务布置

第二周已经结束了,我不确定大家对Linux到底了解到了什么程度,但是我觉得再给一周时间让初学者去熟悉Linux肯定是必要的。于是这一周的任务不会太难,只需要让大家去理解本体论(ontology)。 笔记汇总 这周有一些小伙伴开始遭遇人生抉择,有一些则是要出差赶路,所以上交作业不算太多。可能大家对自己的要求有点高了,其实我一直强调的是笔记的不断迭代,只要你写了一点内容就可以发出来,后来不断修改,

函数和任务的区别

函数和任务的主要区别是:任务能够消耗时间而函数不能。以在类外定义函数和任务为例: //1.类 class driver extend uvm_driver#(transaction) … extern virtual function void print_info(); extern task print_information; endclass //2.函数 function void