全部学习汇总: GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. (github.com)
今天分析两个事件相关的接口实现,从代码实现以及调用的情况看其实队列也不过是事件的特殊形式罢了。
上面的接口实现很简单,关键的操作为:把当前的任务通过事件链表元素绑定插入到事件链表之中,这个过程中涉及到了后续调度时机的排序。接着,通过delayed list实现了当前任务的阻塞状态切换。
这个接口实现的功能意图跟上面相似,不相同的地方在于前面的接口是在任务调度器工作的情况下执行的,因此可能会涉及到后续的任务调度,排序由此是必然的。而这个,基本上可以理解为是一个缓冲之举,临时无序加入到了一个阻塞处理队列之中。
这两个都是事件处理所用的接口,整个过程中没有涉及到直接的调度切换请求。其实,从这个角度上讲事件似乎是一个实时性略低的一个策略实现。而第一个接口目前看来只在队列实现的时候用到了,由此也基本可以知道队列的实时性获取也不见得非常好。
通过上面的代码分析来看,其实事件链表本质上也是任务阻塞状态的链表。如果从这个链表中移除,代表着接下来会有新人就绪任务产生。当然,如果是调度器挂起了,这个处理过程会缓冲执行。既然涉及到任务的就绪,那么就可能会成为最高优先级的就绪任务,既然触发任务调度的请求。
设计的实现其实还是很好理解的,但是这样的设计如果伴随着任务调度那岂不是会有优先级错乱?毕竟,这里的任务链表其实是没有经过排序的。从接口调用看,只在事件组的实现中用到过,获取还得结合后面事件组的用途分析以及使用的背景来理解一下。