欢迎来到天天文库
浏览记录
ID:26990936
大小:228.01 KB
页数:43页
时间:2018-11-30
《任务管理时间管理内存》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八讲(3)任务管理时间管理、内存管理授课教师:李英祥电邮地址:drliyingxiang@163.com主要内容1.任务管理2.时间管理3.内存管理2021/8/92www.cuit.edu.cn1.任务管理建立任务OSTaskCreate()堆栈检验OSTaskStkChk()删除任务OSTaskDel()请求删除任务OSTaskDelReq()改变任务的优先级OSTaskChangePrio()挂起任务OSTaskSuspend()恢复任务OSTaskResume()获得有关任务的信息OSTa
2、skQuery()2021/8/93www.cuit.edu.cn任务管理机制任务管理用来实现对任务状态的直接控制和访问。内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置任务属性等内容。创建任务删除任务挂起任务唤醒任务设置任务属性改变任务优先级获取任务信息…任务管理功能2021/8/94www.cuit.edu.cn建立任务OSTaskCreate()OSTaskCreate()需要四个参数:task是指向任务代码的指针;Pdata指向一个数据结构,该结构用来在
3、建立任务时向任务传递参数;ptos是分配给任务的堆栈的栈顶指针(任务堆栈);prio是分配给任务的优先级2021/8/95www.cuit.edu.cn返回值OSTaskCreate()的返回值为下述之一:OS_NO_ERR:函数调用成功。OS_PRIO_EXIST:具有该优先级的任务已经存在。OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO。OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了。2021/8/96www.cuit.edu.cn注意/警告
4、任务堆栈必须声明为OS_STK类型。在任务中必须调用μC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到CPU。用户程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,OS_LOWEST_PRIO。这些优先级μC/OS系统保留,其余的56个优先级提供给应用程序。2021/8/97www.cuit.edu.cn每个任务都有自己的堆栈空间。堆栈必须声明为O
5、S_STK类型,并且由连续的内存空间组成。用户可以静态分配堆栈空间(在编译的时候分配),静态堆栈声明应放置在函数的外面,这两种声明方式如下:2021/8/98www.cuit.edu.cn用户可以用C编译器提供的malloc()函数来动态地分配堆栈空间,如程序清单L4.6所示。在动态分配中,用户要时刻注意内存碎片问题。2021/8/99www.cuit.edu.cn堆栈检验OSTaskStkChk()OSTaskStkChk()检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间;使用OSTask
6、StkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的,且opt参数中OS_TASK_OPT_STK_CHK操作项打开。参数prio为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的信息。pdata指向一个类型为OS_STK_DATA的数据结构2021/8/910www.cuit.edu.cn2021/8/911www.cuit.edu.cn删除任务OSTaskDel()OSTaskDel()函数删除一个指定优先级的任务;任务可以
7、传递自己的优先级给OSTaskDel(),从而删除自身如果任务不知道自己的优先级,还可以传递参数OS_PRIO_SELF被删除的任务将回到休眠状态。任务被删除后可以用函数OSTaskCreate()或OSTaskCreateExt()重新建立参数prio为指定要删除任务的优先级,也可以用参数OS_PRIO_SELF代替,此时,下一个优先级最高的就绪任务将开始运行。2021/8/912www.cuit.edu.cn范例2021/8/913www.cuit.edu.cn请求删除任务OSTaskDelReq
8、()如果任务A拥有内存缓冲区或信号量之类的资源,而任务B想删除该任务,这些资源就可能由于没被释放而丢失。在这种情况下,用户可以让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。用户可以通过OSTaskDelReq()函数来完成该功能。发出删除任务请求的任务(任务B)和要删除的任务(任务A)都需要调用OSTaskDelReq()函数。例如,假设任务5要删除任务10,而任务10占有系统资源,此时任务5不能直接调用OSTaskDel(10)删除任务1
此文档下载收益归作者所有