WSN_OS学习之任务状态转换框架(一)

来源:互联网 发布:q叔淘宝店叫什么名字 编辑:程序博客网 时间:2024/05/22 09:38

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

原创粉丝点击