第八讲任务管理时间管理内存管理_第1页
第八讲任务管理时间管理内存管理_第2页
第八讲任务管理时间管理内存管理_第3页
第八讲任务管理时间管理内存管理_第4页
第八讲任务管理时间管理内存管理_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统设计嵌入式系统设计第八讲(3) 任务管理 时间管理、 内存管理授课教师:李英祥电邮地址:嵌入式系统设计嵌入式系统设计12/12/2主要内容w1. 任务管理w2. 时间管理w3. 内存管理嵌入式系统设计嵌入式系统设计12/12/31. 任务管理w建立任务ostaskcreate() w堆栈检验 ostaskstkchk() w删除任务ostaskdel() w请求删除任务ostaskdelreq() w改变任务的优先级ostaskchangeprio() w挂起任务ostasksuspend() w恢复任务ostaskresume()w获得有关任务的信息ostaskquery() 嵌入

2、式系统设计嵌入式系统设计12/12/4任务管理机制w任务管理用来实现对任务状态的直接控制和访问。w内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置任务属性等内容 。创建任务创建任务删除任务删除任务挂起任务挂起任务唤醒任务唤醒任务设置任务属性设置任务属性改变任务优先级改变任务优先级获取任务信息获取任务信息嵌入式系统设计嵌入式系统设计12/12/5建立任务ostaskcreate()wostaskcreate()需要四个参数:task是指向任务代码的指针;pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数 ;ptos是分配给任务的堆栈的栈顶指针

3、(任务堆栈);prio是分配给任务的优先级 嵌入式系统设计嵌入式系统设计12/12/6w返回值ostaskcreate()的返回值为下述之一:os_no_err:函数调用成功。os_prio_exist:具有该优先级的任务已经存在。os_prio_invalid:参数指定的优先级大于os_lowest_prio。os_no_more_tcb:系统中没有os_tcb可以分配给任务了。 嵌入式系统设计嵌入式系统设计12/12/7w注意/警告任务堆栈必须声明为os_stk类型。在任务中必须调用c/os提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务

4、得到cpu。用户程序中不能使用优先级0,1,2,3,以及os_lowest_prio-3, os_lowest_prio-2, os_lowest_prio-1, os_lowest_prio。这些优先级c/os系统保留,其余的56个优先级提供给应用程序。 嵌入式系统设计嵌入式系统设计12/12/8w每个任务都有自己的堆栈空间。堆栈必须声明为os_stk类型,并且由连续的内存空间组成。w用户可以静态分配堆栈空间(在编译的时候分配) ,静态堆栈声明应放置在函数的外面,这两种声明方式如下: 嵌入式系统设计嵌入式系统设计12/12/9w用户可以用c编译器提供的malloc()函数来动态地分配堆栈空间

5、,如程序清单 l4.6所示。w在动态分配中,用户要时刻注意内存碎片问题。嵌入式系统设计嵌入式系统设计12/12/10堆栈检验 ostaskstkchk() wostaskstkchk()检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间;w使用ostaskstkchk()函数要求所检查的任务是被ostaskcreateext()函数建立的,且opt参数中os_task_opt_stk_chk操作项打开。w参数参数prio为指定要获取堆栈信息的任务优先级,也可以指定参数os_prio_self,获取调用任务本身的信息。pdata指向一个类型为os_stk_data的数据结构 嵌入式系统设计

6、嵌入式系统设计12/12/11嵌入式系统设计嵌入式系统设计12/12/12删除任务ostaskdel()wostaskdel()函数删除一个指定优先级的任务;w任务可以传递自己的优先级给ostaskdel(),从而删除自身如果任务不知道自己的优先级,还可以传递参数os_prio_selfw被删除的任务将回到休眠状态。任务被删除后可以用函数ostaskcreate()或ostaskcreateext()重新建立w参数参数prio为指定要删除任务的优先级,也可以用参数os_prio_self代替,此时,下一个优先级最高的就绪任务将开始运行。 嵌入式系统设计嵌入式系统设计12/12/13范例范例嵌入

7、式系统设计嵌入式系统设计12/12/14请求删除任务ostaskdelreq()w如果任务a拥有内存缓冲区或信号量之类的资源,而任务b想删除该任务,这些资源就可能由于没被释放而丢失。在这种情况下,用户可以让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。用户可以通过ostaskdelreq()函数来完成该功能。 w发出删除任务请求的任务(任务b)和要删除的任务(任务a)都需要调用ostaskdelreq()函数。 例如,假设任务5要删除任务10,而任务10占有系统资源,此时任务5不能直接调用ostaskdel(10)删除任务10,而应该调用ostaskdelreq(10)向任务10发

8、送删除请求。在任务10中调用ostaskdelreq(os_prio_self),并检测返回值。如果返回os_task_del_req,则表明有来自其他任务的删除请求,此时任务10应该先释放资源,然后调用ostaskdel(os_prio_self)删除自己。嵌入式系统设计嵌入式系统设计12/12/15w参数参数prio为要求删除任务的优先级。如果参数为os_prio_self,则表示调用函数的任务正在查询是否有来自其他任务的删除请求。w返回值返回值ostaskdelreq()的返回值为下述之一:os_no_err:删除请求已经被任务记录。os_task_not_exist:指定的任务不存。发

9、送删除请求的任务可以等待此返回值,看删除是否成功。os_task_del_idle:错误操作,试图删除空闲任务(idle task)。os_prio_invalid:参数指定的优先级大于os_lowest_prio或没有设定os_prio_self的值。os_task_del_req:当前任务收到来自其他任务的删除请求。 嵌入式系统设计嵌入式系统设计12/12/16嵌入式系统设计嵌入式系统设计12/12/17嵌入式系统设计嵌入式系统设计12/12/18改变任务的优先级ostaskchangeprio()w在用户建立任务的时候会分配给任务一个优先级。在程序运行期间,用户可以通过调用ostaskc

10、hangeprio()来改变任务的优先级 ;w用户不能改变空闲任务的优先级,但用户可以改变调用本函数的任务或者其它任务的优先级;w 参数oldprio是任务原先的优先级。newprio 是任务的新优先级。嵌入式系统设计嵌入式系统设计12/12/19挂起任务ostasksuspend() wostasksuspend()无条件挂起一个任务。调用此函数的任务也可以传递参数os_prio_self,挂起调用任务本身。w当前任务挂起后,只有其他任务才能唤醒。任务挂起后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。w唤醒挂起任务需要调用函数ostaskresume ()。w任务的挂起是可以叠

11、加到其他操作上的。例如,任务被挂起时正在进行延时操作,那么任务的唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作。 嵌入式系统设计嵌入式系统设计12/12/20恢复任务 ostaskresume()wostaskresume ()唤醒一个用ostasksuspend()函数挂起的任务。wostaskresume()也是唯一能“解挂”挂起任务的函数。 w参数参数prio指定要唤醒任务的优先级。w返回值返回值ostaskresume ()的返回值为下述之一:os_no_err:函数调用成功。os_task_resume_prio:要唤醒的任务不存在。os_task_not_suspended:

12、要唤醒的任务不在挂起状态。os_prio_invalid:参数指定的优先级大于或等于os_lowest_prio。嵌入式系统设计嵌入式系统设计12/12/21获得有关任务的信息ostaskquery() w用户的应用程序可以通过调用ostaskquery()来获得自身或其它应用任务的信息。w参数参数prio为指定要获取tcb内容的任务优先级,也可以指定参数os_prio_self,获取调用任务的信息。pdata指向一个os_tcb类型的数据结构,容纳返回的任务tcb的一个拷贝。 嵌入式系统设计嵌入式系统设计12/12/222. 时间管理w任务延时函数ostimedly() w按时分秒延时函数

13、ostimedlyhmsm() w结束任务延时ostimedlyresume() w系统时间ostimeget()和ostimeset() 嵌入式系统设计嵌入式系统设计12/12/23任务延时函数ostimedly() wostimedly()将一个任务延时若干个时钟节拍。如果延时时间大于0,系统将立即进行任务调度。w延时时间的长度可从0到65535个时钟节拍。延时时间0表示不进行延时,函数将立即返回调用者。延时的具体时间依赖于系统每秒钟有多少时钟节拍(由常量os_ticks_per_sec设定)。w参数参数ticks为要延时的时钟节拍数。w注意注意/警告:警告:为了确保设定的延时时间,建议用

14、户设定的时钟节拍数加1。例如,希望延时10个时钟节拍,可设定参数为11。 嵌入式系统设计嵌入式系统设计12/12/24按时分秒延时函数 ostimedlyhmsm() wostimedlyhmsm()将一个任务延时若干时间。延时的单位是小时、分、秒、毫秒。调用ostimedlyhmsm()后,如果延时时间不为0,系统将立即进行任务调度。w参数参数hours为延时小时数,范围从0-255。minutes为延时分钟数,范围从0-59。seconds为延时秒数,范围从0-59milli为延时毫秒数,范围从0-999。w返回值返回值ostimedlyhmsm()的返回值为下述之一:os_no_err:

15、函数调用成功。os_time_invalid_minutes:参数错误,分钟数大于59。os_time_invalid_seconds:参数错误,秒数大于59。os_time_invalid_milli:参数错误,毫秒数大于999。os_time_zero_dly:四个参数全为0。 嵌入式系统设计嵌入式系统设计12/12/25结束任务延时ostimedlyresume() wostimedlyresume()唤醒一个用ostimedly()或ostimedlyhmsm()函数延时的任务。w参数参数prio为指定要唤醒任务的优先级。w注意注意/警告警告不应该用ostimedlyresume()去

16、唤醒一个设置了等待超时操作,并且正在等待事件发生的任务。操作的结果是使该任务结束等待,除非的确希望这么做。 嵌入式系统设计嵌入式系统设计12/12/26系统时间ostimeget()和ostimeset() wostimeget()获取当前系统时钟数值。w系统时钟是一个32位的计数器,记录系统上电后或时钟重新设置后的时钟计数。w参数参数无w返回值返回值当前时钟计数(时钟节拍数)嵌入式系统设计嵌入式系统设计12/12/27wostimeset()设置当前系统时钟数值。w参数参数ticks要设置的时钟数,单位是时钟节拍数。w返回值返回值无。无。嵌入式系统设计嵌入式系统设计12/12/283. 内存

17、管理w内存控制块w建立一个内存分区 osmemcreate()w分配一个内存块 osmemget()w释放一个内存块 osmemput() w查询一个内存分区的状态osmemquery()嵌入式系统设计嵌入式系统设计12/12/29内存控制块w在ansi c中可以用malloc()和free()两个函数动态地分配内存和释放内存;w在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片;w由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到;w在c/os-ii中,操作系统把连续的大块内存按分区来管理,每个分区中

18、包含有整数个大小相同的内存块。w利用这种机制,c/os-ii 对malloc()和free()函数进行了改进,使得它们可以分配和释放固定大小的内存块; 嵌入式系统设计嵌入式系统设计12/12/30嵌入式系统设计嵌入式系统设计12/12/31w在c/os-ii中使用内存控制块(memory control blocks)的数据结构来跟踪每一个内存分区;嵌入式系统设计嵌入式系统设计12/12/32wosmemaddr是指向内存分区起始地址的指针。它在建立内存分区建立一个内存分区,osmemcreate()时被初始化,在此之后就不能更改了。wosmemfreelist是指向下一个空闲内存控制块或者下

19、一个空闲的内存块的指针,具体含义要根据该内存分区是否已经建立来决定。wosmemblksize是内存分区中内存块的大小,是用户建立该内存分区时指定的。wosmemnblks是内存分区中总的内存块数量,也是用户建立该内存分区时指定的。wosmemnfree是内存分区中当前可以得空闲内存块数量。 嵌入式系统设计嵌入式系统设计12/12/33c/os-ii 在启动时就会对内存管理器进行初始化由osinit()调用osmeminit()实现。该初始化主要建立一个图 f7.3所示的内存控制块链表 其中的常数os_max_mem_part定义了最大的内存分区数嵌入式系统设计嵌入式系统设计12/12/34建

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

21、int32u nblks ,int32u blksize, int8u *err) 嵌入式系统设计嵌入式系统设计12/12/35嵌入式系统设计嵌入式系统设计12/12/36分配一个内存块 osmemget()w应用程序可以调用osmemget()函数从已经建立的内存分区中申请一个内存块;w该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由osmemcreate()函数返回;w显然,应用程序必须知道内存块的大小,并且在使用时不能超过该容量嵌入式系统设计嵌入式系统设计12/12/37w参数参数pmem 是指向内存区控制块的指针,可以从osmemcreate()函数返回得到。err 是指向包含错误码的变量的指针。osmemget(函数返回的错误码可能为下述几种:wos_no_err :成功得到一个内存块。wos_mem_no_free_blks :内存区已经没有空间分配给内存块。w返回值返回值osmemget()函数返回指向内存区块的指针。如果没有空间分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论