读书人

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

发布时间: 2013-01-28 11:49:56 作者: rapoo

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学习之任务篇(1)


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

标号

条件 及 涉及相关操作

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).

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






读书人网 >操作系统

热点推荐