欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第五章嵌入式系统软件体系结构课件.ppt

    • 资源ID:1858778       资源大小:515.50KB        全文页数:87页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第五章嵌入式系统软件体系结构课件.ppt

    第五章 嵌入式系统软件基础, 2005 博创科技,北 京 博 创 兴 业 科 技 有 限 公 司BEIJNG UNIVERSAL PIONEERING TECHNOLOGY Co . , LTD,博创科技 嵌入互动,主要内容,5.1嵌入式系统软件体系结构5.2设备驱动程序5.3嵌入式操作系统5.4 嵌入式中间件5.5 进程、线程和任务5.6 嵌入式系统的应用软件开发,问题1,进程与线程之间的区别?,问题2,输入一组整数,当输入1时表示输入结束,然后计算这组整数的平均值;,问题描述:,12425125-1,main( ) int iValue, iTotalValue, iNum; printf(“本程序用于计算一组整数的平均值 n”); printf(“输入-1表示数据的结束。n”); iTotalValue = 0; iNum = 0; while (1) scanf(“%d”, ,5.1 嵌入式软件体系结构,无操作系统的情形在嵌入式系统的发展初期,由于硬件的配置比较低,对于是否有系统软件的支持,要求还不是很强烈。在那个阶段,嵌入式软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统。有操作系统的情形,5.1.1无操作系统的情形,循环轮询系统:(Polling Loop)最简单的软件结构,程序依次检查系统的每个输入条件,一旦条件成立就进行相应的处理。Initialize();while(1) if(condition_1) action_1(); if(condition_2) action_2(); if(condition_n) acition_n();,事件驱动系统:(Event-Driven system)事件驱动系统是能对外部事件直接响应的系统。它包括前后台、实时多任务、多处理器等,是嵌入式实时系统的主要形式。应用程序是一个无限循环,循环中调用相应的函数完成相应操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可看成前台行为(foreground)。后台也可以叫做任务级,前台也叫中断级。,前后台系统(后台循环、前台中断),ISR,ISR,后台 前台,ISR,时间,例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电话机、玩具等。从省电的角度出发,平时微处理器处在停机状态,所有的事都靠中断服务来完成。,5.1.2有操作系统的情形,硬件,板级初始化,设备驱动层,以太网驱动,串口驱动,LCD驱动,键盘驱动,操作系统层,中间件层,应用软件层,TCP/IP网络系统,文件系统,内核,嵌入式GUI,嵌入式CORBA,嵌入式JAVA,嵌入式DCOM,面向领域的中间件,WWW浏览器,MP3播放器,电子邮件,第2节 设备驱动程序,为什么要有设备驱动程序?嵌入式硬件设备本身无法工作,需要软件来驱动,如初始化、控制、数据读写等。什么是设备驱动程序?直接与硬件打交道、对硬件进行控制和管理的软件。在一个嵌入式系统中,设备驱动程序是必不可少的。,5.2 设备驱动程序,5.2.1设备驱动程序的主要功能,硬件启动(Startup):在开机上电或重启的时候,对硬件进行初始化;硬件关闭(Shutdown):把硬件配置成关机状态;硬件停用(Disable):暂停使用硬件;硬件启用(Enable):重新启用硬件;硬件读操作(Read):从硬件中读取数据;硬件写操作(Write):往硬件中写数据;,5.2.2设备驱动程序的结构,硬件,上层接口-硬件接口,设备驱动程序,分层结构,硬件,上层接口硬件接口,设备驱动程序,混合结构,5.3 嵌入式操作系统,嵌入式操作系统包括嵌入式内核、嵌入式TCP/IP网络系统、嵌入式文件系统、嵌入式GUI系统和电源管理等部分;嵌入式内核是基础和核心,其他部分要根据嵌入式系统的需要来确定。,5.4 嵌入式中间件,中间件(Middleware):在OS内核、设备驱动程序和应用软件之外的所有系统软件;中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在其上的各个应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台;优点:实现软件的可重用,降低应用软件的复杂性,降低开发成本。,第5节 进程、线程和任务,5.5.1 多道程序技术,为了提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术(multi-programming),使多个程序同时在系统中存在并运行。,CPU,I/O,单道程序:,多道程序:,CPU,I/O,作业甲(红黄),作业乙(蓝绿),5.5.2 关于进程,在多道程序系统中,各个程序之间是并发执行的,共享系统资源。CPU需要在各个运行的程序之间来回地切换,这样的话,要想描述这些多道的并发活动过程就变得很困难。为此,操作系统设计者提出了进程的概念。,(1)什么是进程?,A process a program in execution,一个进程应该包括: 程序的代码; 程序的数据; PC中的值,用来指示下一条将运行的指令; 一组通用的寄存器的当前值,堆、栈; 一组系统资源(如打开的文件) 总之,进程包含了正在运行的一个程序的所有状态信息。,main( ).A( ).PROCESS,A program is C statements or commands静态的;A process is program + running context动态的.,main( ).A( ).PROGRAM,heap,StackA Main,Registers,PC,Process Program,(2)进程的特性,动态性:程序的运行状态在变,PC、寄存器、 堆和栈等;独立性:是一个独立的实体,是计算机系统资 源的使用单位。每个进程都有“自己” 的PC和内部状态,运行时独立于其他 的进程(逻辑PC和物理PC);并发性:从宏观上看各进程是同时独立运行的,四个进程在并发地运行,(本图摘自Andrew S. Tanenbaum: “Modern Operating Systems”),5.5.3 什么是线程?,自从60年代提出进程概念以来,在操作系统中一直都是以进程作为独立运行的基本单位,直到80年代中期,人们又提出了更小的能独立运行的基本单位 线程。,(1)为什么需要线程?,【案例】编写一个MP3播放软件。核心功能模块有三个:(1)从MP3音频文件当中读取数据;(2)对数据进行解压缩;(3)把解压缩后的音频数据播放出来。,单进程的实现方法,main( ) while(TRUE) Read( ); Decompress( ); Play( ); Read( ) Decompress( ) Play( ) ,问题: 播放出来的声音能 否连贯? 各个函数之间不是 并发执行,影响资 源的使用效率;,多进程的实现方法,程序1main( ) while(TRUE) Read( ); Read( ) ,问题:进程之间如何通信,共享数据?,程序3main( ) while(TRUE) Play( ); Play( ) ,程序2main( ) while(TRUE) Decompress( ); Decompress( ) ,怎么办?,需要提出一种新的实体,满足以下特性:(1)实体之间可以并发地执行;(2)实体之间共享相同的地址空间;,这种实体就是:线程(Thread),(2)线程定义,Thread: A sequential execution stream within a process; A thread of execution; 进程当中的一条执行流程。,从两个方面来理解进程: 从资源组合的角度:进程把一组相关的 资源组合起来,构成了一个资源平台 (环境),包括地址空间(代码段、数据 段)、打开的文件等各种资源; 从运行的角度:代码在这个资源平台上的 一条执行流程(线程)。,进程 线程 资源平台,优点: 一个进程中可以同时存在多个线程; 各个线程之间可以并发地执行; 各个线程之间可以共享地址空间。,(3)线程所需的资源,(本图摘自Silberschatz, Galvin and Gagne: “Operating System Concepts”),5.5.4 什么是任务?,在许多嵌入式操作系统当中,一般把能够独立运行的实体称为“任务”(Task),那么这里所说的任务到底是进程还是线程呢?,(1)vxWorks的例子,在一个实际的工程项目中,软件平台采用的是实时嵌入式操作系统vxWorks。该项目有两个.c源文件,如下图所示。这两个.c文件实现的功能是:在文件 1.c中,任务A循环地从SOCKET中接收数据;任务 B 每隔100ms向SOCKET发送响应消息,而定时功能是由文件 2.c 中的任务 C 来实现的。任务C和任务B之间通过同步信号量进行任务间的同步。问题:分析该操作系统当中的“任务”的概念,它相当于是我们通常所说的进程还是线程?为什么?,源文件1.c,int g_nSockId; / socket标识,全局变量semId g_synSemId; / 信号量标识,全局变量void testInit(void) / 初始化函数 创建SOCKTE,建立连接;/ g_nSockId被赋值 /*taskSpawn函数的功能:创建一个任务,它的参数为: “任务名”, “优先级”, “栈大小”, “函数名”, “函数的输入 参数”);*/ /*创建任务A*/ taskSpawn(“tTestTskA”, 50, 2000, testTskA, 0, .); /*创建任务B*/ taskSpawn(“tTestTskB”, 50, 2000, testTskB, 0, .);,void testTskA(void) char *pChRxBuf; pChRxBuf = malloc(100); while(1) recv(g_nSockId, pChRxBuf, .); void testTskB(void) char pChTxBuf100 = “Send message back every 100ms”; while(1) semTake(g_synSemId); send(g_nSockId, pChTxBuf, .); ,源文件2.c,extern semId g_synSemId;void test(void) 创建同步信号量,并初始为空;/ 即使用变量g_synSemId /*创建任务C*/ taskSpawn(“tTestTskC”, 50, 2000, testTskC, 0.); void testTskC(void) while(1) taskDelay(100); /*延时100ms, 同时放出CPU资源*/ semGive(g_synSemId); ,5.5.5 任务的实现,在多道程序(多任务)的嵌入式操作系统中,任务之间的结构为层状结构,存在着父子关系;当嵌入式内核刚刚启动时,只有一个任务存在,然后由该任务派生出所有其他的任务。,(1)任务的层次结构,OS初始任务,任务,任务,任务,任务,任务,任务,任务,(2)任务的创建,在嵌入式操作系统当中,任务的创建主要有两种模型:fork/exec和spawn;fork/exec:符合IEEE/ISO POSIX 1003.1标准,先用fork系统调用创建与父任务完全相同的一份内存空间,然后再用exec系统调用来移除父任务的内容,并调入子任务的程序代码。优点:允许继承;spawn:直接为子任务创建一个全新的地址空间,并装入其程序代码。,5.5.6 任务的描述,问题:如果让你来设计OS当中的任务机制,那么你将如何来描述一个任务?,描述任务的数据结构:任务控制块(Task Control Block,TCB)。系统为每个任务都维护了一个TCB,用来保存与该任务有关的所有信息。,(1)任务控制块的内容,任务ID、任务的状态、任务的优先级;CPU上下文信息:通用寄存器的值、PC寄存器的值、程序状态字、栈指针的值;如果在该OS中,任务描述的是进程,则还应包括其他的一些内容,如段表地址、页表地址等存储管理方面的信息;根目录、文件描述字等文件管理方面的信息。,任务的创建:为该任务生成一个TCB;任务的终止:回收它的TCB;任务的组织管理:通过对TCB的组织管理来实现。,系统用TCB来描述任务的基本情况以及运行变化的过程,TCB是任务存在的唯一标志。,(2)任务的状态,任务的三种基本状态:任务在生命结束前处于且仅处于三种基本状态之一不同系统设置的任务状态数目不同。,运行状态(Running):任务占有CPU,并在CPU上运行。处于此状态的任务数目小于等于CPU的数目;就绪状态(Ready):任务已经具备运行条件,但由于CPU忙暂时不能运行,只要分得CPU即可执行;阻塞/等待状态(Blocked/Waiting):任务因等待某种事件的发生而暂时不能运行(如I/O操作或任务同步),此时即使CPU空闲,该任务也不能运行。,(2)任务的状态及其转换,Running,Blocked,Ready,1 3 2,4,任务由于I/O操作被阻塞;调度器选择了另一个任务;调度器选中该任务任务的I/O操作完成了。,(3)两个任务的状态转换过程,(3)状态队列,由操作系统来维护一组队列,用来表示系统当中所有任务的当前状态;不同的状态分别用不同的队列来表示(运行队列、就绪队列、各种类型的阻塞队列);每个任务的TCB都根据它的状态加入到相应的队列当中,当一个任务的状态发生变化时,它的TCB从一个状态队列中脱离出来,加入到另外一个队列。,第6节 嵌入式C程序设计,5.6 嵌入式C程序设计,“which of the following programming languageshave you used for embedded systems in the last12 months”C81%Assembly70%C+39%Visual Basic16%Java7%Source: “ESP: A 10-year retrospective”, EmbeddedSystems Programming, November, 1998,嵌入式软件的目标,函数必须正确;源代码简洁、可读性好、可维护;实时性要求较高的代码能够运行得足够快;目标代码小且高效。总之,要优化对以下三种资源的使用:执行时间;存储空间;开发/维护时间。,5.6.1 数据类型与运算符,宏定义:用一个指定的标识符来代表一个字符串。#define 标识符 字符串如:#define PI 3.1415926,其作用是指定用标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中出现的所有PI都用“3.1415926”代替。,(1)宏定义,宏定义的基本思想是:一次定义,多次使用。其优点是:可以用简短的标识符来代替长的数据,减少需要输入的字符数;用易于理解的标识符来代替那些不太好记的具体的数据,便于程序的理解和维护;有利于程序的修改和升级,当这个数据需要修改时,只需改动宏定义之处即可。,不用此法,一次定义,多次使用,(2)const常量,常量数据:整数(12)、字符(a)、 字符串(“hello”)和实数(3.14)等; 以变量的形式来定义的一个量,并且通 过使用关键字const,来表明这个变量的 值不能被改变。如:const int x = 1。,指针与常量:指针本身是常量;指针指向的变量是常量.,void test(char *p) char s = “hello”; const char *pc = s; / 正确,指向常量字符 pc3 = g; / 错误, 常量不能被修改 pc = p; / 正确, 指针本身可以变 char *const cp = s; /正确,指针本身是常量 cp3 = a; /正确,指针指向的是变量 cp = p; /错误,指针本身是常量,const char *const cpc = s; / 正确,都是常量 cpc3 = a; / 错误 cp = p; / 错误,倒过来念:const char *pc; / pointer to const charchar *const cp; / const pointer to charconst char *const cpc; / const pointer to const / char,(3)算术运算,整数的算术运算最快带有硬件支持的浮点运算较慢用软件来实现的浮点运算非常慢,快sqrt, sin, log, etc慢,for (i = 0; i 10000; +i)/* 各种算术运算操作 */实验平台:桌面Intel Pentium4,带硬件浮点支持OperatorTimeOperatorTime+ (int)1+ (double)5* (int)5* (double)5/ (int)12/ (double)10(int)2sqrt28sin48pow275,小实验1,实验平台:400MHz Intel PXA250 Xscale(ARM)处理器OperatorTimeOperatorTime+ (int)1+ (double)140* (int)1* (double)110/ (int)7/ (double)220(int)1sqrt500sin3300pow820,小实验2,结论:尽量使用整数(char、short、int和long)的加法和减法;如果没有硬件支持,尽量避免使用乘法;尽量避免使用除法;如果没有硬件支持,尽量避免使用浮点数;数学库函数使用得越少越好。,重复10700次,右边需要1毫秒,左边需要2.13毫秒!,struct int a; char b; int c; foo10;int i;for(i=0; i10; +i) fooi.a = 77; fooi.b = 88; fooi.c = 99;,应用案例,struct int a; char b; int c; *fp, *fend, foo10;fend = foo + 10;for(fp=foo; fp!=fend;+fp) fp-a = 77; fp-b = 88; fp-c = 99;,(4)位运算,C语言有很多位操作运算符:&与操作;|或操作;异或操作;取反操作;右移操作;左移操作。,a |= 0 x4b &= 0 x4c &= (1 = 2,/ 把第2位设置为1,/ 把第2位设置为0,/ 把第3位设置为0,/ 把第5位反转,/ 把 e 除以4,int x, num = 99, count = 0;x = num;while(x) count +; x = x ,result: 4,6.6.2 分支语句,if (a = 1) ant();else if (a = 2) bar();else if (a = 3) cee();else if (a = 4) due();else if (a = 5) eat();else if (a = 6) foo();,switch (a) case 1: ant(); break; case 2: bar(); break; case 3: cee(); break; case 4: due(); break; case 5: eat(); break; case 6: foo(); break;,if-then-else语句的汇编代码,$L1: cmp dword ptrebp-4, 1 #把a与常量1进行比较 jne $L2 #如果不相同,跳到$L2继续比较下一个值 call _ant #如果相同,调用ant()函数 jmp $END #跳转到这段代码的末尾$L2: cmp dword ptrebp-4, 2 #把a与常量2进行比较 jne $L3 #如果不相同,跳到$L3继续比较下一个值 call _bar #如果相同,调用bar()函数 jmp $END #跳转到这段代码的末尾$L3: .$END:,switch语句的汇编代码-1,JmpTable dword $L1,$L2,$L3,$L4,$L5,$L6 mov eax,dword ptr ebp-4 #取出变量a的值 mov dword ptr ebp-8,eax #保存在临时变量中 mov ecx,dword ptr ebp-8 #取出,放在ecx中 sub ecx,1 #减1 mov dword ptr ebp-8,ecx #保存回去 cmp dword ptr ebp-8,5 #与5进行比较 ja $END #若大于5,结束 mov edx,dword ptr ebp-8 #取出该值,放edx jmp dword ptr edx*4+JmpTable#跳转到相应的 #case标记,switch语句的汇编代码-2,$L1:# case 1 call _ant jmp $END$L2:# case 2 call _bar jmp $END.$L5:# case 5 call _eat jmp $END$L6:# case 6 call _foo$END:,结论:假设a的取值个数为n,对于if-then-else语句,时间复杂度为O(n),而对于switch语句,时间复杂度为O(1);如果n的值较小,两种语句均可;如果n的值较大,则switch语句更佳。,5.6.3 函数,函数原型main ( ) 函数调用 函数定义,函数的使用模式,声明该函数,定义一个函数,使用该函数,内存分布状况,全局变量区域,静态分配,栈,自动分配,堆,动态分配,(1)主函数的执行过程,int z;void main( ) int x, y; x = 1; y = 2; z = x + y;,全局变量区域,栈帧(main),x = y =,程序,1,2,3,(2)控制流与数据流,控制流:程序当前执行位置的流向;数据流:函数调用发生及结束时,数据在 函数之间流转的过程。,当一个函数被调用时:在内存的栈空间当中为其分配一个栈帧,用来存放该函数的形参和局部变量;把实参变量的值复制到相应的形参变量;控制转移到该函数的起始位置;该函数开始执行;控制流和返回值返回到函数调用点。,(3)函数调用过程,(4)控制流的变化,void main( ) double x, y, z; y = 6.0; x = Area( y / 3.0 ); . z = 3.4 * Area(7.88); .,/* 给定半径,计算一个圆的面积 */double Area(double r) return(3.14 * r * r);,(5)一个简单的例子,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,main,number,3,Times2,value,Times2也得到一个栈帧,它的参数看成局部变量,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,main,number,3,Times2,value,3,“值传递”, 把实参的值传给形参。,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,main,3,把Times2的栈帧叠在主函数的栈帧之上,说明在执行Times2函数时,主函数中的变量是不可见的。,Times2,value,3,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,6,Times2函数的返回值被放在函数的调用位置上,然后,分配给Times2函数的堆栈区域被释放。,(6)变量的存储与作用域,/* 全局变量,固定地址,其他源文件可见 */int global_static;/* 静态全局变量,固定地址,但只在本文件中可见 */static int file_static;/* 函数参数:位于栈帧当中,动态创建,动态释放 */int foo(int auto_param) /*静态局部变量,固定地址,只在本函数中可见 */ static int func_static; /* 普通局部变量,位于栈帧当中,只在本函数可见 */ int auto_i, auto_a10; /* 动态申请的内存空间,位于堆当中 */ double *auto_d = malloc(sizeof(double)*5); return auto_i;,(7)各个变量的内存地址,auto_d0 x004300d0main函数0 x00401070global_static0 x004225a4file_static0 x0042259cfunc_static0 x004225a0auto_param0 x0012ff30auto_i0 x0012ff24auto_a0 x0012fefc,5.6.4 可重入函数-1,可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数只使用局部变量,即变量保存在CPU寄存器或栈中。一个不可重入型函数的例子int temp;void swap(int *x, int *y) temp = *x; *x = *y; *y = temp;,5.6.4 可重入函数-2,一个可重入型函数的例子void swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp;,

    注意事项

    本文(第五章嵌入式系统软件体系结构课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开