自己动手从0到1学写RTOS学习指南

  1. 主页
  2. 自己动手从0到1学写RTOS学习指南
  3. 第5章 事件控制块实现
  4. 事件的等待与通知

事件的等待与通知

内容纲要

本小节我们学习事件控制块的两个核心操作:事件的等待与通知。这两个操作也是其它同步与通信组件的等待与通知基础。

从实现上来说,这两个操作并不复杂。与之前学习的任务延时/退出延时所涉及的操作基本类似,区别就只在于这里是将任务插入事件等待队列而不是延时队列。

嗯,从某种意义上讲,任务延时到达也算是一种事件,可以考虑用事件控制块来处理。只不过为简单起见,二者独立实现。

主要内容

引入了事件控制块后,OS内核的核心数据组织就有了如下变化。如下图所示,可以看到每引入一个事件控制块,就多了一个任务队列。

同时还会导致任务的状态变迁图中多了一个状态。

在任务等待/退出等待操作中,任务需要在就绪表、延时队列(如果有设置超时)、事件控制块等待队列三者之间完成相应的插入/删除操作。

重点难点

注意事项

唤醒哪个任务

在最初设计这门课时,为了简单起见,唤醒事件控制块中的任务时总是唤醒队列首部的任务,而这个任务并不一定是高优先级任务。如果你希望让高优先级任务真正地具有高优先权,那么当通知时,也应当唤醒最高的优先级任务,让其处理这个事件。

注意,在这里的处理策略直接影响到了后面的邮箱、事件控制块、互斥信号等等模块。

如果你认为这是个“问题”,并期望解决,可以重新设计从队列中取任务的方式。

常见问题

这篇文章对您有用吗?

我们要如何帮助您?

事件的等待与通知》有2个想法

  1. xfliu

    李老师,您好,我觉得事件控制块中的事件唤醒函数中,如果任务设置了超时等待,需要将tick数清零,不然会存在这种情况,先设置事件等待,在没超时的情况下进行唤醒,然后再设置该任务事件永久等待,然后唤醒,但是此时tick数并不为0,就会操作将该任务从延时队列中移除,但是此时任务并不在延时队列中,这样就出问题了,延时链表计数器会被减一

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注