1.任务何时进入等待队列
任务进入等待队列的时机举例如下:
-
当任务等待一个信号发出时
-
当任务等待一个互斥信号量释放时
-
当任务等待一个事件标志组被发布时
-
当任务等待一个消息队列被发布时
-
当任务等待延时结束时
在这些情况下,任务将从就绪队列中删除,并放置到所等待的内核对象的等待队列中。这样,系统可以在适当的时候唤醒任务,并将其重新放入就绪队列。
2. 等待队列在哪里
等待队列在内核对象中, os_sem os_q os_mutex os_flag_grp 都有等待队列,任务等待内核对象时被阻塞,TCB控制块会从就绪任务队列中删除并插入到PendList中
相关内核对象:
-
os_sem: 信号量对象,有自己的等待队列。
-
os_q: 消息队列对象,有自己的等待队列。
-
os_mutex: 互斥锁对象,有自己的等待队列。
-
os_flag_grp: 事件标志组对象,有自己的等待队列。
3. 等待队列关键结构体 os_pend_obj
os_pend_obj
是UCOS-III中表示等待队列的关键结构体。每当一个任务等待某个内核对象时,它的TCB会被插入到该对象的os_pend_obj
等待队列中。这个结构体包含了任务等待的信息,以及指向下一个等待任务的指针,从而形成一个链表。