版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 任务管理C/OS-II中的任务n任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。n任务的返回类型必须被定义成void型。n任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。任务代码并不是被真正的删除了,而只是C/OS-不再理会该任务代码,所以该任务代码不会再运行n哪个参数是任务的标识符? C/OS-II最多能够管理多少任务?用户可以使用多少个任务?用户如何使用优先级?设计任务n例如:采集三个通道的数据,经过A/D转换后使用图形显示。n任务设计方式1:三通道的数据采集和A/D转换绘图任务编程任务有重复,无法通过优先级选择通道n任务设计方式2:单通道的数据
2、的采集和A/D转换(通道号和数据变量作为参数),在程序中使用不同参数调用三次绘图任务编程任务简单,能够定义不同通道的优先级,任务调度需要一定时间任务管理的内容n6.1/6.2 建立任务n6.3 任务堆栈n6.4 堆栈检验n6.5 删除任务n6.6 请求删除任务n6.7 改变任务的优先级n6.8 挂起任务n6.9 恢复任务n6.10 获得有关任务的信息建立任务n通过调用函数OSTaskCreate()或者OSTaskCreateExt()建立任务。OSTaskCreateExt()是OSTaskCreate()的扩展版本,使用更多的参数提供附加功能。n任务可以在多任务开始调度前建立,也可以在其他
3、任务执行过程中建立。n在开始多任务调度前,至少要建立一个任务。n任务不能通过中断服务程序(ISR)建立6.1 OSTaskCreate()nINT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio ) void (*task)(void *pd)/传递任务的地址n任务的地址是任务函数的函数名void *pdata/任务中用户参数的指针OS_STK *ptos/堆栈的栈顶n必须设置OS_CPU.H中的OS_STACK_GROWTH通知系统堆栈的类型。ntypedef unsigned int
4、 OS_STK;INT8U prio/任务的优先级ntypedef unsigned char INT8U ; 6.1 OSTaskCreate()nOSTaskCreate(Display_Task,(void *)0, (OS_STK*)&Display_Task_StackSTACKSIZE-1, Display_Task_Prio);/ 20/ 堆栈是一个数组,长度由STACKSIZE决定n优先级定义为206.1 OSTaskCreate()n函数的功能校验优先级初始化任务的堆栈初始化任务控制块n其他初始化功能6.1 OSTaskCreate()n校验优先级1n判断优先级是否有
5、效if (prio OS_LOWEST_PRIO) return (OS_PRIO_INVALID); 如果任务的优先级大于定义的最低优先级,返回错误信息:优先级无效!prio OS_LOWEST_PRIO63n校验优先级2n判断此优先级任务是否存在OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) OSTCBPrioTblprio = (OS_TCB *)1;OS_EXIT_CRITICAL();/*其他功能*/ else OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); 6.1 OSTask
6、Create()n初始化任务的堆栈nOS_STK_GROWTH 定义为1;堆栈地址由高向低递减nOS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)npsp = (void *)OSTaskStkInit(task, pdata, ptos, 0); npsp;/返回栈顶指针n初始化任务的寄存器初值SP为ptos,设置其他寄存器值时SP递减PC/LR为函数地址R1-R12为任意设定的初始值R0用来保存用户信息pdataCPSR/SPSR设置为管理模式6.1 OSTaskCre
7、ate()n初始化任务控制块nINT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt);nerr = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); 6.1 OSTaskCreate()n其他初始化功能如果正确的初始化TCB关中断OSTASkCtr用于保存任务数目创建用户编写的钩子函数开中断如果此任务被其他任务动态创建,则进行一次调度,因为任务创建完毕进入就绪状态如果存在错误关
8、中断将此优先级任务清零开中断创建函数返回错误代码if (err = OS_NO_ERR) OS_ENTER_CRITICAL(); OSTaskCtr+; OSTaskCreateHook(OSTCBPrioTblprio); OS_EXIT_CRITICAL(); if (OSRunning) OSSched(); else OS_ENTER_CRITICAL(); OSTCBPrioTblprio = (OS_TCB *)0; OS_EXIT_CRITICAL(); return (err);6.2 OSTaskCreateExt()n自学6.3 任务堆栈n特点堆栈的每个单元必须是OS_S
9、TK类型。ntypedef unsigned int OS_STK;堆栈由连续的内存空间组成。用户应该在任务执行前分配堆栈空间静态分配动态分配6.3 任务堆栈n静态分配static OS_STK MyTaskStackstack_size;OS_STK MyTaskStackstack_size;n使用全局变量n使用数组作为堆栈n使用简单n存在浪费资源的可能n动态分配OS_STK *pstk;pstk = (OS_STK *)malloc(stack_size);if (pstk != (OS_STK *)0) /* 确认malloc()能得到足够地内存空间 */ Create the tas
10、k;n在任务建立前动态创建n使用指针的方法n使用灵活n容易出现错误6.3 任务堆栈n内存碎片与内存泄漏n内存碎片:不连续的内存空间n内存泄漏:无法使用的空闲的内存空间任务退出,但是动态分配的内存空间却没有被释放6.3 任务堆栈n堆栈的使用nOS_STK_GROWTH =0堆栈指针递增SP+SP初值=&MyTaskStack0nOS_STK_GROWTH =1堆栈指针递增SP-SP初值=&MyTaskStackstack_size-16.3 任务堆栈OS_STK TaskStackTASK_STACK_SIZE;#if OS_STK_GROWTH = 0 OSTaskCreate
11、(task, pdata, &TaskStack0, prio);#else OSTaskCreate(task, pdata, &TaskStackTASK_STACK_SIZE-1, prio);#endif6.4 堆栈检验n通过任务的运行,判断任务实际使用堆栈空间的方法。n在调试中使用此方法,可以在发布时减小RAM的浪费。nOSTaskStkChk()函数服务实现6.4 堆栈检验n堆栈校验的前提在OS_CFG.H文件中设OS_TASK_CREATE_EXT为1。用OSTaskCreateExt()建立任务,并给予任务比实际需要更多的内存空间。保证在使用堆栈前对堆栈清零。n
12、在OSTaskCreateExt()中,将参数opt设置为OS_TASK_OPT_STK_CHK +OS_TASK_OPT_STK_CLR。n注意如果用户的程序启动代码清除了所有的RAM,并且从未删除过已建立了的任务,那么用户就不必设置选项OS_TASK_OPT_STK_CLR了。这样就会减少OSTaskCreateExt()的执行时间。6.4 堆栈检验6.4 堆栈检验nINT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata) nprio,任务的优先级。用途?nOS_STK_DATA *pdatapdata指向一个类型为OS_STK_DATA的数据
13、结构,其中包含如下信息:INT32U OSFree; /* 堆栈中未使用的字节数*/ INT32U OSUsed; /* 堆栈中已使用的字节数 */n返回值:OS_NO_ERR:函数调用成功 6.5 删除任务n删除任务:将任务转换为休眠状态。任务代码并未被删除,只是任务从调度列表中删除。任务的删除是动态的。怎么理解?不能删除空闲任务,不能在ISR中删除任务。任务可以删除自身。nINT8U OSTaskDel (INT8U prio) 6.6 请求删除任务n使用OSTaskDel直接删除其他任务的缺点资源丢失例如任务A删除任务B任务B动态分配了部分内存空间,被删除时没有释放这些空间,引起内存泄漏
14、6.6 请求删除任务void RequestorTask (void *pdata) INT8U err; pdata = pdata; for (;) /* 应用程序代码应用程序代码 */ if (TaskToBeDeleted() 需要被删除需要被删除) while (OSTaskDelReq(TASK_TO_DEL_PRIO) != OS_TASK_NOT_EXIST) OSTimeDly(1); /*应用程序代码应用程序代码*/void TaskToBeDeleted (void *pdata) INT8U err; pdata = pdata; for (;) /*应用程序代码应用程
15、序代码*/ If (OSTaskDelReq(OS_PRIO_SELF) = OS_TASK_DEL_REQ) 释放所有占用的资源释放所有占用的资源; 释放所有动态内存释放所有动态内存; OSTaskDel(OS_PRIO_SELF); else /*应用程序代码应用程序代码*/ 6.7 改变任务的优先级n任务优先级的静态定义。方法?n任务优先级的动态改变INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio) 可以改变自身任务或其他任务的优先级不能改变空闲任务的优先级新优先级必须有效,而且必须没有被使用。有效的优先级?6.8 挂起任务n挂起:
16、将一个运行态的任务暂时中止n若挂起时,任务已经在就绪态或正在延时等待进入就绪态,那么挂起函数不起作用nINT8U OSTaskSuspend (INT8U prio) 不能挂起空闲任务优先级有效6.9 恢复任务n被挂起的任务只能被恢复函数所恢复。nINT8U OSTaskResume (INT8U prio) 不能恢复空闲任务优先级有效,且该优先级任务被挂起恢复挂起的任务后,首先要进行任务调度6.10 获得有关任务的信息n任务的信息:任务的任务控制块的内容nINT8U OSTaskQuery (INT8U prio, OS_TCB *pdata) INT8U prio;任务的优先级OS_TCB
17、 *pdata;保存任务信息的结构指针第七章 时间管理内容n7.1 任务延时函数n7.2 按时分秒延时函数n7.3 让处在延时期的任务结束延时n7.4 系统时间7.1 任务延时函数n延时服务申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。实现这个系统服务的函数叫做OSTimeDly()。调用该函数会使C/OS-进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才
18、会立即运行。 7.1 任务延时函数nvoid OSTimeDly (INT16U ticks) ticks 1-655360值代表无延时任务延时代表,进行一次任务调度时钟节拍=1/OS_TICKS_PER_SEC(参看OS_CFG.H )7.2 按时分秒延时函数nINT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) INT8U hoursINT8U minutesINT8U secondsINT16U milli时间的准确度与时钟节拍有关7.3 让处在延时期的任务结束延时nINT8U OSTimeDlyResume (INT8U prio) 用于结束任务延时,将任务转变为就绪态。会进行一次任务调度7.4 系统时间n32位计时器用于记录系统时间n计数范围4,294,967,295个时钟节拍n若时钟节拍为10ms,一次计数时间497天n从OSStart()调用开始计数或者溢出时计数7.4 系统时间nINT32U OSTimeGet (void) n返回值:计数器的当前值nvoid OSTi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024届海南省临高县新盈中学高三假期自主综合能力测试(一)数学试题
- 餐饮住房合同
- 不动产买卖合同解除协议模板
- 毕业生就业协议书入户地址
- 手术对骨骼健康的影响
- 防溺水模拟演练课件
- 山东省烟台招远市(五四制)2024-2025学年九年级上学期期中考试化学试题(含答案)
- 河北省石家庄市栾城区2024-2025学年七年级上学期期中生物学试题(含答案)
- 《化妆棉》规范要求
- 福建省泉州市安溪县2024-2025学年高三上学期11月期中测评试题 数学(含解析)
- 工厂供配电系统的动力方案及选型原则
- TD-T 1044-2014 生产项目土地复垦验收规程
- 《鲁滨逊漂流记》读书心得600字左右5篇
- 管道热损失的计算方法
- Unit 1 Art 单词默写 高中英语人教版(2019)选择性必修第三册
- 智能控制导论智慧树知到答案章节测试2023年昆明理工大学
- 初期雨水及超标废水收集工程施工方案
- 施工现场临时用电安全技术规范试题
- 软件开发论文参考文献,参考文献
- 机动车维修竣工出厂合格证样式
- 中国智库名录地区索引-北京地区
评论
0/150
提交评论