第八章第一部分嵌入式软件设计方法核心内容•嵌入式软件工程思想•嵌入式软件开发过程•一些基本的设计原则•通用的设计方法•专用的设计方法•设计方法的发展8.1嵌入式软件工程•嵌入式软件的分类•嵌入式软件的特点•嵌入式软件生命期一、嵌入式软件工程的基本思想在传统的软件工程方法基础上,面向增加实时、并发等设计技术而形成的。值域、时域嵌入式软件的生命期关注嵌入式实时系统•任务的实时性•时间特性强调计算状态的时间边界和它们之间的关系•时间表达基于时间点、基于时间间歇(开始、终止)•时间限制在满足了所有启动条件后,对一个可执行对象开始执行和必须终止的约束:start、dealine关注•并发任务之间的协作关系互斥问题同步问题•信息隐藏任务之间、模块之间接口消除全局变量二、嵌入式软件的分类三、嵌入式软件的特点•实时性环境特定;快速启动•异步事件的并发处理多任务;随机性•应用/操作系统一体化VxWorks;Linux•应用固化不可修改性•实用性面向行业;定向开发•适用性可裁减,适应应用•鲁棒性容错•够用即可成本、资源•可信性安全、防危、可靠等四、嵌入式软件开发过程开发过程——需求定义•功能需求•基本功能/扩展功能•对应于软件功能的硬件•非功能需求•外观、尺寸、功耗、成本、…•实时、安全、可靠、…面向开发者的需求需求说明的要点1)只指明外部行为,不考虑特殊实现2)列出实现的限制,必须特别说明硬件接口细节(针对嵌入式系统)3)文档易修改4)必须记录有关系统生存期的一些考虑5)必须特征化针对异常事件的响应,包括-资源失败临时或永久-非正确输入输入、比较、出错、输出-非正确内部数据不一致、比较、输出最重要说明1)与所委派事件相关,可以是绝对时间-给定时间达到后,事件发生-超过限定时间,事件不允许发生-在事件发生前可以产生哪些计算活动2)根据优先级响应某种事件时间限制需求说明必须包含的内容1)硬件接口必要特征、任意细节、输入/输出2)软件功能功能结构,条件/事件,所用模型,特殊处理3)状态图一种可视化的形式化方法,用于说明复杂系统的行为,所有行为由外部刺激产生。-状态、事件、条件、变迁状态图示例需求考虑1)所有与设计相关的需求(功能、非功能)必须明确说明例:若无deadline,就不考虑硬实时2)在许可条件下,尽可能提高速度(计算机、网络)确保采样率、资源使用、Deadline等3)指定软件组件之间的接口需求标识消息传递。4)需要指定系统正常运行对CPU的使用率便于管理共享资源。开发过程——硬件选择•嵌入式处理器应用规模、领域•功能硬件处理器相关、应用功能确定•目标板设计需求配套芯片、外观、尺寸、功耗、成本开发过程——嵌入式OS•来源专用、COTS•选择CPU支持环境(资源、实时)功能成本开发支持开发过程——选择•软件体系结构核心因素•软件设计模型驱动、任务划分、约束(实时、安全等)保障•开发平台工具链、方便性开发的可管理性开发过程——编码调试基本的编码原则•清除无用代码•避免使用递归资源•减少浮点运算速度•精简库函数•清除调试代码精炼开发过程——测试•基本方法类似于一般软件测试•特殊性可靠性测试实时性测试并发性测试资源占用测试……8.2常规设计方法通用软件设计方法在嵌入式软件开发领域的应用一、语言描述•必不可少的分析设计方法,优缺点突出•对其他方法的补充二、数学分析•形式化分析,是一种精确而有效的方法•最好的验证方式•缺点突出,难以描述大型复杂系统•应用大型系统中的关键部件设计软件性能优化科学计算三、流程图——最早之一初始化端口接收信息加入缓冲区缓冲区满开始结束放弃NY本程序用于接收采样信息。由于采样频率是每秒钟次,因此子程序执行时间不允许超过毫秒。此外,由于内存限制,缓冲区只允许设置在范围内。四、结构图——体系结构四、伪代码——类编码x::=y::=0;fori=1..20beginx::=x+1;ifx≥10theny:=y+x*3elsey::=y*2;end;printx,y五、有限状态机描述控制特性六、数据流图DFD,描述数据转换和流动情况,确定功能关联8.3实时多任务设计•起因:常规方法的不足•重点:并发性、实时性设计•方式:传统方法的实时性改造•要点:多任务划分基于事件、基于结构1.RTSAD方法(实时结构化分析设计)•RTSA阶段:实时系统需求模型•RTSD阶段:实时系统设计•基本概念:模块内聚模块耦合数据流、控制流RTSA主要活动及其结果RTSD主要活动及其结果功能、转换、过程功能RTSAD示例汽车行驶监控——车速数据流汽车行驶监控——车速状态转换汽车行驶监控——任务划分优先级设置2.DARTS方法将系统结构化成并发任务并定义任务间接口系统需求定义划分子系统划分任务定义任务接口任务设计DARTS——任务划分原则I/O依赖性直接操作I/O设备时间关键性对时间有很强要求,必须具有高优先级周期执行时间内聚多个,同一时段,重复功能内聚多个,功能紧密,交互多计算需求大量、低优先级DARTS——任务接口DARTS——任务接口(续)任务同步模块事件目标:等待事件()源:发事件信号()DARTS示例——机器人控制控制执行过程按下“上电”按钮,系统进入了上电状态。上电成功后,系统进入了手动状态。此时,操作者可以通过程序选择开关选择程序按下“运行”按钮,则选定的程序开始运行,系统转为运行态。程序运行中如果按下“停止”键,程序被挂起。之后,操作者可以按下“运行”键,使程序恢复执行,也可按下“结束”键,结束程序。按下“结束”键后,系统进入终止态。当程序最终终止执行时,系统返回手动状态。系统状态变迁图——执行流程数据流图任务划分任务界面8.4设计方法的发展•复杂性单机→网络•应用领域广泛;差异大•集成度软硬件协同•更新速度重用•通用方法多种起因:1.软硬件协同设计2.构件化设计3.基于中间件的设计8.5基本设计原则尽量简单使用静态表尽量减少动态性恰当的任务数目使用有限状态自动机辅助设计面向对象设计减少预留接口尽量简单不存在完善方法任何的设计都只能尽量好,不可能最优。以成本为基准开发计划易实现,成本费用可控制,软件质量有保障不能过于强调精简软件具有可读性、可移植性、易维护常用模型和方法原型模型、增量模型、组件/构件方法使用静态表系统运行前,根据各任务的实时要求生成一张任务的运行时间表,指明各任务的起始运行时间以及运行长度运行时间表生成后,在系统运行过程中不再变化系统运行时,调度器只需根据这张表在指定的时刻启动相应的实时任务减少动态性特点决定嵌入式系统中,时间资源非常宝贵,往往需要以空间换时间采用静态数据结构如静态数组不能绝对禁止动态消息队列、资源丰富系统、动态更新减少任务数任务队列变长,任务调度管理复杂化,调度延迟增加,从而降低整个系统的实时性能任务数目的增多,任务间通信几何级数增长,影响系统的实时性能原则在实时性允许的范围内定义适当的任务数目第八章第二部分嵌入式软件编程核心内容•嵌入式程序设计语言•汇编语言•C语言•C与汇编混合编程•嵌入式Java•编程规范8.6嵌入式程序设计语言•一种程序设计语言可以看成是控制某种设备,特别是一种计算机的人为语言。同自然语言一样,它也使用语法和语义规则分别定义其语句结构和涵义•程序设计语言的作用在于表述算法,以便更方便地组织和操作信息。程序设计语言的定义中应该包括以下内容•功能•目标•结构•表达能力程序设计语言需要较高的精确度和完整性。8.7汇编语言•GAS的基本风格•与AT&T的差异一、GAS的基本风格•1、程序的构成从整体结构上看,一个完整的GAS汇编语言程序需要包括程序名(.title,也称为头信息)、全局定义(.global)、外部引用(.include,.extern)、数据段(.data)、文本段(.text)、主程序(main)、注释(#)等部分。其中,文本段是必不可少的。•2、注释以“#”开头的程序行是注释行。•3、标识符标识符是由字母和数字组成的一个字符串。定义标识符时,后面必须紧跟一个冒号“:”,表示标识符所在内存单元的地址计数值。标识符作为变量名被外部调用,则需要用.globalprocessname的方式来申明该过程在其他的汇编语言和C语言程序中可以使用外部引用方式调用该过程•4、常数的表示在GAS中,数值表示如下:1)二进制数:由0b或者0B开头,如:0b1010101、0B1011110;2)十六进制数:以0x或者0X开头,如:0x4e7、0X1f9;3)八进制数:由0开头,如:0625、0450;4)十进制数:以非零数开头,如:365、13180;5)字符串:由引号括起,如:”string”。•5、常用的汇编指示符1).reptcount:表示重复count次;2).macro、.endm:定义宏;3).include“filename:用于将一个程序文件插入到另外一个程序文件中;4).globalname:将name申明为全局符号;5).setname,value:申明一个符号常量,程序中使用时要在前面加一个“$”符号;6).balignabs_expr,pad_value:表示将地址对齐;7).p2alignabs_expr,pad_value:表示将地址按2的次方对齐;8).title“heading“:用于在生成符号列表时作为头信息。二、与AT&T的差异1、寄存器名的表达不同在GAS的80386汇编语言中,寄存器的名字前都要加上百分号“%”,而Intel的则没有:1)32位的寄存器:%eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp2)16位的寄存器:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp3)8位的寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl4)段寄存器:%cs,%ds,%ss,%es,%fs,%gs5)控制寄存器:%cr0,%cr2,%cr32、数据传送的方向不同GAS汇编语言中,数据的传送方向与Intel宏汇编的方向刚好相反Intel宏汇编命令将ax的内容送到cx中在GAS汇编语言中将cx的内容送到ax中3、操作数位数的表达不同在GAS汇编语言中,操作数的位数由指令的后缀表示,其中后缀为“l”表示32位,“w”表示16位,“b”表示8位。Intel宏汇编则用操作数前缀表示法,需要使用dword、wor、byte等关键字在GAS汇编语言中Intel宏汇编4、立即数的表达不同在GAS的汇编语言中,立即数前要加前缀“$”符号Intel宏汇编语句GAS汇编语句表示将以地址0x16开始的4个字节的内容送到寄存器eax中5、内存引用不同6、长跳转指令不同GAS汇编语言中Intel宏汇编GAS汇编语言Intel宏汇编8.8C语言•gcc扩展•C51扩展•浮点运算支持一、gcc扩展gcc是为Linux配套的C语言编译器,在支持多个版本的ANSIC标准基础上,进行了一些扩展,主要集中在增强C语言的表达能力和语言功能,可通过使用-ansi、-traditional等编译参数来控制扩展功能是否启用。GNU的gcc编译器在嵌入式领域使用的非常广泛,它支持众多的高档嵌入式处理器,如Intel386、Intel960、68000、ADM29K等。这看上去多此一举,而且不符合通用的编程规范,但在替代不安全的宏定义时,显得特别有用,如:要计算两次a和b,有可能带来副作用,如如定义为则可消除该不安全因素。1、表达式内可以包含变量声明、赋值、分支、循环等语句2、局部标识符主要用于限制标识符的作用域,避免名字冲突。其声明必须在语句块的开始,形式如下:当宏定义中有循环判断时,使用比较方便,如:3、内嵌函数gcc的语法中支持函数内定义新函数,该函数的名字在该语句块内有效,也可通过指针传递到该语句块之外,这种新函数称为内嵌函数。内嵌函数可以访问所在语句块的所有变量。4、类型引用在gcc语法中可以利用typeof获取表达式的类型,这主要用于定义与某一表达式或类型相同