版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 4 章4.0任务管理1建立任务,OSTaskCreate()2建立任务,OSTaskCreateExt()6任务堆栈9堆栈检验,OSTaskStkChk()11删除任务,OSTaskDel()14请求删除任务,OSTaskDelReq()17改变任务的优先级,OSTaskChangePrio()20挂起任务,OSTaskSuspend()23恢复任务,OSTaskResume()25获得有关任务的信息,OSTaskQuery()264.14.24.34.44.54.64.74.84.9I第4章任务管理在前面的章节中,笔者曾说过任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。这里
2、要注意的是,任务代码并不是被真正的删除了,而只是 C/OS-不再理会该任务代码,所以该任务代码不会再运行。任务看起来与任何 C 函数一样,具有一个返回类型和一个参数,只是它从不返回。任务的返回类型必须被定义成void 型。在本章中所提到的函数可以在OS_TASK 文件中找到。如前所述,任务必须是以下两种结构之一: 或 本章所讲的内容包括如何在用户的应用程序中建立任务、删除任务、改变任务的优先级、挂起和恢复任务,以及获得有关任务的信息。 C/OS-可以管理多达 64 个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有 56 个任务。任务的优先级越高,反映优
3、先级的值则越低。在最新的C/OS-版本中,任务的优先级数也可作为任务的标识符使用。 4-1void YourTask (void *pdata)/* 用户代码 */ OSTaskDel(OS_PRIO_SELF);void YourTask (void *pdata)for (;) /* 用户代码 */调用C/OS-的服务例程之一: OSMboxPend();OSQPend(); OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM();/* 用户代码 */4.0建
4、立任务,OSTaskCreate()想让 C/OS-管理用户的任务,用户必须要先建立任务。用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() 或 OSTaskCreateExt()。 OSTaskCreate()与C/OS 是向下兼容的,OSTaskCreateExt()是 OSTaskCreate()的扩展版本,提供了一些附加的功能。用两个函数中的任何一个都可以建立任务。任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用 OSStart()前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。
5、 OSTaskCreate()的代码如程序清单 L4.1 所述。从中可以知道,OSTaskCreate()需要四个参数:task 是任务代码的指针,pdata 是当任务开始执行时传递给任务的参数的指针,ptos是分配给任务的堆栈的栈顶指针(参看 4.02,任务堆栈),prio 是分配给任务的优先级。 程序L4.1OSTaskCreate()4-28U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos,8U prio)void*psp;8Uerr;if (prio OS_LOWEST_PRIO) (1)return (
6、OS_PRIO_INVALID); OS_ENTER_CRITICAL();if (OSTCBPrioTblprio = (OS_TCB *)0) (2) OSTCBPrioTblprio = (OS_TCB *)1;(3)OS_EXIT_CRITICAL();(4)psp = (void *)OSTaskStkInit(task, pdata, ptos, 0);(5) err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);(6) if (err = OS_NO_ERR) (7)OS_ENTER_CRITICAL();OSTask
7、Ctr+;(8)OSTaskCreateHook(OSTCBPrioTblprio);(9) OS_EXIT_CRITICAL();if (OSRunning) (10)OSSched();(11) OSTaskCreate()一开始先检测分配给任务的优先级是否有效L4.1(1)。任务的优先级必须在 0 到 OS_LOWEST_PRIO 之间。接着,OSTaskCreate()要确保在规定的优先级上还没有建立任务L4.1(2)。在使用C/OS-时,每个任务都有特定的优先级。如果某个优先级是空闲的,C/OS-通过放置一个非空指针在OSTCBPrioTbl中来保留该优先级L4.1(3)。这就使得O
8、STaskCreate()在设置任务数据结构的其他部分时能重新允许中断L4.1(4)。 然后,OSTaskCreate()调用 OSTaskStkInit()L4.1(5),它负责建立任务的堆栈。该函数是与处理器的硬件体系相关的函数, 可以在 OS_CPU_C.C 文件中找到。有关实现 OSTaskStkInit()的细节可参看第 8 章移植C/OS-。如果已经有人在你用的处理器上成功地移植了 C/OS-,而你又得到了他的代码,就不必考虑该函数的实现细节了。 OSTaskStkInit()函数返回新的堆栈栈顶(psp),并被保存在任务的 0S_TCB 中。注意用户得将传递给 OSTaskStk
9、Init() 函数的第四个参数 opt 置 0 , 因为 OSTaskCreate() 与 OSTaskCreateExt()不同,它不支持用户为任务的创建过程设置不同的选项,所以没有任何选项可以通过opt 参数传递给OSTaskStkInit()。 C/OS-支持的处理器的堆栈既可以从上(高地址)往下(低地址)递减也可以从下往上递增。用户在调用 OSTaskCreate()的时候必须知道堆栈是递增的还是递减的(参看所用处理器的 OS_CPU.H 中的 OS_STACK_GROWTH) , 因为用户必须得把堆栈的栈顶传递给 OSTaskCreate(),而栈顶可能是堆栈的最高地址(堆栈从上往下
10、递减),也可能是最低地址(堆栈从下往上长)。 一旦 OSTaskStkInit() 函数完成了建立堆栈的任务, OSTaskCreate() 就调用OSTCBInit()L4.1(6),从空闲的 OS_TCB 池中获得并初始化一个 OS_TCB。OSTCBInit()的代码如程序清单 L4.2 所示,它存在于 0S_CORE.C 文件中而不是 OS_TASK.C 文件中。 OSTCBInit()函数首先从 OS_TCB 缓冲池中获得一个 OS_TCBL4.2(1),如果 OS_TCB 池中有空闲的 OS_TCBL4.2(2),它就被初始化L4.2(3)。注意一旦 OS_TCB 被分配,该任务的
11、创建者就已经完全拥有它了,即使这时内核又创建了其它的任务,这些新任务也不可能对已分配的 OS_TCB 作任何操作,所以 OSTCBInit()在这时就可以允许中断,并继续初始化OS_TCB的数据单元。 4-3 else OS_ENTER_CRITICAL();OSTCBPrioTblprio = (OS_TCB *)0;(12) OS_EXIT_CRITICAL();return (err); else OS_EXIT_CRITICAL();return (OS_PRIO_EXIST); L 4.2 OSTCBI n it () ,( 1 )( 2 )( 3 )4-48U OSTCB I n
12、it (8Up r i o ,OS_STK *p t os ,OS_STK *p,16U i d 16U s t k_ s i ze , vo i d*p e x t ,16Uop t )OS_TCB *p t c b ;OS_ENTER_CR I T ICAL () ;p t c b = OSTCBF r eeL i s t; i f ( p t c b ! = (OS_TCB * ) 0 ) OSTCBF r eeL i s t= p t c b - OSTCBNe x t; OS_EXI T_CR I T ICAL () ;p t c b - OSTCBS t kP t r= p t o
13、 s ;p t c b - OSTCBP r i o= (8U) p r i o ; p t c b - OSTCBS = OS_S_RDY ;p t c b - OSTCBD l y= 0 ; # i f OS_TASK_CREATE_EXT_ENp t c b - OSTCBEx t P t r= p e x t; p t c b - OSTCBS t kS ize= s t k_ s i ze ; p t c b - OSTCBS t kBo tt om = p;p t c b - OSTCBOp t= op t; p t c b - OSTCB I d= i d ;# e l s ep
14、 e x t= p e x t; s t k_ s i ze= s t k_ s i ze ;p= p;op t= op t; i d= i d ;# e nd i f# i f OS_TASK_DEL_ENp t c b - OSTCBDe l Req= OS_NO_ERR ;# e nd i f( 4 )( 5 )( 7 )4-5p t c b - OSTCBY= p r i o 3 ;p t c b - OSTCBB it Y= OSMa pTb l p t c b - OSTCBY ; p t c b - OSTCBX= p r i o & 0 x07 ;p t c b - OSTCB
15、B it X= OSMa pTb l p t c b - OSTCBX ;# i fOS_MBOX_EN | (OS_Q_EN & (OS_MAX_QS = 2 ) | OS_SEM_EN p t c b - OSTCBEv e n tP t r= (OS_EVENT * ) 0 ;# e nd i f# i fOS_MBOX_EN | (OS_Q_EN & (OS_MAX_QS = 2 ) p t c b - OSTCBMs g= ( vo i d * ) 0 ;# e nd i fOS_ENTER_CR I T ICAL () ;OSTCBP r i oTb l p r io = p t
16、c b ;p t c b - OSTCBNe x t= OSTCBL i s t; p t c b - OSTCBP r e v= (OS_TCB * ) 0 ; i f (OSTCBL i s t ! = (OS_TCB * ) 0 ) OSTCBL i s t - OSTCBP r e v = p t c b ;OSTCBL i s t= p t c b ;OSRdyGr p| = p t c b - OSTCBB i tY ;( 6 ) OSRdyTb l p t c b - OSTCBY | = p t c b - OSTCBB it X;OS_EXI T_CR I T ICAL ()
17、 ;r e t u r n (OS_NO_ERR ) ; e l s e OS_EXI T_CR I T ICAL () ;r e t u r n (OS_NO_MORE_TCB ) ; OSTaskCreateExt() L 4.3 OSTa s kCr ea t eEx t () 4-68U OSTa s kCr ea t eEx t ( vo i d( * t a s k )( vo i d *pd ) ,vo id*pd a t a ,( 1 )(2 )( 3 )( 4 )( 5 )( 6 )4-7OS_STK*p t o s , 8Up r i o ,16Ui d , OS_STK*
18、p,32Us t k_ s i ze , vo id*p e x t ,16Uop t )vo i d*p s p ;8Ue rr ;16Ui; OS_STK*p f ill; i f ( p r i o OS_LOWEST_PR IO) r e t u r n (OS_PRIO_ INVAL ID) ;OS_ENTER_CR I T ICAL () ;i f (OSTCBP r i oTb l p r i o = (OS_TCB * ) 0 ) OSTCBP r i oTb l p r io = (OS_TCB * ) 1 ;OS_EXI T_CR I T ICAL () ;i f ( op
19、 t & OS_TASK_OPT_STK_CHK) i f ( op t & OS_TASK_OPT_STK_CLR) P f ill = p;f o r ( i = 0 ; i OSF r ee = 0 ; pd a t a - OSUs e d = 0 ;i f ( p r i o OS_LOWEST_PR IO & p r i o ! = OS_PRIO_SELF ) r e t u r n (OS_PRIO_ INVAL ID) ;OS_ENTER_CR I T ICAL () ;i f ( p r i o = OS_PRIO_SELF ) p r i o = OSTCBCu r-OS
20、TCBP r i o ;p t c b = OSTCBP r i oTb l p r i o ;i f ( p t c b = (OS_TCB * ) 0 ) OS_EXI T_CR I T ICAL () ;( 3 )(4 )( 5 ) OSTaskDel()4-14r e t u r n (OS_TASK_NOT_EXI ST ) ;i f ( p t c b - OSTCBOp t & OS_TASK_OPT_STK_CHK) = 0 ) OS_EXI T_CR I T ICAL () ;r e t u r n (OS_TASK_OPT_ERR ) ;fr ee = 0 ;s i ze
21、= p t c b - OSTCBS t kS i ze ;p c hk = p t c b - OSTCBS t kBo tt om; OS_EXI T_CR I T ICAL () ;# i f OS_STK_GROWTH = 1wh il e ( *p c hk+ = 0 ) fr ee+ ;# e l s ewh il e ( *p c hk - = 0 ) fr ee+ ;# e nd i fpd a t a - OSF r ee = fr ee * s i ze o f(OS_STK) ;pd a t a - OSUs e d = ( s ize - fr ee ) * s i z
22、e o f(OS_STK) ; r e t u r n (OS_NO_ERR ) ; L 4.11? )0 )4-158U OSTa s kDe l (8U p r i o )OS_TCB*p t c b ; OS_EVENT *p e v e n t; i f ( p r i o = OS_ IDLE_PR IO) ( 1 )r e t u r n (OS_TASK_DEL_ IDLE ) ;i f ( p r i o = OS_LOWEST_PR IO & p r i o ! = OS_PRIO_SELF ) ( 2 ) r e t u r n (OS_PRIO_ INVAL ID) ;O
23、S_ENTER_CR I T ICAL () ;i f (OSNe s ti ng 0 ) ( 3 )OS_EXI T_CR I T ICAL () ;r e t u r n (OS_TASK_DEL_ I SR) ;i f ( p r i o = OS_PRIO_SELF ) ( 4 )P r i o = OSTCBCu r-OSTCBP r i o ;i f ( p t c b = OSTCBP r i oTb l p r i o ) ! = (OS_TCB * ) 0 ) ( 5 )i f (OSRdyTb l p tc b - OSTCBY &= p t c b - OSTCBB it
24、 X) = 0 ) ( 6 ) OSRdyGr p &= p t c b - OSTCBB it Y;i f ( p e v e n t = p tc b - OSTCBEv e n t P t r) ! = (OS_EVENT * ) 0 ) ( 7 i f ( p e v e n t -OSEv e n t Tb l p t c b - OSTCBY &= p t c b - OSTCBB it X) =p e v e n t - OSEv e n t Gr p &= p t c b - OSTCBB it Y;P t c b - OSTCBD l y= 0 ;( 8 )P t c b -
25、 OSTCBS= OS_S_RDY ;( 9 )OSLo c kNe s ti ng+ ;( 10 )OS_EXI T_CR I T ICAL () ;( 11 )OSDummy () ;( 12 )4-16OS_ENTER_CR I T ICAL () ;OSLo c kNe s ti ng - ;( 13 )OSTa s kDe l Hook ( p tc b ) ;( 14 )OSTa s kC t r- ;OSTCBP r i oTb l p r io = (OS_TCB * ) 0 ;( 15 )i f ( p t c b - OSTCBP r e v = (OS_TCB * ) 0
26、 ) ( 16 ) p t c b - OSTCBN e x t - OSTCBP r e v = (OS_TCB * ) 0 ;OSTCBL i s t= p t c b - OSTCBNe x t; e l s e p t c b - OSTCBP r e v - OSTCBNe x t = p t c b - OSTCBNe x t; p t c b - OSTCBN e x t - OSTCBP r e v = p t c b - OSTCBP r e v ;p t c b - OSTCBNe x t = OSTCBF r eeL i s t;( 17 ) OSTCBF r eeL i
27、 s t= p t c b ;OS_EXI T_CR I T ICAL () ;OSSc h e d () ;( 18 )r e t u r n (OS_NO_ERR ) ; e l s e OS_EXI T_CR I T ICAL () ;r e t u r n (OS_TASK_DEL_ERR ) ; OSTaskDelReq()4-17 L 4.12? ? ( B)( 3 )( 4 ) L 4.13? ? A)( 2 )( 3 )4-18vo i d Ta s kToBeDe l e t e d ( vo i d *pd a t a )8U e rr ;pd a t a = pd a t
28、 a ; f o r ( ; ) / * /If (OSTa s kDe l Re q (OS_PRIO_SELF ) = OS_TASK_DEL_REQ) ( 1 );OSTa s kDe l (OS_PRIO_SELF ) ; e l s e / * /vo i d Re qu e s t o r Ta s k ( vo i d *pd a t a )8U e rr ;pd a t a = pd a t a ; f o r ( ; ) / * /i f ( Ta s kToBeDe le t e d () ) ( 1 wh il e (OSTa skDe l Re q ( TASK_TO_
29、DEL_PR IO) ! = OS_TASK_NOT_EXI ST ) ( 2 )OST imeDl y ( 1 ) ;/ * / L 4.14OSTa s kDe l Req ( ).( 1 )( 3 )4-198U OSTa s kDe l Re q (8U p r i o )s;8Ue rr ; OS_TCB*p t c b ;i f ( p r i o = OS_ IDLE_PR IO) r e t u r n (OS_TASK_DEL_ IDLE ) ;i f ( p r i o = OS_LOWEST_PR IO & p r i o ! = OS_PRIO_SELF ) ( 2 )
30、r e t u r n (OS_PRIO_ INVAL ID) ;i f ( p r i o = OS_PRIO_SELF ) OS_ENTER_CR I T ICAL () ;s= OSTCBCu r-OSTCBDe l Re q ;( 5 )( 6 ) OSTaskChangePrio()4-20OS_EXI T_CR I T ICAL () ;r e t u r n ( s) ; e l s e OS_ENTER_CR I T ICAL () ;i f ( p t c b = OSTCBP r i oTb l p r i o ) ! = (OS_TCB * ) 0 ) ( 4 )p t
31、c b - OSTCBD e l Re q = OS_TASK_DEL_REQ ; e rr= OS_NO_ERR ; e l s e e rr= OS_TASK_NOT_EXI ST ;OS_EXI T_CR I T ICAL () ;r e t u r n ( e rr) ; L 4.15OSTa s kChangePr i o ( ).( 1 )( 2 )4-218U OSTa s kCh a ng e P r i o (8U o l dp r i o ,8U n ewp r i o )OS_TCB*p t c b ; OS_EVENT *p e v e n t; 8Ux ;8Uy ;8
32、Ub it x ;8Ub it y ;i f ( o l dp r i o = OS_LOWEST_PR IO & o l dp r i o ! = OS_PRIO_SELF )| n ewp r i o = OS_LOWEST_PR IO) r e t u r n (OS_PRIO_ INVAL ID) ;OS_ENTER_CR I T ICAL () ;i f (OSTCBP r i oTb l n ewp r i o ! = (OS_TCB * ) 0 ) OS_EXI T_CR I T ICAL () ;r e t u r n (OS_PRIO_EXI ST ) ; e l s e 4
33、-22OSTCBPrioTblnewprio = (OS_TCB *)1;(3) OS_EXIT_CRITICAL();y= newprio 3;(4)bity = OSMapTbly;x= newprio & 0 x07; bitx = OSMapTblx; OS_ENTER_CRITICAL();if (oldprio = OS_PRIO_SELF) (5) oldprio = OSTCBCur-OSTCBPrio;if (ptcb = OSTCBPrioTbloldprio) != (OS_TCB *)0) (6) OSTCBPrioTbloldprio = (OS_TCB *)0;(7
34、) if (OSRdyTblptcb-OSTCBY & ptcb-OSTCBBitX) (8) if (OSRdyTblptcb-OSTCBY &= ptcb-OSTCBBitX) = 0) (9)OSRdyGrp &= ptcb-OSTCBBitY;OSRdyGrp|= bity;(10)OSRdyTbly |= bitx; else if (pevent = ptcb-OSTCBEventPtr) != (OS_EVENT *)0) (11) if (pevent-OSEventTblptcb-OSTCBY &=ptcb-OSTCBBitX) = 0) pevent-OSEventGrp
35、&= ptcb-OSTCBBitY;pevent-OSEventGrp|= bity;(12) pevent-OSEventTbly |= bitx;OSTCBPrioTblnewprio = ptcb;(13)ptcb-OSTCBPrio= newprio;(14)ptcb-OSTCBY= y;(15)ptcb-OSTCBX= x;ptcb-OSTCBBitY= bity;ptcb-OSTCBBitX= bitx; OS_EXIT_CRITICAL();(16 )(17 ) OSTaskSuspend() L 4.16OSTa s kSus pend ( ).4-238U OSTa s kS
36、u s p e nd (8U p r i o )OSSc h e d () ;r e t u r n (OS_NO_ERR ) ; e l s e OSTCBP r i oTb l n ewp r i o = (OS_TCB * ) 0 ; OS_EXI T_CR I T ICAL () ;r e t u r n (OS_PRIO_ERR ) ;( 1 )( 3 )( 4 )( 5 )( 6 )( 7 )( 8 )4-24s e l f ;OS_TCB*p t c b ;i f ( p r i o = OS_ IDLE_PR IO) r e t u r n (OS_TASK_SUSPEND_
37、IDLE ) ;i f ( p r i o = OS_LOWEST_PR IO & p r i o ! = OS_PRIO_SELF ) ( 2 )r e t u r n (OS_PRIO_ INVAL ID) ;OS_ENTER_CR I T ICAL () ;i f ( p r i o = OS_PRIO_SELF ) p r i o = OSTCBCu r-OSTCBP r i o ; s e l f = TRUE ; e l s e i f ( p r i o = OSTCBCu r- OSTCBP r i o ) s e l f = TRUE ; e l s e s e l f =
38、FALSE ;i f ( p t c b = OSTCBP r i oTb l p r i o ) = (OS_TCB * ) 0 ) OS_EXI T_CR I T ICAL () ;r e t u r n (OS_TASK_SUSPEND_PR IO) ; e l s e i f (OSRdyTb l p tc b - OSTCBY &= p t c b - OSTCBB it X) = 0 ) OSRdyGr p &= p t c b - OSTCBB it Y;p t c b - OSTCBS| = OS_S_SUSPEND ; OS_EXI T_CR I T ICAL () ;i f ( s e l f = TRUE ) OSSc h e d () ;r e t u r n (OS_NO_ERR ) ; OSTaskResume()L 4.17OSTa s kRe sume ( ). ( 1 )( 2 )( 3 )( 5 )( 6 )4-258U OSTa s kRe s ume (8U p r i o )OS_TCB*p t c b ;If ( p r i o = OS_LOWEST_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度荒山承包权转让及景观设计合同
- 2025年二零二五餐饮企业厨师长招聘与培训合同
- 二零二五年度个人租房租赁合同终止与清算协议
- 2025年度环保技术股份合作合同
- 2025年旅游品牌授权合同
- 2025年中国蚊香行业发展潜力分析及投资方向研究报告
- 2025年诱导屏杆行业深度研究分析报告
- 中国在线支付行业市场前瞻与未来投资战略分析报告(2025年)
- 2024-2030年中国二十味沉香丸行业市场深度研究及投资规划建议报告
- 2025-2031年中国绞盘行业市场调查研究及发展趋势预测报告
- 计算机二级wps office公共基础考试题库(100题)
- 三年级上册竖式计算练习300题及答案
- 点亮生命-大学生职业生涯发展与就业指导全套教学课件
- 旅居管家策划方案
- 车间消防安全知识培训课件
- 华为经营管理-华为的研发管理(6版)
- 锂离子电池生产工艺流程图
- 平衡计分卡-化战略为行动
- 幼儿园小班下学期期末家长会PPT模板
- 矿山安全培训课件-地下矿山开采安全技术
- 《社会主义市场经济理论(第三版)》第七章社会主义市场经济规则论
评论
0/150
提交评论