1.WSN_OS的任务状态
一共有7种状态,定义在wsn_type.h中。如下:
typedef WSN_U8 WSN_TAST_STATUS;
enum
{
WSN_READY= 0, /** 就绪状态 ready state */
WSN_SLEEP, /** 睡眠状态 sleep state */
WSN_BLOCK_TIMEOUT, /** 限时阻塞状态 block with timeout state */
WSN_BLOCK, /** 永久阻塞状态 block without timeout state */
WSN_PEND, /** 挂起状态 pend state */
WSN_BLOCK_PEND, /** 永久阻塞挂起状 WSN_BLOCK with WSN_PEND */
WSN_BLOCK_TIMEOUT_PEND /** 限时阻塞挂起状态 WSN_BLOCK_TIMEOUT with WSN_PEND */
}; //WSN_TAST_STATUS
就绪态(WSN_READY): 任务具备运行资格且不被挂起,随时等待系统进行任务调度
睡眠态(WSN_SLEEP):处于就绪态的任务调用wsn_sleep( WSN_U32 dly )函数让自己睡眠
超时阻塞态(WSN_BLOCK_TIMEOUT): 任务需要某种资源而系统暂时无法提供 , 并且该任务选择等待一段时间(自己设置)
永远阻塞态(WSN_BLOCK):任务需要某种资源而系统暂时无法提供 , 并且该任务选择一直等下去
挂起态(WSN_PEND):处于就绪态的任务被挂起 , 被挂起的任务就是具备了运行的资格也不会放到就绪态让系统调度
永远阻塞挂起态(WSN_BLOCK_PEND):任务处于永远阻塞态,并被挂起
超时阻塞挂起态(WSN_BLOCK_TIMEOUT_PEND):任务处于超时阻塞态,并被挂起
2.WSN_OS的状态转换图
新建的任务默认是就绪状态
3.关于各状态的转换条件及涉及相关操作如下
1、 任务主动睡眠,调用了wsn_sleep(WSN_U32 dly )
相关操作:将任务状态改为睡眠态WSN_SLEEP、从就绪列表中删除、插入到系统时钟计数列表中、进行任务调度
2、 任务睡眠时间到了,在tick_list_update(WSN_VOID )中实现
相关操作:将任务状态改成就绪态WSN_READY、从系统时钟计数列表中删除、从任务控制链表中删除、添加到就绪列表中
5、永远阻塞任务,在获取资源(如互斥量、信号量、消息队列等)时,如果没有资源可用并且选择WSN_BLOCK_FOREVER
相关操作:将任务状态改成永远阻塞态WSN_BLOCK、记录阻塞类型、从就绪列表中删除、根据任务的优先级将任务加到阻塞队列中
6、唤醒阻塞任务,获取到所阻塞资源(如互斥量、信号量、消息队列等)或者事件的发生,调用了wsn_wakeup_task( WSN_TASK_TCB *p_tcb ),唤醒阻塞任务之后,必须调用调度程序。
相关操作:从系统时钟计数列表中删除、从任务控制链表中删除、添加到就绪列表中、任务状态改成就绪态WSN_READY、更新阻塞类型BLOCK_NON
7、超时阻塞任务,在获取资源(如互斥量、信号量、消息队列等)时,如果没有资源可用并且选择value,设置了等待时间
相关操作:将任务的状态改成超时阻塞态WSN_BLOCK_TIMEOUT、将任务加入系统时钟计数列表中,并设置timeout的值、记录阻塞类型、从就绪列表中删除、根据任务的优先级将任务加到阻塞队列中
8、唤醒超时阻塞任务,阻塞时间到了,在tick_list_update(WSN_VOID )中实现,或者是获取到所阻塞资源(如互斥量、信号量、消息队列等)或者事件的发生,调用了wsn_wakeup_task( WSN_TASK_TCB *p_tcb ),唤醒阻塞任务之后,必须调用调度程序。
相关操作:从系统时钟计数列表中删除、从任务控制链表中删除、添加到就绪列表中、任务状态改成就绪态WSN_READY、更新阻塞类型BLOCK_NON