嵌入式实时操作系统整理版修正版_第1页
嵌入式实时操作系统整理版修正版_第2页
嵌入式实时操作系统整理版修正版_第3页
嵌入式实时操作系统整理版修正版_第4页
嵌入式实时操作系统整理版修正版_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、9嵌入式实时操作系统整理版修正版整理:飞鸟执行小组时间:2013-10-16审核: flyer1.嵌入式系统的历史和发展(p12 1.3节、图1.7)c/os-ii是由jean j. labrosse于1992年编写的一个嵌入式多任务的实时操作系统,最早这个系统叫做c/os,后来经过近10年的应用和修改,在1999年jean j. labrosse推出了c/os-ii。c/os-ii是用c语言和汇编语言来编写的,绝大部分是用c语言编写的,只有极少部分与处理器密切相关的部分代码是用汇编语言编写的。它构思巧妙,结构简洁精练,可读性强。2.基础使用bc3.1、bc4.5、bc5.0方法makefil

2、e的编写(1)/批处理文件maketest.batecho offecho *echo * 批处理文件文件名为maketest.mak *echo *echo ond:bcbinmake -f maketest.mak(2)/makefile文件maketest.mak# 创建可执行文件(exe)test.exe: pa.obj pb.obj test.objtlink test.lnk# 创建各个目标文件(obj)pa.obj: pa.c pa.hbcc -c -ml -ic:bcinclude -i. -lc:bclib pa.cpb.obj: pb.c pb.hbcc -c -ml -i

3、c:bcinclude -i. -lc:bclib pb.ctest.obj: test.cbcc -c -ml -ic:bcinclude -i. -lc:bclib test.c(3)/ test.lnk文件c:bclibc0l.obj pa.obj pb.obj test.objtesttestc:bclibcl.lib3. c/os-ii任务:全书的重点和难点概念 任务、任务的状态转换概念:与小任务对应的程序实体叫做任务。从代码上看,c/os-ii的任务就是一个函数。而从存储结构上看,c/os-ii的任务由三部分组成:任务程序代码(函数)、任务堆栈和任务控制块,任务控制块就是关联了任务

4、代码的程序控制块,它记录了任务的各个属性;任务堆栈则用来保存任务的工作环境,任务程序代码就是任务的执行部分。用代码实现状态的转换(需要调用函数)任务的状态转换图:睡眠状态:任务只是以代码的形式驻留在内存,还没有交给操作系统管理。就绪状态:任务配备了任务控制块且在任务就绪表中登记,具备了任务运行的充分条件。运行状态:处于就绪状态的任务获得了cpu的使用权,任何时候只有一个任务处于运行。等待状态:正在运行的任务,把cpu的使用权让给其他任务。中断服务状态:正在运行的任务一旦响应中断申请,就会中止运行而去执行中断服务程序。1)用户任务代码的结构void mytask(void *pdata)for(

5、;)可以被中断的用户代码;os_enter_critical();/进入临界段(关中断)不可以被中断的用户代码;os_exit_critical();/退出临界段(开中断)可以被中断的用户代码;2)用户应用程序的结构:void mytask1(void *pdata)/定义用户任务1for(;)void mytask2(void *pdata)/定义用户任务2for(;)void mytask3(void *pdata)/定义用户任务3for(;)void main()osinit();/初始化c/os-iiostaskcreate(mytask1,);/创建用户任务1ostaskcreate

6、(mytask2,);/创建用户任务2ostaskcreate(mytask3,);/创建用户任务3osstart();/启动c/os-ii任务的三要素:任务程序代码、任务堆栈、任务控制块1)关于任务的优先级:mc/os ii 2.5版本支持64个任务,每个任务一个特定的优先级。数字越小,优先级越高。系统总是运行进入就绪态优先级最高的任务。任务优先级号就是任务编号(id).优先级号也被一些内核功能函数调用。如ostaskchangeprio( )及ostaskdel( )。系统占用了8个任务,保留优先级为0、1、2、3、os_lowest_prio-3、 os_lowest_prio-2、 o

7、s_lowest_prio-1、 os_lowest_prio-0。即:建议不使用上述最高4个和最低4个优先级,用户任务仍可达56个。2)任务就绪表每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量osrdygrp和osrdytbl。 在osrdygrp中,任务按优先级分组,8个任务为一组。osrdygrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表osrdytbl中的相应元素的相应位也置位。 根据就绪表确定最高优先级两个关键: 优先级数分解为高三位和低三位分别确定高优先级有着小的优先级号 3)map表:(表的内容,为什么要用这表,表的作用,表是如何定

8、义的)unmap表就不用记了。char osmaptbl8 = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80; 是为加快运算速度定义的一个数组5)osrdygrp:uc/os-ii定义了一个类型为int8u的变量osrdygrp,使该变量的每一位都对应osrdytbl 的一个任务组.如果某任务组中有任务就绪,则在变量osrdygrp里把该任务组所对应的位置为1,否则置为0 ,从而快速对任务就绪表osrdytbl 查找。6)数组ostcbtbl有什么用途:专门用来以任务的优先级别为顺序在各个数组元素里存放指向各个任务控制块的指针,这样系统在访问一个

9、任务的任务控制块时,就不必遍历任务控制块链表,从而加快对任务控制块的访问速度。4.已知osrdygrp的值及osrdytbly中的每个元素的值,请叙述任务就绪表中查找最高优先级的算法和过程,写出代码(示意)答:设prio=00d5d4d3d2d1d0y=osunmaptblosrdygrpx= osunmaptblosrdytblyosprohighrdy=(y<<3)+x5.叙述已知任务的优先级a的优先级是prio,将其置为就绪态的过程。(3.4.2节 p58)答:设prio=00d5d4d3d2d1d0osrdygrp中的第y位(d5d4d3位)或1(不管原来是1或0,该位置1

10、);第y组元素即元素osrdytbly(第y行)的第x位(d2d1d0位)置1;首先使osrdygrp中的第y位置1:osrdygrposmaptblprio>>3;osrdytblprio>>3 osmaptblprio&0x07;6.叙述已知任务的优先级a的优先级是prio,将其脱离就绪态的算法和过程。答:设prio=00d5d4d3d2d1d0第y组元素即元素osrdytbly(第y行)的第x位(d2d1d0位)清零,如果这时第y组元素即osrdytbly中无就绪任务,则osrdygrp中的第y位清零;否则第y组元素即osrdytbly中还有就绪任务,则o

11、srdygrp中的第y位不清零。if(osrdytblprio>>3&= osmaptblprio&0x07)=0)osrdygrp&= osmaptblprio>>3;7.堆栈:栈顶sp的值,在x86中是如何初始化的。通过ostaskcreate(mytask,s,&taskstartstktask_stk_size - 1,0)函数中的参数&taskstartstktask_stk_size - 1设置任务堆栈栈顶指针。8.任务的创建函数:ostaskcreate()删除函数:ostaskdel()osinit():初始化c/

12、os-iipc_dossavereturn():保存dos环境pc_vect(ucos,osctxsw):安装c/os-ii任务切换中断向量osstart():启动c/os-ii的多任务管理ostasksuspend(int8u prio):挂起优先级为prio的任务ostaskresume():恢复任务任务的初始化完成哪些功能:当应用程序调用函数ostaskcreate()创建一个任务时,这个函数会调用系统函数ostcbinit()来为任务控制块进行初始化。该函数主要完成以下任务:1)为被创建任务从空任务控制块链表获取一个任务控制块;2)用任务的属性对任务控制块各个成员进行赋值;3)把这个任

13、务控制块链入到任务控制块链表。什么叫任务控制块,作用是什么?定义:c/os-ii用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块。作用:任务控制块相当于一个任务的身份证,系统就是通过任务控制块来感知和管理任务的,没有任务控制块的任务不能被系统承认和管理。9.简述c/os-ii的中断及响应过程系统接收到中断请求后,如果这时cpu处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回被中止的任务继续运行,或者转向运行另一个具有更高优先级别

14、的就绪任务。10.(1)osintenter()(进入中断函数)的作用:把全局变量osintnesting加1,从而用它来记录中断嵌套的层数。(2)osintexit()(退出中断函数)的作用:这个函数在中断嵌套层计数器为0、调度器未被锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下将要进行任务切换,否则就返回被中断的服务子程序。(3)osctxsw()的作用:任务切换11.(1)操作系统最小时钟单位是 时钟节拍 (2)时钟节拍的定义: 周期性的信号源 12.ostimetick():时钟节拍服务函数,在时钟服务中断程序中调用,在每个时钟节拍了解每个任务的延时状态,使其中已

15、经到了延时时限的非挂起任务进入就绪状态。ostickisr():硬件定时器以时钟节拍为周期定时的产生中断,该中断的中断服务程序叫做ostickisr()。osintertask():任务中断函数ostimedlyhmsm()、ostimedly():所有用户任务必须在任务中合适的位置调用函数ostimedly(),或通过调用函数ostimedlyhmsm()调用ostimedly()。ostimedly()的参数ticks为以时钟节拍数为单位的延时时间的,而ostimedlyhmsm()的参数分别是时,分,秒。ostimeget():获得并显示系统的时钟节拍数ostime。13.任务同步的定义

16、在实时操作系统中,两个任务并发执行,一个任务要等待另一个任务发来消息,或建立某个条件后才能继续执行,否则只能等待,这种制约性合作关系被称为任务的同步。14.通过什么方法使任务同步的设置一个互斥信号量,从而使任务可以根据信号量的状态来判断何时访问共享资源。15.osmboxcreate():创建消息邮箱osmboxpost():向消息邮箱发送消息osmboxpend():请求消息邮箱osmboxquery():查询邮箱的状态osmboxdel():删除邮箱16.例5-1、5-2程序分析,详细的执行过程(1)例5-1答:本实验有2个用户任务,mytask和youtask,这两个任务都要访问一个共享

17、的资源s。mytask的优先级为0,youtask的优先级为2,所以mytask的优先级更高。mytask先运行,在屏幕上输出mytask访问共享数据s,执行完之后要有200个时钟节拍的等待时间。在mytask等待的时候,youtask开始被调用,在屏幕上输出youtask访问共享数据s,但是在其内部,重新设置了一下系统的时钟节拍数ostime为0,并且当ostime小于500时,要在另外一列输出youtask访问共享数据s,但是在这500以内mytask肯定会恢复过来,youtask会保存现场信息,待到mytask等待,youtask就要恢复现场信息,但是由于s刚被mytask修改为myta

18、sk访问共享数据s,所以此时也是输出mytask访问共享数据s。从结果可以看出:在youtask访问共享资源s期间高优先级别的任务mytask也访问了s,从而干扰了任务youtask对共享资源s的访问。(2)例5-2写出程序的执行过程:答:启动多任务;运行mytask;修改信号量为无效;占用共享资源s; 再修改信号量为有效;mytask延时挂起20个时钟节拍;运行youtask;修改信号量为无效;占用共享资源s;再次占用共享资源s; 再修改信号量为有效;youtask延时挂起10个时钟节拍;17.由应用程序设计者编写的任务叫做用户任务;由系统提供的任务叫系统任务。18.任务控制块中ostcbn

19、ext、ostcbprev两个变量使任务能构成双向链表。19.内核负责管理各个任务,或者为每个任务分配cpu时间,并且负责任务之间的通信,内核的基本服务是任务调度。20.可剥夺型内核型的定义是总是运行(多任务中)优先级高的那个任务。21.为了实现不同层次的管理,系统提供了基于段或页的存储器访问方式。段由1mb的存储块构成;小页有4kb的存储块构成。22.嵌入式系统可以采用提供不同的时钟频率技术来降低功效。23.嵌入式系统是可以嵌入到对象体系内部的专用计算机系统。24.并不是所有电子设备都属于嵌入式设备。25.ac_key作用:是共享资源s的信号量。26.cisc不会被risc所取代。27.在c

20、/os-ii操作系统中,任务的优先级可以做任务的标识。28.arm系列微处理器堆栈增长方向是向下。29. 在c/os-ii操作系统中,定义变量osrdygrp,通过osrdygrp在访问任务就绪表,是为了查询就绪表中任何一个任务的状态时时间相等。30. 在c/os-ii操作系统中,先分区,区内分块,用os_mem来定义内存分区块数据结构,用内存控制块链表记录内存使用情况,要申请一个内存块,用函数osmemget()。31.任务控制块链表在任务控制块中再添加两个指针成员,一个用来指向前一个控制块,另一个用来指向下一个控制块,从而把所有的被管理代码的控制块用链表组织了起来。32. 在c/os-ii

21、操作系统中,使用信号量,邮箱和消息队列这些被称作事件的中间环节来实现任务之间的通信。33.如何在中断服务程中激活一个任务?通过向任务发消息的方法去激活这个任务。34. 什么叫作操作系统的时钟?任何操作系统都要提供一个周期性的信号源,以供系统处理诸如延时,超时等与时间有关的事件,这个周期性的信号源叫做时钟。35. 全局变量osintnesting的作用是什么?全局变量osintnesting记录中断嵌套的层数。36. 正在运行任务的任务控制块指针存放在哪个指针变量中?ostcbcur。37.统计任务是必须使用的吗?简述它的功能。每秒计算一次cpu在单位时间内被使用的时间,并把计算结果以百分比的形

22、式存放在变量oscpusage中,以便应用程序通过访问它来了解cpu的利用率。用户应用程序可根据实际需要来选择是否使用统计任务。38. 13个系统文件os_cfg.h定义了一些用于系统裁剪的常量。此外还有os_cpu.h,os_cpu_c.c,os_cpu_a.s(汇编文件),pc.c,pc.h在进行系统移植时会用到。39. 常用函数及其功能函数或变量或程序语句功能所在文件os_enter_critical()进入临界段(关中断)os_task.cos_exit_critical()退出临界段(开中断)os_task.cpdata=pdata防止某些编译器报错ostaskidle()空闲任务o

23、staskstat()统计任务osstatinit()对统计任务进行初始化os_core.cos_stk定义任务堆栈的数据类型os_cpu.hos_cpu_srcpu_sr是cpu的status register 就是cpu的状态寄存器os_cpu.hos_stk_growth使用户可以通过定义该常数的值来选择相应的代码,以适应不同的堆栈增长方式的需要os_cpu.hos_task_sw()任务切换ostaskcreate()创建一个任务os_task.costaskcreateext()创建任务os_task.cosinit()初始化ucos_iios_core.cpc_dossavereturn()保存dos环

温馨提示

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

评论

0/150

提交评论