版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统设计与实例开发—基于ARM微处理器与实时操作系统第二讲基本概念及设计方法主讲教师:罗子波副教授嵌入式系统设计与实例开发本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统的选择原则和设计工具本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统嵌入式微处理器简介嵌入式微处理器体系结构嵌入式微处理器的分类2.1嵌入式系统硬件知识嵌入式微处理器简介2.1嵌入式系统硬件知识嵌入式微处理器简介嵌入式硬件系统组成:嵌入式微处理器:控制单元ALU 寄存器存储器输入/输出单元嵌入式微处理器简介嵌入式硬件系统组成:嵌入式处理器的基本结构(1)微处理器是整个系统的核心,通常由3大部分组成:控制单元、算术逻辑单元和寄存器。算术逻辑单元寄存器控制单元微处理器存储器输入输出嵌入式处理器的基本结构(1)微处理器是整个系统的核心,通常由嵌入式处理器的基本结构(2)控制单元:主要负责取指、译码和取操作数等基本动作,并发送主要的控制指令。控制单元中包括两个重要的寄存器:程序计数器(PC)和指令寄存器(IR)。程序计数器用于记录下一条程序指令在内存中的位置,以便控制单元能到正确的内存位置取指;指令寄存器负责存放被控制单元所取的指令,通过译码,产生必要的控制信号送到算术逻辑单元进行相关的数据处理工作。算术逻辑单元:算术逻辑单元分为两部分,一部分是算术运算单元,主要处理数值型的数据,进行数学运算,如加、减、乘、除或数值的比较;另一部分是逻辑运算单元,主要处理逻辑运算工作,如AND、OR、XOR或NOT等运算。寄存器:用于存储暂时性的数据。主要是从存储器中所得到的数据(这些数据被送到算术逻辑单元中进行处理)和算术逻辑单元中处理好的数据(再进行算术逻辑运行或存入到存储器中。
嵌入式处理器的基本结构(2)控制单元:主要负责取指、译码和取冯·诺依曼体系结构和哈佛体系结构CISC与RISC信息存储的字节顺序IP核流水线存储器系统2.1.2嵌入式微处理器体系结构冯·诺依曼体系结构和哈佛体系结构2.1.2嵌入式微处理器体冯·诺依曼体系结构模型指令寄存器控制器数据通道输入输出中央处理器存储器程序指令0指令1指令2指令3指令4数据数据0数据1数据2冯·诺依曼体系结构模型指令寄存器控制器数据通道输入输出中央处哈佛体系结构指令寄存器控制器数据通道输入输出中央处理器程序存储器指令0指令1指令2数据存储器数据0数据1数据2地址指令地址数据哈佛体系结构指令寄存器控制器数据通道输入输出中央处理器程序存CISC和RISCCISC:复杂指令集(ComplexInstructionSetComputer)具有大量的指令和寻址方式8/2原则:80%的程序只使用20%的指令大多数程序只使用少量的指令就能够运行。RISC:精简指令集(ReducedInstructionSetComputer)在通道中只包含最有用的指令确保数据通道快速执行每一条指令使CPU硬件结构设计变得更为简单
CISC和RISCCISC:复杂指令集(ComplexInCISC与RISC的数据通道IFIDREGALUMEM开始退出IFIDALUMEMREG微操作通道开始退出单通数据通道CISC与RISC的数据通道IFIDREGALUMEM开始退CISC的背景和特点背景:存储资源紧缺,强调编译优化增强指令功能,设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的(微程序)指令系统来实现为节省存储空间,强调高代码密度,指令格式不固定,指令可长可短,操作数可多可少寻址方式复杂多样,操作数可来自寄存器,也可来自存储器采用微程序控制,执行每条指令均需完成一个微指令序列(微程序)CPI>5,指令越复杂,CPI越大。CISC的背景和特点背景:存储资源紧缺,强调编译优CISC的主要缺点指令使用频度不均衡。高频度使用的指令占据了绝大部分的执行时间,扩充的复杂指令往往是低频度指令。大量复杂指令的控制逻辑不规整,不适于VLSI工艺VLSI的出现,使单芯片处理机希望采用规整的硬联逻辑实现,而不希望用微程序,因为微程序的使用反而制约了速度提高。(微码的存控速度比CPU慢5-10倍)。软硬功能分配复杂指令增加硬件的复杂度,使指令执行周期大大加长,直接访存次数增多,降低了CPU性能。不利于先进指令级并行技术的采用流水线技术CISC的主要缺点指令使用频度不均衡。RISC基本设计思想减小CPI:CPUtime=Instr_Count*CPI*Clock_cycle精简指令集:保留最基本的,去掉复杂、使用频度不高的指令采用Load/Store结构,有助于减少指令格式,统一存储器访问方式采用硬接线控制代替微程序控制RISC基本设计思想减小CPI:CPUtime=Instr典型的高性能RISC处理器SUN公司的SPARC(1987)MIPS公司的SGI:MIPS(1986)HP公司的PA-RISC,IBM,Motorola公司的PowerPCDEC、Compac公司的AlphaAXPIBM的RS6000(1990)第一台SuperscalarRISC机
典型的高性能RISC处理器SUN公司的SPARC(1987)CISC与RISC的对比类别CISCRISC指令系统指令数量很多较少,通常少于100执行时间有些指令执行时间很长,如整块的存储器内容拷贝;或将多个寄存器的内容拷贝到存贮器没有较长执行时间的指令编码长度编码长度可变,1-15字节编码长度固定,通常为4个字节寻址方式寻址方式多样简单寻址操作可以对存储器和寄存器进行算术和逻辑操作只能对寄存器对行算术和逻辑操作,Load/Store体系结构编译难以用优化编译器生成高效的目标代码程序采用优化编译技术,生成高效的目标代码程序CISC与RISC的对比类别CISCRISC指令系统指令数量for(i=0;i<10000;++i)
/*各种算术运算操作*/实验平台:桌面IntelPentium4,带硬件浮点支持Operator Time Operator Time
+(int) 1 +(double) 5
*(int) 5 *(double) 5
/(int) 12 /(double) 10
<<(int) 2 sin 48
小实验1for(i=0;i<10000;++i)
/信息存储的字节顺序大端模式字数据的高位字节存储在低地址中字数据的低字节则存放在高地址中小端模式低地址中存放字数据的低字节高地址中存放字数据的高字节3124
2316
158
70字地址11109887654432100低地址高地址3124
2316
158
70字地址89101184567401230低地址高地址信息存储的字节顺序大端模式3124231615870字示例A.小端存储法(0x01234567)地址0x80000x80010x80020x8003数据(16进制表示)0x670x450x230x01数据(二进制表示)01100111010001010010001100000001B.大端存储法地址0x80000x80010x80020x8003数据(16进制表示)0x010x230x450x67数据(二进制表示)00000001001000110100010101100111示例A.小端存储法(0x01234567)地址0x8000TheARM可以用little/bigendian格式存取数据.r0=0x11223344STRr0,[r1]LDRBr2,[r1]r1=0x100Memory32100123ByteLane312423161587011223344312423161587011223344312423161587011223344312423161587000000044312423161587000000011LittleendianBigendianR2=0x44R2=0x11Formoreinformation,see:“ApplicationNote61:BigandLittleEndianByteAddressing”字节顺序TheARM可以用little/bigendian2.1.3嵌入式微处理器的分类2.1.3嵌入式微处理器的分类本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统的选择原则和设计工具本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统2.2.1嵌入式软件概述规模较小开发难度大实时性和可靠性要求高要求固化存储2.2.1嵌入式软件概述规模较小2.2.1嵌入式软件体系结构无操作系统的情形在嵌入式系统的发展初期,由于硬件的配置比较低,对于是否有系统软件的支持,要求还不是很强烈。在那个阶段,嵌入式软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统。有操作系统的情形2.2.1嵌入式软件体系结构无操作系统的情形无操作系统的情形循环轮询系统:(PollingLoop)最简单的软件结构,程序依次检查系统的每个输入条件,一旦条件成立就进行相应的处理。Initialize();while(1){if(condition_1)action_1();if(condition_2)action_2();……if(condition_n)acition_n();}无操作系统的情形循环轮询系统:(PollingLoop)事件驱动系统:(Event-Drivensystem)事件驱动系统是能对外部事件直接响应的系统。它包括前后台、实时多任务、多处理器等,是嵌入式实时系统的主要形式。应用程序是一个无限循环,循环中调用相应的函数完成相应操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可看成前台行为(foreground)。后台也可以叫做任务级,前台也叫中断级。事件驱动系统:(Event-Drivensystem)例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电话机、玩具等。从省电的角度出发,平时微处理器处在停机状态,所有的事都靠中断服务来完成。例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电前后台系统(后台循环、前台中断)ISRISR后台前台ISR时间前后台系统(后台循环、前台中断)ISRISR后台提高了系统可靠性提高了系统的开发效率,降低了开发成本,缩短了开发周期有利于系统的扩展和移植有操作系统的情形提高了系统可靠性有操作系统的情形2.2.3嵌入式操作系统的分类按系统的类型分:商用系统专用系统开源系统按响应时间分:实时硬实时系统软实时系统非实时2.2.3嵌入式操作系统的分类按系统的类型分:按软件结构分类…单体结构(MonolithicStructure)分层结构(LayeredStructure)Outofdate…微内核结构(MicrokernelModel)按软件结构分类…单体结构(MonolithicStruc单体结构最常用的组织结构;整个系统只有一个可执行文件,包含所有的操作系统组件;系统的结构就是无结构,由一组函数组成,相互之间可以随意地调用。应用软件文件I/O存储管理进程管理I/O驱动存储驱动中断驱动硬件单体内核单体结构最常用的组织结构;应用软件文件I/O存储管理进分层结构在分层结构(layered)中,一个操作系统被划分为若干个层次(0..N),各个层次之间的调用关系是单向的,即某一层次上的代码只能调用比它低层的代码。这种结构要求在每个层次上都要提供一组API接口函数,这就会带来额外的开销分层结构在分层结构(layered)中,一个操作系统被划分为微内核设备驱动程序微内核结构操作系统内核只包含最少的功能,如存储管理和进程管理;其他的操作系统组件以中间件的形式存在于内核之外;设备驱动程序完全从内核中剥离,独立成为一层。中间件、应用软件存储管理进程管理I/O驱动存储驱动中断驱动硬件微内核设备驱动程序微内核结构操作系统内核只包含最少的功能有操作系统的情形硬件板级
初始化设备
驱动层以太网
驱动串口
驱动LCD
驱动键盘
驱动操作
系统层中间件
层应用
软件层TCP/IP
网络系统文件
系统内核嵌入式
GUI嵌入式
CORBA嵌入式
JAVA嵌入式
DCOM面向领域
的中间件WWW
浏览器MP3
播放器电子
邮件…有操作系统的情形硬件板级
初始化设备
驱动层以太网
驱动串口为什么要有设备驱动程序?嵌入式硬件设备本身无法工作,需要软件来驱动,如初始化、控制、数据读写等。什么是设备驱动程序?直接与硬件打交道、对硬件进行控制和管理的软件。在一个嵌入式系统中,设备驱动程序是必不可少的。设备驱动程序为什么要有设备驱动程序?设备驱动程序设备驱动程序的主要功能硬件启动(Startup):在开机上电或重启的时候,对硬件进行初始化;硬件关闭(Shutdown):把硬件配置成关机状态;硬件停用(Disable):暂停使用硬件;硬件启用(Enable):重新启用硬件;硬件读操作(Read):从硬件中读取数据;硬件写操作(Write):往硬件中写数据;……设备驱动程序的主要功能硬件启动(Startup):在开机上电嵌入式中间件中间件(Middleware):在OS内核、设备驱动程序和应用软件之外的所有系统软件;中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在其上的各个应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台;优点:实现软件的可重用,降低应用软件的复杂性,降低开发成本。嵌入式中间件中间件(Middleware):在OS内核、设备2.2.4嵌入式操作系统的几个概念占先式内核调度策略分析任务优先级分配时间的可确定性任务切换时间中断响应时间优先级反转任务执行时间的抖动任务划分2.2.4嵌入式操作系统的几个概念占先式内核2.2.5常见的嵌入式操作系统实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵μC/OS。免费型的实时操作系统在价格方面具有优势,目前主要有Linux和,稳定性与服务性存在挑战。2.2.5常见的嵌入式操作系统实时嵌入式操作系统的种类VxWorksVxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域牢牢占据着一席之地。VxWorks所具有的显著特点是:
-可靠性、实时性和可裁减性。 -它支持多种处理器,如x86、i960、SunSparc、MotorolaMC68xxx、MIPS、POWERPC等等。大多数的VxWorksAPI是专有的,火星机器人。VxWorksVxWorks操作系统是美国WindRiverWindowsEmbeddedWindowsCE3.0:一种针对小容量、移动式、智能化、32位、连接设备的模块化实时嵌入式操作系统。针对掌上设备、无线设备的动态应用程序和服务提供了一种功能丰富的操作系统平台,WindowsCE嵌入但不够实时,属于软实时操作系统,由于其Windows背景,界面比较统一认可。操作系统的基本内核需要至少200K的ROM。WindowsEmbeddedWindowsCE3.0PalmOSPalmOS是著名的网络设备制造商3COM旗下的PalmComputing掌上电脑公司的产品。3COM、CISCO竞争PalmOS在PDA市场上占有很大的市场份额,PalmOS的市场份额占到将近90%,最近下降70%,目前主要与WINCE进行激烈竞争。PalmOSPalmOS是著名的网络设备制造商3COM旗QNX加拿大QNX公司的产品。QNX是在X86体系上面开发出来的,这和别的RTOS不一样,别的好多RTOS都是从68K的CPU上面开发成熟,然后再移植到X86体系上面来的。QNX是一个实时的、可扩充的操作系统,它部分遵循POSIX相关标准,由于QNX具有强大的图形界面功能,因此很适合作为机顶盒、手持设备(手掌电脑、手机)、GPS设备的实时操作系统使用。QNX加拿大QNX公司的产品。嵌入式Linux嵌入式系统越来越追求数字化、网络化和智能化。因此原来在某些设备或领域中占主导地位的软件系统越来越难以为继,整个系统必须是开放的、提供标准的API,并且能够方便地与众多第三方的软硬件沟通。Linux是开放源码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发的强大技术后盾。Linux的内核小、功能强大、运行稳定、系统健壮、效率高,易于定制剪裁,在价格上极具竞争力。Linux不仅支持x86CPU,还可以支持其他数十种CPU芯片。嵌入式Linux嵌入式系统越来越追求数字化、网络化和智能化。
嵌入式Linux(EmbeddedLinux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究是目前操作系统领域的一个热点。主要有RTLinux和CLinuxLinux在嵌入式领域异军突起不过是近两年的事情,过去的一年中有13%的用户已经开始使用嵌入式Linux系统进行开发工作;有52%的用户决定在未来24个月内开始使用Linux作为嵌入式操作系统的开发原型。嵌入式Linux及应用嵌入式Linux(EmbeddedLinux)是指对LiC/OS及C/OS-II
1、C/OS——MicroControllerOS,微控制器操作系统2、C/OS简介美国人JeanLabrosse1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等1998年C/OS-II,目前的版本C/OS-IIV2.61,2.722000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站www.ucos-II.com()C/OS及C/OS-II
1、C/OS——Micro嵌入式C程序设计“whichofthefollowingprogramminglanguages
haveyouusedforembeddedsystemsinthelast
12months” C 81%
Assembly 70%
C++ 39%
VisualBasic 16%
Java 7%Source:“ESP:A10-yearretrospective”,Embedded
SystemsProgramming,November,1998嵌入式C程序设计“whichofthefollowin嵌入式软件的目标函数必须正确;源代码简洁、可读性好、可维护;实时性要求较高的代码能够运行得足够快;目标代码小且高效。总之,要优化对以下三种资源的使用:执行时间;存储空间;开发/维护时间。嵌入式软件的目标函数必须正确;数据类型与运算符宏定义:用一个指定的标识符来代表一个字符串。#define标识符字符串如:#definePI3.1415926,其作用是指定用标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中出现的所有PI都用“3.1415926”代替。(1)宏定义数据类型与运算符宏定义:用一个指定的标识符来代表一个字符串。宏定义的基本思想是:一次定义,多次使用。其优点是:可以用简短的标识符来代替长的数据,减少需要输入的字符数;用易于理解的标识符来代替那些不太好记的具体的数据,便于程序的理解和维护;有利于程序的修改和升级,当这个数据需要修改时,只需改动宏定义之处即可。宏定义的基本思想是:一次定义,多次使用。其if(myMoney>80.0){myShoes++;myMoney=myMoney–80.0;}#defineCOST_OF_SHOES80.0if(myMoney>COST_OF_SHOES){myShoes++;
myMoney=myMoney–COST_OF_SHOES;}不用此法一次定义多次使用if(myMoney>80.0)#define(2)const常量常量数据:整数(12)、字符(‘a’)、
字符串(“hello”)和实数(3.14)等;以变量的形式来定义的一个量,并且通
过使用关键字const,来表明这个变量的
值不能被改变。如:constintx=1。(2)const常量常量数据:整数(12)、字符(‘a’)(3)算术运算整数的算术运算 最快
带有硬件支持的浮点运算 较慢
用软件来实现的浮点运算 非常慢
+,- 快
×
÷
sin,log,sqrt,etc 慢(3)算术运算整数的算术运算 最快
带有硬件支持的浮点结论:尽量使用整数(char、short、int和long)的加法和减法;如果没有硬件支持,尽量避免使用乘法;尽量避免使用除法;如果没有硬件支持,尽量避免使用浮点数;数学库函数使用得越少越好。结论:(4)位运算C语言有很多位操作运算符:& 与操作;| 或操作;^ 异或操作;~ 取反操作;>> 右移操作;<< 左移操作。(4)位运算C语言有很多位操作运算符:a|=0x4
b&=~0x4
c&=~(1<<3)
d^=(1<<5)
e>>=2
//把第2位设置为1//把第2位设置为0//把第3位设置为0//把第5位反转//把e除以4a|=0x4 //把第2位设置为1//把第2位设置intx,num=99,count=0;x=num;while(x){count++;x=x&(x−1);}printf("result:%d",count);result:4intx,num=99,count=0;re分支语句if(a==1)ant();elseif(a==2)bar();elseif(a==3)cee();elseif(a==4)due();elseif(a==5)eat();elseif(a==6)foo();switch(a){case1:ant();break;case2:bar();break;case3:cee();break;case4:due();break;case5:eat();break;case6:foo();break;}AnyDifferences?分支语句if(a==1)switch(a)AnyDif-then-else语句的汇编代码$L1:cmpdwordptr[ebp-4],1#把a与常量1进行比较jne $L2#如果不相同,跳到$L2继续比较下一个值call_ant#如果相同,调用ant()函数jmp $END#跳转到这段代码的末尾$L2:cmpdwordptr[ebp-4],2#把a与常量2进行比较jne $L3#如果不相同,跳到$L3继续比较下一个值call_bar#如果相同,调用bar()函数jmp $END#跳转到这段代码的末尾$L3:...$END:if-then-else语句的汇编代码$L1:switch语句的汇编代码-1JmpTabledword$L1,$L2,$L3,$L4,$L5,$L6
moveax,dwordptr[ebp-4]#取出变量a的值movdwordptr[ebp-8],eax#保存在临时变量中movecx,dwordptr[ebp-8]#取出,放在ecx中subecx,1#减1movdwordptr[ebp-8],ecx#保存回去cmpdwordptr[ebp-8],5#与5进行比较ja$END#若大于5,结束movedx,dwordptr[ebp-8]#取出该值,放edxjmpdwordptr[edx*4+JmpTable]#跳转到相应的#case标记switch语句的汇编代码-1JmpTabledworswitch语句的汇编代码-2$L1: #case1call_antjmp$END$L2: #case2call_barjmp$END......$L5: #case5call_eatjmp$END$L6: #case6call_foo$END:switch语句的汇编代码-2$L1: #case结论:假设a的取值个数为n,对于if-then-else语句,时间复杂度为O(n),而对于switch语句,时间复杂度为O(1);如果n的值较小,两种语句均可;如果n的值较大,则switch语句更佳。结论:函数函数原型main()
{
……
函数调用
……
}函数定义函数的使用模式声明该函数定义一个函数使用该函数函数函数原型函数的使用模式声明该函数定义一个函数使用该函数操作系统代码栈帧2栈帧1全局变量内存分布状况全局变量区域静态分配栈自动分配堆动态分配操作系统代码栈帧2栈帧1全局变量内存分布状况全局变量区域静态主函数的执行过程intz;voidmain(){intx,y;x=1;y=2;z=x+y;}…main(){…}…
z=0全局变量区域栈帧(main)x=y=程序123主函数的执行过程intz;…main()…z控制流与数据流控制流:程序当前执行位置的流向;数据流:函数调用发生及结束时,数据在 函数之间流转的过程。控制流与数据流控制流:程序当前执行位置的流向;当一个函数被调用时:在内存的栈空间当中为其分配一个栈帧,用来存放该函数的形参和局部变量;把实参变量的值复制到相应的形参变量;控制转移到该函数的起始位置;该函数开始执行;控制流和返回值返回到函数调用点。函数调用过程当一个函数被调用时:函数调用过程控制流的变化voidmain(){doublex,y,z;y=6.0;x=Area(y/3.0);...z=3.4*Area(7.88);...}/*给定半径,计算一个圆的面积*/doubleArea(doubler){return(3.14*r*r);}控制流的变化voidmain()/*给定半径,计算一个简单的例子intTimes2(intvalue);
main()
{
intnumber;
printf(“请输入一个整数:”);
scanf(“%d”,&number);
printf(“该数的两倍是:%d”,Times2(number));
}intTimes2(intvalue)
{
return(2*value);
}mainnumber3一个简单的例子intTimes2(intvalue)intTimes2(intvalue);
main()
{
intnumber;
printf(“请输入一个整数:”);
scanf(“%d”,&number);
printf(“该数的两倍是:%d”,Times2(number));
}intTimes2(intvalue)
{
return(2*value);
}mainnumber3Times2valueTimes2也得到一个栈帧,
它的参数看成局部变量intTimes2(intvalue);
mainintTimes2(intvalue);
main()
{
intnumber;
printf(“请输入一个整数:”);
scanf(“%d”,&number);
printf(“该数的两倍是:%d”,Times2(number));
}intTimes2(intvalue)
{
return(2*value);
}mainnumber3Times2value3“值传递”,把实参的值
传给形参。intTimes2(intvalue);
mainintTimes2(intvalue);
main()
{
intnumber;
printf(“请输入一个整数:”);
scanf(“%d”,&number);
printf(“该数的两倍是:%d”,Times2(number));
}intTimes2(intvalue)
{
return(2*value);
}main3把Times2的栈帧叠在主
函数的栈帧之上,说明
在执行Times2函数时,
主函数中的变量是不可
见的。Times2value3intTimes2(intvalue);
mainintTimes2(intvalue);
main()
{
intnumber;
printf(“请输入一个整数:”);
scanf(“%d”,&number);
printf(“该数的两倍是:%d”,Times2(number));
}intTimes2(intvalue)
{
return(2*value);
}mainnumber36Times2函数的返回值被
放在函数的调用位置上,
然后,分配给Times2函
数的堆栈区域被释放。intTimes2(intvalue);
main变量的存储与作用域/*全局变量,固定地址,其他源文件可见*/intglobal_static;/*静态全局变量,固定地址,但只在本文件中可见*/staticintfile_static;/*函数参数:位于栈帧当中,动态创建,动态释放*/intfoo(intauto_param){/*静态局部变量,固定地址,只在本函数中可见*/staticintfunc_static;/*普通局部变量,位于栈帧当中,只在本函数可见*/intauto_i,auto_a[10];/*动态申请的内存空间,位于堆当中*/double*auto_d=malloc(sizeof(double)*5);returnauto_i;}变量的存储与作用域/*全局变量,固定地址,其他源文件可见可重入函数-1可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数只使用局部变量,即变量保存在CPU寄存器或栈中。一个不可重入型函数的例子inttemp;voidswap(int*x,int*y){temp=*x;*x=*y;*y=temp;}可重入函数-1可以被一个以上的任务调用,而不必担心数据的破坏可重入函数-2一个可重入型函数的例子voidswap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}可重入函数-2一个可重入型函数的例子不可重入函数被中断破坏不可重入函数被中断破坏本节提要132嵌入式系统硬件基础嵌入式系统软件基础嵌入式系统的选型选择原则和设计工具本节提要132嵌入式系统硬件基础嵌入式系统软件基础嵌入式系统2.3.1嵌入式系统的选型原则硬件平台的选择
内核的选择:取决于应用的领域、用户的需求、成本、开发的难易程度等
外围设备的选择:2.3.1嵌入式系统的选型原则硬件平台的选择2.3.1嵌入式系统的选型原则2.操作系统的选型原则
操作系统的硬件支持开发工具的支持程度能否满足应用需求自建操作系统
2.3.1嵌入式系统的选型原则2.操作系统的选型原则2.3.2嵌入式系统的设计工具嵌入式系统的设计方法2.3.2嵌入式系统的设计工具嵌入式系统的设计方法嵌入式系统的设计方法系统需求分析系统集成系统测试产品硬件设计软件设计执行装置设计体系结构设计嵌入式系统的设计方法系统需求分析系统集成系统测试产品硬件设计2.3.3嵌入式系统开发模式宿主机目标机宿主机与目标机的连接2.3.3嵌入式系统开发模式宿主机嵌入式开发工具与开发环境嵌入式开发工具与开发环境嵌入式软件开发流程嵌入式软件开发流程桌面应用程序的编译和加载过程桌面应用程序的编译和加载过程嵌入式应用程序的编译和加载过程嵌入式应用程序的编译和加载过程2.3.4嵌入式软件开发工具设计生产编译器链接器调试器IDE操作系统软件测试评估板仿真器逻辑分析仪边界扫描测试仪编程器2.3.4嵌入式软件开发工具设计生产编译器链接器调试器ID开发环境什么是嵌入式开发环境:源程序编译器目标文件链接器可重定位程序定位器可执行文件编译器/汇编器/链接定位器调试器/仿真器主机(Host)及其工作平台实时操作系统(可选)目标评估系统(可选)测试工具(软件/硬件/协议等,可选)其他辅助设备(可选)典型的开发环境开发环境什么是嵌入式开发环境:源程序编译器目标文件链接器可重ARM的编译器(1)ADS1.2ARM公司出品IDE环境,包括ARM/Thumb汇编器:armasmANSIC编译器-armcc和tccISO/EmbeddedC++编译器-armcppandtcpp链接器–armlinkWindows集成开发环境–CodeWarrior格式转换器–fromelf库管理器-armar调试器模拟调试器:ARMulatorJTAG调试:AXD(与Multi-ICE配合)支持所有ARM内核,最新版本:RealView2.0ARM的编译器(1)ADS1.2ARM的编译器(2)EW-ARM瑞典IAR公司出品著名的嵌入式工具提供商,以提供编译器/协议栈/统一建模工具著称主要产品:EmbededWorkbench(EW)、MakeAPP、VisualState等EW-ARM:针对ARM的集成开发环境:C/C++编译器C-SPY模拟调试器ROM-Monitor多种级别代码优化方法,满足用户在速度、文件大小方面的要求内建ARM特性优化器支持多种断点模式支持Nucleus,VxWorks等RTOSGreenhillsGNUARM的编译器(2)EW-ARM嵌入式系统的调试(1)嵌入式系统的调试的几种基本方法:
直接测试法调试监控器法ROM仿真器法在线仿真器法片上调试法模拟调试(Simulator)嵌入式系统的调试(1)嵌入式系统的调试的几种基本方法:调试监控器法主机和目标板通过某种接口(通常是串口)连接,主机上提供调试界面,待调试软件下载到目标板上运行。这种方式的先决条件是要在Host和Target之间建立起通信联系(目标板上称为监控程序Monitor)优点:纯软件,价格较低,简单,软件调试能力较强缺点:需要事先烧制Monitor(往往需多次试验才能成功)且目标板工作正常,功能有限,特别是硬件调试能力较差。
PCTargetMonitor串口调试监控器法PCTargetMonitor串口片上调试法BDM/JTAG调试
这种方式有一个硬件调试体。该硬件调试体与目标板通过BDM、JTAG等调试接口相连,与主机通过串口、并口、网口或USB口相连。待调试软件通过BDM/JTAG调试器下载到目标板上运行。优点:方便、简单,无须制作Monitor,软硬件均可调试缺点:需要目标板,且目标板工作基本正常(至少MCU工作正常),仅适用于有调试接口的芯片
TargetPC接口BDM/JTAGDebugger片上调试法BDM/JTAG调试TargetPC接口BDM/J在线仿真器法
全仿真调试(Emulator)
这种方式用仿真器完全取代目标板上的MCU,因而目标系统对开发者来说完全是透明的、可控的。仿真器与目标板通过仿真头连接,与主机有串口、并口、网口或USB口等连接方式。由于仿真器自成体系,调试时既可以连接目标板,也可以不连接目标板(Standalone)。优点:功能非常强大,软硬件均可做到完全实时在线调试缺点:价格昂贵。在线仿真器法
全仿真调试(Emulator)ARM的调试方式模拟调试SDT2.52:ARMulatorADS1.2:ARMulatorTrace32:SimulatorEW-ARM:C-spy软件调试ADS1.2:Angel(串口)SDT2.52Angel(串口)JTAG调试ARM:Multi-ICE,简易型仿真器Trace32-ICDforARMHitex:TantoforARM全仿真调试Trace32-FIRE/ICEARM的调试方式模拟调试ARM调试工具Multi-ICEARM公司出品与ADS配套使用支持不同的ARM内核另有Multi-trace模块可选ARM调试工具Multi-ICE谢谢各位
谢谢各位
嵌入式系统设计与实例开发—基于ARM微处理器与实时操作系统第二讲基本概念及设计方法主讲教师:罗子波副教授嵌入式系统设计与实例开发本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统的选择原则和设计工具本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统嵌入式微处理器简介嵌入式微处理器体系结构嵌入式微处理器的分类2.1嵌入式系统硬件知识嵌入式微处理器简介2.1嵌入式系统硬件知识嵌入式微处理器简介嵌入式硬件系统组成:嵌入式微处理器:控制单元ALU 寄存器存储器输入/输出单元嵌入式微处理器简介嵌入式硬件系统组成:嵌入式处理器的基本结构(1)微处理器是整个系统的核心,通常由3大部分组成:控制单元、算术逻辑单元和寄存器。算术逻辑单元寄存器控制单元微处理器存储器输入输出嵌入式处理器的基本结构(1)微处理器是整个系统的核心,通常由嵌入式处理器的基本结构(2)控制单元:主要负责取指、译码和取操作数等基本动作,并发送主要的控制指令。控制单元中包括两个重要的寄存器:程序计数器(PC)和指令寄存器(IR)。程序计数器用于记录下一条程序指令在内存中的位置,以便控制单元能到正确的内存位置取指;指令寄存器负责存放被控制单元所取的指令,通过译码,产生必要的控制信号送到算术逻辑单元进行相关的数据处理工作。算术逻辑单元:算术逻辑单元分为两部分,一部分是算术运算单元,主要处理数值型的数据,进行数学运算,如加、减、乘、除或数值的比较;另一部分是逻辑运算单元,主要处理逻辑运算工作,如AND、OR、XOR或NOT等运算。寄存器:用于存储暂时性的数据。主要是从存储器中所得到的数据(这些数据被送到算术逻辑单元中进行处理)和算术逻辑单元中处理好的数据(再进行算术逻辑运行或存入到存储器中。
嵌入式处理器的基本结构(2)控制单元:主要负责取指、译码和取冯·诺依曼体系结构和哈佛体系结构CISC与RISC信息存储的字节顺序IP核流水线存储器系统2.1.2嵌入式微处理器体系结构冯·诺依曼体系结构和哈佛体系结构2.1.2嵌入式微处理器体冯·诺依曼体系结构模型指令寄存器控制器数据通道输入输出中央处理器存储器程序指令0指令1指令2指令3指令4数据数据0数据1数据2冯·诺依曼体系结构模型指令寄存器控制器数据通道输入输出中央处哈佛体系结构指令寄存器控制器数据通道输入输出中央处理器程序存储器指令0指令1指令2数据存储器数据0数据1数据2地址指令地址数据哈佛体系结构指令寄存器控制器数据通道输入输出中央处理器程序存CISC和RISCCISC:复杂指令集(ComplexInstructionSetComputer)具有大量的指令和寻址方式8/2原则:80%的程序只使用20%的指令大多数程序只使用少量的指令就能够运行。RISC:精简指令集(ReducedInstructionSetComputer)在通道中只包含最有用的指令确保数据通道快速执行每一条指令使CPU硬件结构设计变得更为简单
CISC和RISCCISC:复杂指令集(ComplexInCISC与RISC的数据通道IFIDREGALUMEM开始退出IFIDALUMEMREG微操作通道开始退出单通数据通道CISC与RISC的数据通道IFIDREGALUMEM开始退CISC的背景和特点背景:存储资源紧缺,强调编译优化增强指令功能,设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的(微程序)指令系统来实现为节省存储空间,强调高代码密度,指令格式不固定,指令可长可短,操作数可多可少寻址方式复杂多样,操作数可来自寄存器,也可来自存储器采用微程序控制,执行每条指令均需完成一个微指令序列(微程序)CPI>5,指令越复杂,CPI越大。CISC的背景和特点背景:存储资源紧缺,强调编译优CISC的主要缺点指令使用频度不均衡。高频度使用的指令占据了绝大部分的执行时间,扩充的复杂指令往往是低频度指令。大量复杂指令的控制逻辑不规整,不适于VLSI工艺VLSI的出现,使单芯片处理机希望采用规整的硬联逻辑实现,而不希望用微程序,因为微程序的使用反而制约了速度提高。(微码的存控速度比CPU慢5-10倍)。软硬功能分配复杂指令增加硬件的复杂度,使指令执行周期大大加长,直接访存次数增多,降低了CPU性能。不利于先进指令级并行技术的采用流水线技术CISC的主要缺点指令使用频度不均衡。RISC基本设计思想减小CPI:CPUtime=Instr_Count*CPI*Clock_cycle精简指令集:保留最基本的,去掉复杂、使用频度不高的指令采用Load/Store结构,有助于减少指令格式,统一存储器访问方式采用硬接线控制代替微程序控制RISC基本设计思想减小CPI:CPUtime=Instr典型的高性能RISC处理器SUN公司的SPARC(1987)MIPS公司的SGI:MIPS(1986)HP公司的PA-RISC,IBM,Motorola公司的PowerPCDEC、Compac公司的AlphaAXPIBM的RS6000(1990)第一台SuperscalarRISC机
典型的高性能RISC处理器SUN公司的SPARC(1987)CISC与RISC的对比类别CISCRISC指令系统指令数量很多较少,通常少于100执行时间有些指令执行时间很长,如整块的存储器内容拷贝;或将多个寄存器的内容拷贝到存贮器没有较长执行时间的指令编码长度编码长度可变,1-15字节编码长度固定,通常为4个字节寻址方式寻址方式多样简单寻址操作可以对存储器和寄存器进行算术和逻辑操作只能对寄存器对行算术和逻辑操作,Load/Store体系结构编译难以用优化编译器生成高效的目标代码程序采用优化编译技术,生成高效的目标代码程序CISC与RISC的对比类别CISCRISC指令系统指令数量for(i=0;i<10000;++i)
/*各种算术运算操作*/实验平台:桌面IntelPentium4,带硬件浮点支持Operator Time Operator Time
+(int) 1 +(double) 5
*(int) 5 *(double) 5
/(int) 12 /(double) 10
<<(int) 2 sin 48
小实验1for(i=0;i<10000;++i)
/信息存储的字节顺序大端模式字数据的高位字节存储在低地址中字数据的低字节则存放在高地址中小端模式低地址中存放字数据的低字节高地址中存放字数据的高字节3124
2316
158
70字地址11109887654432100低地址高地址3124
2316
158
70字地址89101184567401230低地址高地址信息存储的字节顺序大端模式3124231615870字示例A.小端存储法(0x01234567)地址0x80000x80010x80020x8003数据(16进制表示)0x670x450x230x01数据(二进制表示)01100111010001010010001100000001B.大端存储法地址0x80000x80010x80020x8003数据(16进制表示)0x010x230x450x67数据(二进制表示)00000001001000110100010101100111示例A.小端存储法(0x01234567)地址0x8000TheARM可以用little/bigendian格式存取数据.r0=0x11223344STRr0,[r1]LDRBr2,[r1]r1=0x100Memory32100123ByteLane312423161587011223344312423161587011223344312423161587011223344312423161587000000044312423161587000000011LittleendianBigendianR2=0x44R2=0x11Formoreinformation,see:“ApplicationNote61:BigandLittleEndianByteAddressing”字节顺序TheARM可以用little/bigendian2.1.3嵌入式微处理器的分类2.1.3嵌入式微处理器的分类本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统的选择原则和设计工具本节提要132嵌入式系统硬件知识嵌入式系统软件知识嵌入式系统2.2.1嵌入式软件概述规模较小开发难度大实时性和可靠性要求高要求固化存储2.2.1嵌入式软件概述规模较小2.2.1嵌入式软件体系结构无操作系统的情形在嵌入式系统的发展初期,由于硬件的配置比较低,对于是否有系统软件的支持,要求还不是很强烈。在那个阶段,嵌入式软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统。有操作系统的情形2.2.1嵌入式软件体系结构无操作系统的情形无操作系统的情形循环轮询系统:(PollingLoop)最简单的软件结构,程序依次检查系统的每个输入条件,一旦条件成立就进行相应的处理。Initialize();while(1){if(condition_1)action_1();if(condition_2)action_2();……if(condition_n)acition_n();}无操作系统的情形循环轮询系统:(PollingLoop)事件驱动系统:(Event-Drivensystem)事件驱动系统是能对外部事件直接响应的系统。它包括前后台、实时多任务、多处理器等,是嵌入式实时系统的主要形式。应用程序是一个无限循环,循环中调用相应的函数完成相应操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可看成前台行为(foreground)。后台也可以叫做任务级,前台也叫中断级。事件驱动系统:(Event-Drivensystem)例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电话机、玩具等。从省电的角度出发,平时微处理器处在停机状态,所有的事都靠中断服务来完成。例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电前后台系统(后台循环、前台中断)ISRISR后台前台ISR时间前后台系统(后台循环、前台中断)ISRISR后台提高了系统可靠性提高了系统的开发效率,降低了开发成本,缩短了开发周期有利于系统的扩展和移植有操作系统的情形提高了系统可靠性有操作系统的情形2.2.3嵌入式操作系统的分类按系统的类型分:商用系统专用系统开源系统按响应时间分:实时硬实时系统软实时系统非实时2.2.3嵌入式操作系统的分类按系统的类型分:按软件结构分类…单体结构(MonolithicStructure)分层结构(LayeredStructure)Outofdate…微内核结构(MicrokernelModel)按软件结构分类…单体结构(MonolithicStruc单体结构最常用的组织结构;整个系统只有一个可执行文件,包含所有的操作系统组件;系统的结构就是无结构,由一组函数组成,相互之间可以随意地调用。应用软件文件I/O存储管理进程管理I/O驱动存储驱动中断驱动硬件单体内核单体结构最常用的组织结构;应用软件文件I/O存储管理进分层结构在分层结构(layered)中,一个操作系统被划分为若干个层次(0..N),各个层次之间的调用关系是单向的,即某一层次上的代码只能调用比它低层的代码。这种结构要求在每个层次上都要提供一组API接口函数,这就会带来额外的开销分层结构在分层结构(layered)中,一个操作系统被划分为微内核设备驱动程序微内核结构操作系统内核只包含最少的功能,如存储管理和进程管理;其他的操作系统组件以中间件的形式存在于内核之外;设备驱动程序完全从内核中剥离,独立成为一层。中间件、应用软件存储管理进程管理I/O驱动存储驱动中断驱动硬件微内核设备驱动程序微内核结构操作系统内核只包含最少的功能有操作系统的情形硬件板级
初始化设备
驱动层以太网
驱动串口
驱动LCD
驱动键盘
驱动操作
系统层中间件
层应用
软件层TCP/IP
网络系统文件
系统内核嵌入式
GUI嵌入式
CORBA嵌入式
JAVA嵌入式
DCOM面向领域
的中间件WWW
浏览器MP3
播放器电子
邮件…有操作系统的情形硬件板级
初始化设备
驱动层以太网
驱动串口为什么要有设备驱动程序?嵌入式硬件设备本身无法工作,需要软件来驱动,如初始化、控制、数据读写等。什么是设备驱动程序?直接与硬件打交道、对硬件进行控制和管理的软件。在一个嵌入式系统中,设备驱动程序是必不可少的。设备驱动程序为什么要有设备驱动程序?设备驱动程序设备驱动程序的主要功能硬件启动(Startup):在开机上电或重启的时候,对硬件进行初始化;硬件关闭(Shutdown):把硬件配置成关机状态;硬件停用(Disable):暂停使用硬件;硬件启用(Enable):重新启用硬件;硬件读操作(Read):从硬件中读取数据;硬件写操作(Write):往硬件中写数据;……设备驱动程序的主要功能硬件启动(Startup):在开机上电嵌入式中间件中间件(Middleware):在OS内核、设备驱动程序和应用软件之外的所有系统软件;中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在其上的各个应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台;优点:实现软件的可重用,降低应用软件的复杂性,降低开发成本。嵌入式中间件中间件(Middleware):在OS内核、设备2.2.4嵌入式操作系统的几个概念占先式内核调度策略分析任务优先级分配时间的可确定性任务切换时间中断响应时间优先级反转任务执行时间的抖动任务划分2.2.4嵌入式操作系统的几个概念占先式内核2.2.5常见的嵌入式操作系统实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵μC/OS。免费型的实时操作系统在价格方面具有优势,目前主要有Linux和,稳定性与服务性存在挑战。2.2.5常见的嵌入式操作系统实时嵌入式操作系统的种类VxWorksVxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域牢牢占据着一席之地。VxWorks所具有的显著特点是:
-可靠性、实时性和可裁减性。 -它支持多种处理器,如x86、i960、SunSparc、MotorolaMC68xxx、MIPS、POWERPC等等。大多数的VxWorksAPI是专有的,火星机器人。VxWorksVxWorks操作系统是美国WindRiverWindowsEmbeddedWindowsCE3.0:一种针对小容量、移动式、智能化、32位、连接设备的模块化实时嵌入式操作系统。针对掌上设备、无线设备的动态应用程序和服务提供了一种功能丰富的操作系统平台,WindowsCE嵌入但不够实时,属于软实时操作系统,由于其Windows背景,界面比较统一认可。操作系统的基本内核需要至少200K的ROM。WindowsEmbeddedWindowsCE3.0PalmOSPalmOS是著名的网络设备制造商3COM旗下的PalmComputing掌上电脑公司的产品。3COM、CISCO竞争PalmOS在PDA市场上占有很大的市场份额,PalmOS的市场份额占到将近90%,最近下降70%,目前主要与WINCE进行激烈竞争。PalmOSPalmOS是著名的网络设备制造商3COM旗QNX加拿大QNX公司的产品。QNX是在X86体系上面开发出来的,这和别的RTOS不一样,别的好多RTOS都是从68K的CPU上面开发成熟,然后再移植到X86体系上面来的。QNX是一个实时的、可扩充的操作系统,它部分遵循POSIX相关标准,由于QNX具有强大的图形界面功能,因此很适合作为机顶盒、手持设备(手掌电脑、手机)、GPS设备的实时操作系统使用。QNX加拿大QNX公司的产品。嵌入式Linux嵌入式系统越来越追求数字化、网络化和智能化。因此原来在某些设备或领域中占主导地位的软件系统越来越难以为继,整个系统必须是开放的、提供标准的API,并且能够方便地与众多第三方的软硬件沟通。Linux是开放源码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发的强大技术后盾。Linux的内核小、功能强大、运行稳定、系统健壮、效率高,易于定制剪裁,在价格上极具竞争力。Linux不仅支持x86CPU,还可以支持其他数十种CPU芯片。嵌入式Linux嵌入式系统越来越追求数字化、网络化和智能化。
嵌入式Linux(EmbeddedLinux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究是目前操作系统领域的一个热点。主要有RTLinux和CLinuxLinux在嵌入式领域异军突起不过是近两年的事情,过去的一年中有13%的用户已经开始使用嵌入式Linux系统进行开发工作;有52%的用户决定在未来24个月内开始使用Linux作为嵌入式操作系统的开发原型。嵌入式Linux及应用嵌入式Linux(EmbeddedLinux)是指对LiC/OS及C/OS-II
1、C/OS——MicroControllerOS,微控制器操作系统2、C/OS简介美国人JeanLabrosse1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等1998年C/OS-II,目前的版本C/OS-IIV2.61,2.722000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站www.ucos-II.com()C/OS及C/OS-II
1、C/OS——Micro嵌入式C程序设计“whichofthefollowingprogramminglanguages
haveyouusedforembeddedsystemsinthelast
12months” C 81%
Assembly 70%
C++ 39%
VisualBasic 16%
Java 7%Source:“ESP:A10-yearretrospective”,Embedded
SystemsProgramming,November,1998嵌入式C程序设计“whichofthefollowin嵌入式软件的目标函数必须正确;源代码简洁、可读性好、可维护;实时性要求较高的代码能够运行得足够快;目标代码小且高效。总之,要优化对以下三种资源的使用:执行时间;存储空间;开发/维护时间。嵌入式软件的目标函数必须正确;数据类型与运算符宏定义:用一个指定的标识符来代表一个字符串。#define标识符字符串如:#definePI3.1415926,其作用是指定用标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中出现的所有PI都用“3.1415926”代替。(1)宏定义数据类型与运算符宏定义:用一个指定的标识符来代表一个字符串。宏定义的基本思想是:一次定义,多次使用。其优点是:可以用简短的标识符来代替长的数据,减少需要输入的字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年触电事故应急预案及现场处置方案
- 易制毒化学品管理制度的落实情况的评估
- 公司财务内部反腐制度
- 分公司内部人员管理制度
- 反诈中心内部考核制度
- 发改局内部资产管理制度
- 地产内部员工管理制度
- 城乡居民内部控制制度
- 大学学校内部等级制度
- 存货内部审计制度
- 初中八年级物理课件-4.4 光的折射
- 泥石流灾害与防治工程
- 高分子材料工程专业英语翻译(DOC)
- 【高中数学】充要条件+课件+高一上学期数学人教A版(2019)必修第一册
- Soul《心灵奇旅(2020)》完整中英文对照剧本
- 理学ERP沙盘模拟人机对抗创业版
- SB/T 10439-2007酱腌菜
- LY/T 1718-2017低密度和超低密度纤维板
- JJG 768-2005发射光谱仪
- 起重司索工安全操作培训ppt讲课教案
- 《尼尔斯骑鹅旅行记》阅读推荐课课件
评论
0/150
提交评论