第八讲任务管理时间管理内存管理.ppt

上传人:本田雅阁 文档编号:2085198 上传时间:2019-02-11 格式:PPT 页数:43 大小:228.01KB
返回 下载 相关 举报
第八讲任务管理时间管理内存管理.ppt_第1页
第1页 / 共43页
第八讲任务管理时间管理内存管理.ppt_第2页
第2页 / 共43页
第八讲任务管理时间管理内存管理.ppt_第3页
第3页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第八讲任务管理时间管理内存管理.ppt》由会员分享,可在线阅读,更多相关《第八讲任务管理时间管理内存管理.ppt(43页珍藏版)》请在三一文库上搜索。

1、第八讲(3) 任务管理 时间管理、 内存管理,授课教师:李英祥 电邮地址:,2019/2/11,,2,主要内容,1. 任务管理 2. 时间管理 3. 内存管理,2019/2/11,,3,1. 任务管理,建立任务OSTaskCreate() 堆栈检验 OSTaskStkChk() 删除任务OSTaskDel() 请求删除任务OSTaskDelReq() 改变任务的优先级OSTaskChangePrio() 挂起任务OSTaskSuspend() 恢复任务OSTaskResume() 获得有关任务的信息OSTaskQuery(),2019/2/11,,4,任务管理机制,任务管理用来实现对任务状态的

2、直接控制和访问。 内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置任务属性等内容 。,创建任务 删除任务 挂起任务 唤醒任务 设置任务属性 改变任务优先级 获取任务信息 ,任务管理功能,2019/2/11,,5,建立任务OSTaskCreate(),OSTaskCreate()需要四个参数: task是指向任务代码的指针; Pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数 ; ptos是分配给任务的堆栈的栈顶指针(任务堆栈); prio是分配给任务的优先级,2019/2/11,,6,返回值 OSTaskCreate()的返回值为下述之一:

3、 OS_NO_ERR:函数调用成功。 OS_PRIO_EXIST:具有该优先级的任务已经存在。 OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO。 OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了。,2019/2/11,,7,注意/警告 任务堆栈必须声明为OS_STK类型。 在任务中必须调用C/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到CPU。 用户程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST

4、_PRIO-1, OS_LOWEST_PRIO。这些优先级C/OS系统保留,其余的56个优先级提供给应用程序。,2019/2/11,,8,每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。 用户可以静态分配堆栈空间(在编译的时候分配) ,静态堆栈声明应放置在函数的外面,这两种声明方式如下:,2019/2/11,,9,用户可以用C编译器提供的malloc()函数来动态地分配堆栈空间,如程序清单 L4.6所示。 在动态分配中,用户要时刻注意内存碎片问题。,2019/2/11,,10,堆栈检验 OSTaskStkChk(),OSTaskStkChk()检查任务堆栈

5、状态,计算指定任务堆栈中的未用空间和已用空间; 使用OSTaskStkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的,且opt参数中OS_TASK_OPT_STK_CHK操作项打开。 参数 prio为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的信息。 pdata指向一个类型为OS_STK_DATA的数据结构,2019/2/11,,11,2019/2/11,,12,删除任务OSTaskDel(),OSTaskDel()函数删除一个指定优先级的任务; 任务可以传递自己的优先级给OSTaskDel(),从而删除自身 如果任

6、务不知道自己的优先级,还可以传递参数OS_PRIO_SELF 被删除的任务将回到休眠状态。任务被删除后可以用函数OSTaskCreate()或OSTaskCreateExt()重新建立 参数 prio为指定要删除任务的优先级,也可以用参数OS_PRIO_SELF代替,此时,下一个优先级最高的就绪任务将开始运行。,2019/2/11,,13,范例,2019/2/11,,14,请求删除任务OSTaskDelReq(),如果任务A拥有内存缓冲区或信号量之类的资源,而任务B想删除该任务,这些资源就可能由于没被释放而丢失。在这种情况下,用户可以让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。

7、用户可以通过OSTaskDelReq()函数来完成该功能。 发出删除任务请求的任务(任务B)和要删除的任务(任务A)都需要调用OSTaskDelReq()函数。 例如,假设任务5要删除任务10,而任务10占有系统资源,此时任务5不能直接调用OSTaskDel(10)删除任务10,而应该调用OSTaskDelReq(10)向任务10发送删除请求。 在任务10中调用OSTaskDelReq(OS_PRIO_SELF),并检测返回值。如果返回OS_TASK_DEL_REQ,则表明有来自其他任务的删除请求,此时任务10应该先释放资源,然后调用OSTaskDel(OS_PRIO_SELF)删除自己。,2

8、019/2/11,,15,参数 prio为要求删除任务的优先级。如果参数为OS_PRIO_SELF,则表示调用函数的任务正在查询是否有来自其他任务的删除请求。 返回值 OSTaskDelReq()的返回值为下述之一: OS_NO_ERR:删除请求已经被任务记录。 OS_TASK_NOT_EXIST:指定的任务不存。发送删除请求的任务可以等待此返回值,看删除是否成功。 OS_TASK_DEL_IDLE:错误操作,试图删除空闲任务(Idle task)。 OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO或没有设定OS_PRIO_SELF的值。 OS_TASK_DEL

9、_REQ:当前任务收到来自其他任务的删除请求。,2019/2/11,,16,2019/2/11,,17,2019/2/11,,18,改变任务的优先级OSTaskChangePrio(),在用户建立任务的时候会分配给任务一个优先级。在程序运行期间,用户可以通过调用OSTaskChangePrio()来改变任务的优先级 ; 用户不能改变空闲任务的优先级,但用户可以改变调用本函数的任务或者其它任务的优先级; 参数 oldprio是任务原先的优先级。 newprio 是任务的新优先级。,2019/2/11,,19,挂起任务OSTaskSuspend(),OSTaskSuspend()无条件挂起一个任务

10、。调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本身。 当前任务挂起后,只有其他任务才能唤醒。任务挂起后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。 唤醒挂起任务需要调用函数OSTaskResume ()。 任务的挂起是可以叠加到其他操作上的。例如,任务被挂起时正在进行延时操作,那么任务的唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作。,2019/2/11,,20,恢复任务 OSTaskResume(),OSTaskResume ()唤醒一个用OSTaskSuspend()函数挂起的任务。 OSTaskResume()也是唯一能“解挂”挂起任务的函数。

11、 参数 prio指定要唤醒任务的优先级。 返回值 OSTaskResume ()的返回值为下述之一: OS_NO_ERR:函数调用成功。 OS_TASK_RESUME_PRIO:要唤醒的任务不存在。 OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。 OS_PRIO_INVALID:参数指定的优先级大于或等于OS_LOWEST_PRIO。,2019/2/11,,21,获得有关任务的信息OSTaskQuery(),用户的应用程序可以通过调用OSTaskQuery()来获得自身或其它应用任务的信息。 参数 prio为指定要获取TCB内容的任务优先级,也可以指定参数OS_PRIO

12、_SELF,获取调用任务的信息。 pdata指向一个OS_TCB类型的数据结构,容纳返回的任务TCB的一个拷贝。,2019/2/11,,22,2. 时间管理,任务延时函数OSTimeDly() 按时分秒延时函数 OSTimeDlyHMSM() 结束任务延时OSTimeDlyResume() 系统时间OSTimeGet()和OSTimeSet(),2019/2/11,,23,任务延时函数OSTimeDly(),OSTimeDly()将一个任务延时若干个时钟节拍。如果延时时间大于0,系统将立即进行任务调度。 延时时间的长度可从0到65535个时钟节拍。延时时间0表示不进行延时,函数将立即返回调用者

13、。延时的具体时间依赖于系统每秒钟有多少时钟节拍(由常量OS_TICKS_PER_SEC设定)。 参数 ticks为要延时的时钟节拍数。 注意/警告: 为了确保设定的延时时间,建议用户设定的时钟节拍数加1。例如,希望延时10个时钟节拍,可设定参数为11。,2019/2/11,,24,按时分秒延时函数 OSTimeDlyHMSM(),OSTimeDlyHMSM()将一个任务延时若干时间。延时的单位是小时、分、秒、毫秒。调用OSTimeDlyHMSM()后,如果延时时间不为0,系统将立即进行任务调度。 参数 hours为延时小时数,范围从0-255。 minutes为延时分钟数,范围从0-59。 s

14、econds为延时秒数,范围从0-59 milli为延时毫秒数,范围从0-999。 返回值 OSTimeDlyHMSM()的返回值为下述之一: OS_NO_ERR:函数调用成功。 OS_TIME_INVALID_MINUTES:参数错误,分钟数大于59。 OS_TIME_INVALID_SECONDS:参数错误,秒数大于59。 OS_TIME_INVALID_MILLI:参数错误,毫秒数大于999。 OS_TIME_ZERO_DLY:四个参数全为0。,2019/2/11,,25,结束任务延时OSTimeDlyResume(),OSTimeDlyResume()唤醒一个用OSTimeDly()或

15、OSTimeDlyHMSM()函数延时的任务。 参数 prio为指定要唤醒任务的优先级。 注意/警告 不应该用OSTimeDlyResume()去唤醒一个设置了等待超时操作,并且正在等待事件发生的任务。 操作的结果是使该任务结束等待,除非的确希望这么做。,2019/2/11,,26,系统时间OSTimeGet()和OSTimeSet(),OSTimeGet()获取当前系统时钟数值。 系统时钟是一个32位的计数器,记录系统上电后或时钟重新设置后的时钟计数。 参数 无 返回值 当前时钟计数(时钟节拍数),2019/2/11,,27,OSTimeSet()设置当前系统时钟数值。 参数 ticks要设

16、置的时钟数,单位是时钟节拍数。 返回值 无。,2019/2/11,,28,3. 内存管理,内存控制块 建立一个内存分区 OSMemCreate() 分配一个内存块 OSMemGet() 释放一个内存块 OSMemPut() 查询一个内存分区的状态OSMemQuery(),2019/2/11,,29,内存控制块,在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存; 在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片; 由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到;

17、在C/OS-II中,操作系统把连续的大块内存按分区来管理,每个分区中包含有整数个大小相同的内存块。 利用这种机制,C/OS-II 对malloc()和free()函数进行了改进,使得它们可以分配和释放固定大小的内存块;,2019/2/11,,30,2019/2/11,,31,在C/OS-II中使用内存控制块(memory control blocks)的数据结构来跟踪每一个内存分区;,2019/2/11,,32,OSMemAddr是指向内存分区起始地址的指针。它在建立内存分区建立一个内存分区,OSMemCreate()时被初始化,在此之后就不能更改了。 OSMemFreeList是指向下一个空

18、闲内存控制块或者下一个空闲的内存块的指针,具体含义要根据该内存分区是否已经建立来决定。 OSMemBlkSize是内存分区中内存块的大小,是用户建立该内存分区时指定的。 OSMemNBlks是内存分区中总的内存块数量,也是用户建立该内存分区时指定的。 OSMemNFree是内存分区中当前可以得空闲内存块数量。,2019/2/11,,33,C/OS-II 在启动时就会对内存管理器进行初始化由OSInit()调用OSMemInit()实现。 该初始化主要建立一个图 F7.3所示的内存控制块链表 其中的常数OS_MAX_MEM_PART定义了最大的内存分区数,2019/2/11,,34,建立一个内存

19、分区 OSMemCreate(),OSMemCreate()函数建立并初始化一块内存区; 一块内存区包含指定数目的大小确定的内存块,程序可以包含这些内存块并在用完后释放回内存区; 该函数共有4个参数: 内存分区的起始地址 分区内的内存块总块数 每个内存块的字节数 和一个指向错误信息代码的指针 返回值:如果OSMemCreate()操作失败,它将返回一个NULL指针。否则,它将返回一个指向内存控制块的指针; 对内存管理的其它操作,象OSMemGet(),OSMemPut(),OSMemQuery()函数等,都要通过该指针进行;,OS_MEM *OSMemCreate( void *addr, I

20、NT32U nblks ,INT32U blksize, INT8U *err),2019/2/11,,35,2019/2/11,,36,分配一个内存块 OSMemGet(),应用程序可以调用OSMemGet()函数从已经建立的内存分区中申请一个内存块; 该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由OSMemCreate()函数返回; 显然,应用程序必须知道内存块的大小,并且在使用时不能超过该容量,2019/2/11,,37,参数 pmem 是指向内存区控制块的指针,可以从OSMemCreate()函数返回得到。 Err 是指向包含错误码的变量的指针。OSMemGet(

21、函数返回的错误码可能为下述几种: OS_NO_ERR :成功得到一个内存块。 OS_MEM_NO_FREE_BLKS :内存区已经没有空间分配给内存块。 返回值 OSMemGet()函数返回指向内存区块的指针。如果没有空间分配给内存块,OSMemGet()函数返回空指针。,2019/2/11,,38,释放一个内存块 OSMemPut(),当用户应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这个操作由OSMemPut()函数完成。 必须注意的是,OSMemPut()并不知道一个内存块是属于哪个内存分区的。,2019/2/11,,39,参数 pmem 是指向内存区控制块

22、的指针,可以从OSMemCreate()函数 返回得到。 Pblk 是指向将被释放的内存块的指针。 返回值 OSMemPut()函数的返回值为下述之一: OS_NO_ERR :成功释放内存块 OS_MEM_FULL :内存区已经不能再接受更多释放的内存块。这种情况说明用户程序出现了错误,释放了多于用OSMemGet()函数得到的内存块。,2019/2/11,,40,2019/2/11,,41,查询一个内存分区的状态OSMemQuery(),OSMemQuery()函数得到内存区的信息; 该函数返回OS_MEM结构包含的信息,但使用了一个新的OS_MEM_DATA的数据结构; OS_MEM_DATA数据结构还包含了正被使用的内存块数目的域;,2019/2/11,,42,参数 pmem 是指向内存区控制块的指针,可以从OSMemCreate()函数 返回得到。 Pdata 是指向OS_MEM_DATA数据结构的指针,该数据结构包含了以下的域: 返回值 OSMemQuery()函数返回值总是OS_NO_ERR。,2019/2/11,,43,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1