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的状态转换图
关于各状态的转换条件及涉及相关操作如下表:
标号 |
条件 及 涉及相关操作 |
||
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).
涉及:把该任务从所有相关的链表里摘除 . |