RAW-OS学习之任务篇(一)

1.raw-os的任务状态

 

       raw-os总共有10个状态 ,定义在raw_obj.h里面,如下:

enum RAW_TASK_STATUS

{  

RAW_RDY = 0, //就绪态

RAW_PEND, //永远阻塞态

RAW_PEND_TIMEOUT, //超时阻塞态

RAW_PEND_TIMEOUT_SUSPENDED, //超时阻塞挂起态

RAW_SUSPENDED, //挂起态

RAW_PEND_SUSPENDED, //永远阻塞挂起态

RAW_DLY, //睡眠态

RAW_DLY_SUSPENDED, //睡眠挂起态

RAW_DELETED,//移除态

RAW_INVALID_STATE //无效态

};

 

就绪态(RAW_RDY)  :  任务已经具备了被系统调度的资格(不被挂起且具备运行资格),并随时等待系统对它进行调度运行.

 

睡眠态(RAW_DLY)  :  处于就绪态的任务调用了raw_sleep()函数主动让自己睡眠.

 

永远阻塞态(RAW_PEND) :  任务需要某种资源而系统暂时无法提供 , 并且该任务选择一直等下去.

 

超时阻塞态(RAW_PEND_TIMEOUT) :  任务需要某种资源而系统暂时无法提供 , 并且该任务选择等待一段可设置时间.

 

挂起态(RAW_SUSPENDED) :  处于就绪态的任务被挂起 , 被挂起的任务就是具备了运行的资格也不会放到就绪态让系统调度.

 

超时阻塞挂起态(RAW_PEND_TIMEOUT_SUSPENDED)  :  任务在超时阻塞态时 . 还被挂起 .

 

永远阻塞挂起态(RAW_PEND_SUSPENDED)  :  任务处于永远阻塞态时 , 还被挂起 .

 

睡眠挂起态(RAW_DLY_SUSPENDED) :  任务处于睡眠态时 , 还被挂起  .

 

移除态(RAW_DELETED) :  不管处于何种状态的任务被移除了 , 移除与挂起的区别在于移除是不可逆的 , 而挂起是可逆的 .

 

 

2.rawos的状态转换图

RAW-OS学习之任务篇(一)_第1张图片

RAW-OS学习之任务篇(一)_第2张图片


 关于各状态的转换条件及涉及相关操作如下表:

 

标号

   

                                                                 条件      及     涉及相关操作

1

   

①在获取资源(如互斥量、信号量、消息队列等)时,如果没有资源可用并且选择RAW_WAIT_FOREVER .

 

涉及:从raw_ready_queue摘除,插入相应资源的阻塞链表上(common_block_obj.block_list) .更改到task_ptr->task_state , 以及相应资源的一些变量.

 

 

2

   

①获取到所阻塞资源(如互斥量、信号量、消息队列等),或者事件的发生,一般调用raw_wake_object(RAW_TASK_OBJ *task_ptr).

②调用delete_pend_obj(RAW_TASK_OBJ *task_ptr).

③调用raw_task_wait_abort(RAW_TASK_OBJ *task_ptr).

 

涉及:从相应资源的阻塞链表上(common_block_obj.block_list)摘除,插入raw_ready_queue . 更改到task_state,block_status,block_obj以及相应资源的一些变量 . (如果是获取到资源的并且该资源带有消息和消息长度的,还要更改task_ptr->msg,task_ptr->msg_size).

 

 

3

   

①运行中的任务主动睡眠(调用raw_sleep(RAW_U32  dly) (dly不能为0)).

 

涉及:从raw_ready_queue摘除 , 插入到tick_head上面 . 更改到raw_task_active->task_state .

 

 

4

   

①该任务睡眠超时了,在 tick_list_update(void)实现.

②调用raw_task_wait_abort(RAW_TASK_OBJ *task_ptr).

 

涉及:从tick_head里摘除 , 插入到raw_ready_queue里 . 更改到task_ptr->task_state.

 

 

5

   

①在获取资源(如互斥量、信号量、消息队列等)时,如果没有资源可用并且没有选择RAW_WAIT_FOREVER和RAW_NO_WAIT  .

 

涉及:从raw_ready_queue里摘除 , 插入到tick_head里,并插入相应阻塞资源链表上(block_common_obj.block_list). 更改到task_ptr->task_state.

 

 

6

   

①该任务阻塞超时了,在 tick_list_update(void)实现 .

②获取到所阻塞资源(如互斥量、信号量、消息队列等),或者事件的发生 , 一般调用raw_wake_object(RAW_TASK_OBJ *task_ptr).

③调用raw_task_wait_abort(RAW_TASK_OBJ *task_ptr).

④调用delete_pend_obj(RAW_TASK_OBJ *task_ptr) .

 

涉及:从tick_head里摘除 , 在从相应阻塞资源链表上摘除 , 插入到raw_ready_queue里 .更改到task_ptr->block_status,task_ptr->task_state,task_ptr->block_obj.

 

 

7

   

①调用raw_task_suspend(RAW_TASK_OBJ *task_ptr)或者task_suspend(RAW_TASK_OBJ *task_ptr).

 

涉及:从rew_ready_queue中摘除 . 更改到task_ptr->suspend_count,task_ptr->task_state.

 

8

   

①调用raw_task_resume(RAW_TASK_OBJ *task_ptr)或task_resume(RAW_TASK_OBJ *task_ptr)(前提task_ptr->suspend_count=1).

②调用raw_task_wait_abort(RAW_TASK_OBJ *task_ptr).

 

涉及:插入到raw_ready_queue里 . 更改到task_ptr->suspend_count,task_ptr->task_state.

 

 

9

   

①调用raw_task_suspend(RAW_TASK_OBJ *task_ptr)或者task_suspend(RAW_TASK_OBJ *task_ptr).

 

涉及:更改到task_ptr->suspend_count,task_ptr->task_state .

 

10

   

①调用raw_task_resume(RAW_TASK_OBJ *task_ptr)或task_resume(RAW_TASK_OBJ *task_ptr)(前提task_ptr->suspend_count=1).

 

涉及:更改到task_ptr->suspend_count,task_ptr->task_state .

 

 

11

   

①调用raw_task_suspend(RAW_TASK_OBJ *task_ptr)或者task_suspend(RAW_TASK_OBJ *task_ptr).

 

涉及:更改到task_ptr->suspend_count,task_ptr->task_state.

 

12

   

①调用raw_task_resume(RAW_TASK_OBJ *task_ptr)或task_resume(RAW_TASK_OBJ *task_ptr)(前提task_ptr->suspend_count=1).

 

涉及:更改到task_ptr->suspend_count,task_ptr->task_state .

 

 

13

   

①调用raw_task_suspend(RAW_TASK_OBJ *task_ptr)或者task_suspend(RAW_TASK_OBJ *task_ptr).

 

涉及:更改到task_ptr->suspend_count,task_ptr->task_state.会触发一次调度.

14

   

①调用raw_task_resume(RAW_TASK_OBJ *task_ptr)或task_resume(RAW_TASK_OBJ *task_ptr)(前提task_ptr->suspend_count=1).

 

涉及:更改到task_ptr->suspend_count,task_ptr->task_state .

 

 

15

   

①调用raw_task_suspend(RAW_TASK_OBJ *task_ptr)或者task_suspend(RAW_TASK_OBJ *task_ptr).

②调用raw_task_resume(RAW_TASK_OBJ *task_ptr)或task_resume(RAW_TASK_OBJ *task_ptr)(前提task_ptr->suspend_count>1).

 

涉及: 更改到task_ptr->suspend_count.

 

 

16

   

①调用raw_task_wait_abort(RAW_TASK_OBJ *task_ptr).

 

涉及:如果有阻塞在tick_head的,和阻塞在相应资源的链表上(common_block_obj.block_list)都要摘除 , 插入到raw_ready_queue上 .如果前状态是RAW_DLY_SUSPENDED.

 

17

   

①获取到所阻塞资源(如互斥量、信号量、消息队列等),或者事件的发生  ,一般调用raw_wake_object(RAW_TASK_OBJ *task_ptr).

②调用delete_pend_obj(RAW_TASK_OBJ *task_ptr) .

③该任务阻塞超时了,在tick_list_update(void)实现.

 

涉及:从相应资源的阻塞链表上(common_block_obj.block_list)摘除,并从tick_head上摘除 . 更改到task_ptr->task_state,task_ptr->block_status,task_ptr->block_obj以及相应资源的一些变量. (如果是获取到资源的并且该资源带有消息和消息长度的,还要更改task_ptr->msg,task_ptr->msg_size).

 

 

18

   

①获取到所阻塞资源(如互斥量、信号量、消息队列等),或者事件的发生  ,一般调用raw_wake_object(RAW_TASK_OBJ *task_ptr).

②调用delete_pend_obj(RAW_TASK_OBJ *task_ptr) .

 

涉及:从相应资源的阻塞链表上(common_block_obj.block_list)摘除 . 更改到task_ptr->task_state,task_ptr->block_status,task_ptr->block_obj以及相应资源的一些变量. (如果是获取到资源的并且该资源带有消息和消息长度的,还要更改task_ptr->msg,task_ptr->msg_size).

 

 

19

   

①该任务睡眠超时了,在 tick_list_update(void)实现.

 

涉及:从tick_head里摘除 . 更改task_ptr->task_state,task_ptr->block_status.

 

20

   

①调用raw_task_delete(RAW_TASK_OBJ *task_ptr).

 

涉及:把该任务从所有相关的链表里摘除 .






你可能感兴趣的:(RAW-OS学习之任务篇(一))