完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
1. 大家一起来学raw-os之——任务篇1
内核版本基于1.052最新版,资料参照RAW-OS作者txj编写的《高效实时操作系统设计》教程和书本配套的视频以及源码视频讲解。 Raw-OS官方网站:http://www.raw-os.org/ Raw-OS托管地址:https://github.com/jorya/raw-os/ 总是说国外的XX-OS牛X,总是说国人没有自已的OS,支持国人,从RAW-OS开始。 任务是RTOS中编程模块的最小单位,RTOS实际上就是在这些个任务之间进行轮转(按一定的规则),从而达到宏观多任务并行执行的效果,当然,有些RTOS也称之为线程(thread)。 RAW-OS的任务篇分析包括:1. 任务状态与任务创建;2. 任务删除与任务睡眠;3. 任务挂起与恢复;4. 时间片轮转。 一.任务状态 1. RAW-OS共有10种状态: [C] 纯文本查看 复制代码 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_task_create函数最后一个参数为1,则任务为就绪态。 ②睡眠态(RAW_DLY): 处于就绪态的任务调用了raw_sleep()或raw_time_sleep()函数主动让自己睡眠。 ③永远阻塞态(RAW_PEND): 任务需要某种资源(semaphore,mutex,queue…)而系统暂时无法提供。并且该任务选择一直等下去(RAW_WAIT_FOREVER)。 ④超时阻塞态(RAW_PEND_TIMEOUT): 任务需要某种资源而系统暂时无法提供,并且该任务选择等待一段可设置时间后返回。 ⑤挂起态(RAW_SUSPENDED): 处于就绪态的任务被挂起。被挂起的任务就是具备了运行的资格也不会放到就绪态让系统调度。只有通过raw_task_resume函数恢复。 ⑥超时阻塞挂起态(RAW_PEND_TIMEOUT_SUSPENDED): 任务在超时阻塞态时,还被挂起。 ⑦永远阻塞挂起态(RAW_PEND_SUSPENDED): 任务处于永远阻塞态时。还被挂起。 ⑧睡眠挂起态(RAW_DLY_SUSPENDED): 任务处于睡眠态时,还被挂起。 ⑨移除态(RAW_DELETED): 不管处于何种状态的任务被移除了,移除与挂起的区别在于移除是不可逆的 , 而挂起是可逆的。 任务的RAW_RDY状态通过raw_sleep函数转为 RAW_DLY 状态。 当一个任务阻塞在semphore, mutex, queue, event, memory 上的时候这个任务将进入RAW_PEND 状态,如果说有超时时间限制的话,那它将进入RAW_PEND_TIMEOUT状态。 假如一个任务通过raw_task_suspend 把其它任务suspend住的话,将会根据那个任务当时的状态转化,比如从RAW_PEND 转化为RAW_PEND_SUSPENDED, RAW_PEND_TIMEOUT转化为RAW_PEND_TIMEOUT_SUSPENDED,RAW_DLY 转为RAW_DLY_SUSPENDED 状态。 任务通过raw_task_resume 可以去掉一个suspend状态,但是不能去除其他状态,比如从RAW_PEND_TIMEOUT_SUSPENDED 转化到 RAW_PEND_TIMEOUT, RAW_DLY_SUSPENDED 转化到RAW_DLY. 任何状态的任务都可以被raw_task_delete 掉从而转为结束状态RAW_DELETED. RAW_INVALID_STATE 状态通常是raw os 内部状态机出错。 2. RAW-OS任务状态转换图 标号 条件及涉及相关操作 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_time_sleep())。 涉及:从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). 涉及:把该任务从所有相关的链表里移除 . |
|
相关推荐
3个回答
|
|
顶,有时间来看看
|
|
|
|
后续会在原子的开发板上实现一系列的基础教程
|
|
|
|
期待,呵呵.
|
|
|
|
只有小组成员才能发言,加入小组>>
663 浏览 0 评论
1083 浏览 1 评论
2456 浏览 5 评论
2784 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2619 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
639浏览 9评论
636浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
766浏览 6评论
610浏览 5评论
651浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 15:24 , Processed in 0.937819 second(s), Total 50, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号