本书讲述了 M 代码和 Embedded MATLAB 代码的快速编写与调试 、 浮点模型的建立 、 调试与验证以及用户驱动模块的创建。内容简介本书以基于模型的设计为主线,讲述了M代码和 Embedded matlab代码的快速编写与调试、浮点 Simulink/ Stateflow模型的建立、调试与验证以及用户驱动模块的创建;详细介绍了基于模型设计的全过程,主要包括:需求的验证与跟踪、模型的系统测试与设计验证、浮点到定点模型的转换、模型嵌入式C代码的自动生成以及软件/处理器/硬件在环测试。整个过程满足DO178B航空电子规范,可显著提高工作效率、降低开发成本,并且增加了代码的安全性与鲁棒性,避免了产品开发的潜在市场风险。本书可作为汽车电子、航天军工、通信与电子信息、电力等领域的工程师从事嵌入式系统开发的技术手册,也可作为高校电子类专业嵌入式系统开发与基于模型设计的教材,另外也是一本MATLAB高级建模与模型验证的参考书图书在版编目(CIP)数据基于模型的设计及其嵌入式实现/刘杰编著.--北京:北京航空航天大学出版社,2010.9ISBN978-7-5124-0213-3Ⅰ.①基…Ⅱ.①刘…Ⅲ.①航空电气设备一设计Ⅳ.①V242.2中国版本图书馆CIP数据核字(2010)第176287号版权所有,侵权必究。基于模型的设计及其嵌入式实现刘杰编著责任编辑刘星北京航空航天大学出版社出版发行北京市海淀区学院路37号(邮编100191)http://www.buaapress.com.cn发行部电话:(010)82317024传真:(010)82328026读者信箱:ebook@gmail.com邮购电话:(010)82316936有限公司印装各地书店经销开本:787×10921/16印张:27.75字数:710千字2010年9月第1版2010年9月第1次印刷印数:4000册ISBN978-7-5124-0213-3定价:59.00元在目前的市场上,想找到一款不包含嵌入式控制器件的电子、机电产品已经很难了,含有嵌入式系统的产品已深入到了我们工作、生活的方方面面。同时,人们对于产品的安全性、实时性、可操作性、特定功能等要求也越来越高,这也就大大增加了嵌入式系统的复杂性和开发难度。为了在日趋激烈的市场竞争中占据有利地位、开发出高质量的产品,采用传统的项目开发方法已很难满足这些需求传统项目开发的方法一般分为4个步骤:①需求分析与技术规范阶段。般用纸质文档或电子word文档写成,系统工程师团队以此进行概念和算法硏究,评估技术规范的可行性。对于厚厚的技术文档,每个系统工程师对需求和技术规范的理解难免存在偏差。NASA的研究报告指出:“在需求分析阶段产生的错误占整个开发错误的50%以上”,这给后期的项目开发带来了诸多隐患。②设计阶段。硬件开发工程师团队根据系统工程师的评估报告,设计制作原型样机(如汽车、航空航天器、电路板等),项目的前期投入巨大、开发周期长,并且不能保证所制作的原型样机一定能满足技术规范要求的技术指标。实现阶段。软件开发工程师团队根据需求与技术规范,在原型样机上,手工编写C代码或汇编代码,实现技术规范所要求的技术指标。这一阶段需要精通软件的编程人员花费大量时间来编制程序、查错、调试、验证,明显增加了工作量,延长了研制周期。此外,手工编制的代码良莠不齐,降低了软件运行的可靠度,增加了代码错误的可能性,给新产品上市带来风险。④测试与验证阶段。原型样机制造完成后,才能对产品进行测试与验证,只要上述任何一个过程出现偏差都会导致产品开发的失败,这也是传统项目开发最大的弊病。因此,传统的项目开发方法难免重复多次才能成功,开发风险巨大。为了解决这些问题,工程师必须找到一种更快速度、更有效率的开发产品的方法,基于模型的设计就是解决该问题的一种选择。它始于20世纪90年代初的汽车制造和航空航天工业,这些行业需要使用大量的微处理器单元,因此工程师们最先发现了采用建模与仿真的方法来开发嵌入式系统的巨大优势;到了90年代中期,控制算法仿真技术的发展催生了自动代码生成技术。模型仿真和自动代码生成技术在这些行业得到的成功应用,使人们清楚地认识到它在嵌入式系统开发中的经济和高效。基于模型的设计为工程师们提供了一种通用的开发与测试平台,使具有不同工程背景的工程师之间建立起更好的联系,使开发具有高集成度的复杂系统成为可能目前国际上流行的基于模型设计的软件主要有 SCADE和 MATLAB,它们都成功地应用于大型项目的开发上,例如,欧洲的空客380、美国的GM混合动力车、诺-马公司的联合攻击机等项目。 MATLAB已经成为一种近乎完美的高度集成化的开放式开发平台,在科学计算与建模方面处于不可替代的领先地位,加之其拥有国内众多的用户,因此,本书也选用MATLAB软件为例来讲述基于模型设计的方法。Mathworks公司的 Simulink/ Stateflow/ Embedded matlab等工具使得工程师可以在一个可视化的交互开发测试平台上进行基于模型的设计,工程师还可以利用直观的模块图对系统模型和子系统设计进行可视化处理。基于模型的设计对应传统项目开发的方法同样分为4个步骤①可执行、可跟踪的技术规范在基于模型的设计方法中,系统工程师首先要建立一个系统模型,即通过数学模型来精确、无歧义地描述用户的需求,创建一个可执行、可跟踪的技术规范。工程师可以通过这个系统模型,动态地确认系统性能。相对于用传统的纸质或电子Word文档来描述的需求与技术规范,这种方法具有明显的优势,它使得开发团队中的毎个成员都能够无歧义地理解并运行该模型,从而可以更加专注于开发主要模型的各个部分,不会因理解的不同而造成需求的丢失、冗余或冲突②生成定点模型。系统模型与需求之间可建立双向链接,在整个开发过程中,软件工程师可以对模型进行需求追踪和测试,将产品的缺点暴露在产品开发的初期。根据具体的嵌入式器件和实现条件,对系统模型进行细化与功能重分区;此后重新进行系统测试、设计测试和模型助手测试,验证是否满足需求与技术规范,判断是否还存在缺失的需求,验证是否符合特殊的行业标准(如DO178B、IEC-61508、MAAB等);之后再对模型做定点转换,形成简捷、髙效的定点模型嵌入式代码的自动生成Mathworks公司的Real- Time Workshop embedded Coder可以将 Simulink/ Stateflow中的模型自动转换为嵌入式C代码,大大降低嵌入式系统的开发门槛。开发人员可以在Simulink/ Stateflow、 Embedded matlab中建立系统模型、构思解决方案,然后使用RTW-EC自动生成优化的、可移植的、自定义的产品级C代码,并根据特定的目标配置自动生成嵌入式系统实时应用程序。这样就缩短了开发周期,同时避免了人为引入的错误。④连续的测试和验证基于模型的设计在整个设计过程中都在不断地进行测试和验证,工程师利用测试用例追踪系统级模型和需求,检测设计变更导致的系统输岀变化,并快速追踪到变更的来源;通过测试用例还能够了解系统模型的功能覆盖度。对于嵌入式系统,还需测试其实时性,工程师可以使用硬件在环测试检测嵌入式代码的实时性。通过测试,可以收集实时数据,修改代码参数。硬件在环检测能确保在开发早期就完成嵌入式软件的测试,这样在系统整合时,嵌入式软件测试就可以比传统方法检测得更彻底、更全面,从而可以及早地发现问题,大大降低解决问题的成本本书分为3个部分,第1~4章为第1部分,主要介绍了 Simulink/ Stateflow模型的建立、调试与验证,是基于模型设计的基础第1章主要包括: MATLAB部分新功能、基于cell的 M-code快速编写、M-Lint实时代码验证器的使用、基于R2010a的 Embedded matlab编程规范等;第2章主要包括: Simulink建模与调试、创建模型测试用例、模型的验证与覆盖度分析、基于采样与基于帧的信号分析等;第3章主要包括: Stateflow建模与调试、简单的应用实例等;第4章主要包括:编写S- function( C MEX S-function和 level-2 M S-funcion)、生成S- Function builder用户模块、编写 Embedded matlab模块、利用代码继承工具集成现存C代码到 Simulink模型的方法、编写TLC文件等。第5章为第2部分,介绍了CCS3.3集成开发环境的使用,讨论了嵌入式代码的快速生成、 MATLAB与CCS的交互式开发、传统滤波器设计与基于模型设计的比较等。第6章为第3部分,包括:传统项目开发方法与基于模型设计的比较;DO-178B航空电子规范的简介,符合υO-178B规范的基于模型设计工作流程;需求与模型间的双向跟踪,模型的系统测试与验证,模型的设计测试,模型覆盖度分析;浮点模型到定点模型的转换;代码的自动生成;生成代码的验证;模型与生成代码的双向跟踪;代码的实时性分析;综合硬件测试等。本书从策划到完成经历了两年半的时间,得到了两家公司的资助,书中使用的实验设备大多由它们提供,在此表示感谢。撰写过程中,作者阅读了超过数万页的外文资料和技术文档,做了大量的验证实验,有些例子是作者开发实例的总结,可以直接用于生产实践。书中很多内容由作者及其团队独立完成,不少内容比较新颖,也是首次在国内的公开出版物中出现。由于基于模型的设计涉及知识太多,无法在短短的几百多页图书中得到充分论述,加之时间紧且作者的水平有限,书中的错误或遗漏在所难免,敬请读者批评指正。欢迎读者参加对基于模型的设计技术的讨论,有兴趣的朋友可以发送邮件到:liuyu3594@yahoo.com.cn与本书作者沟通;也可以发送邮件到:emsbookagmai.com,与本书策划编辑进行交流翁公羽、孙瑶瑶、周宇博全程参与了本书的资料整理和撰写工作,郑仁富、杨元廷、罗兵陈添丁、郑明魁、李涵、胡步发参与了本书的策划和个别小节的编写工作,张华君、刘大茂、郭里婷李恭伟、张玮、陈智宾、陈声登、李天建对部分程序进行了调试和修改,刘高阳、万方、孙昕、郑红武、陈乐武、伍悦参与了部分画图工作,在此一并表示感谢。刘杰2010年5月于怡园目录第1章 MATLAB基础…1.1 MATLAB开发环境新功能1.1.1函数浏览器1.1.2函数提示·1.1.3目录浏览器…1.1.4文件交换服务1.2M文件4571.2.1M文件结构………1.2.2清理程序77891.2.3创建M文件……1.2.4M脚本文件1.2.5M函数1.2.6匿名函数141.3加快M文件的编写—M-Lint1.3.1什么是M-Lint…161.3.2 M-Lint使用方法161.3.3M-Lint实时代码检查∴…161.4加快M文件的调试——cell…201.4.1什么是cell…∴…201.4.2cell的定义与删除201.4.3使用cell调试模式1.4.4应用231.5数据存取261.5.1生成MAT文件1.5.2加载MAT文件271.5.3读取音视频文件1.6代码效率分析321.7 Embedded matlaB331.7.1 Embedded matlab的主要功能特点1.7.2 Embedded matlab的编程规范1.7.3 Embedded matlab的常用命令鲁·351.7.4C编译器的设置361.7.5应用实例第2章 Simulink建模与验证…572.1 Simulink基本操作582.1.1启动 Simulink582.1.2 Simulink模块库简介…592.1.3模块操作2.2信号采样误差642.2.1信号源……·鲁……………………642.2.2 MATLAB工作空间652.2.3用户自定义函数……682.2.4非线性系统692.2.5离散模块702.2.6采样误差2.2.7建立子系统曹·,·非742.2.8封装子系统……………742.2.9数据类型匹配772.2.10模型信息792.2.11模型元件化812.2.12自定义模块库··,鲁·.鲁··鲁鲁,·鲁·鲁鲁鲁3音频信号处理832.3.1仿真环境832.3.2基于采样的模型…842.3.3帧结构·2.3.4基于帧结构的模型2.3.5信号缓冲器882.3.6低通滤波···鲁·鲁鲁…………882.4视频监控912.4.1原理922.4.2SAD子系统·,鲁鲁·鲁·鲁··鲁·鲁鲁·鲁·鲁·鲁·鲁··鲁鲁922.4.3阈值比较932.4.4视频记录子系统鲁鲁·鲁鲁···,鲁鲁·鲁··鲁942.4.5源视频帧计数及显示42.4.6数据读取与显示952.5.7实验结果2.5模型调试972.5.1图形调试模式972.5.2命令行调试模式992.5.3调试过程…1002.5.4断点设置………………1032.5.5显示仿真及模型信息1072.6模型检查与验证………1132.6.1使用 Model advisor检查模型1132.6.2建立测试用例…1202.6.3模型覆盖度分析…1272.6.4模型效率分析132第3章 Stateflow原理与建模3.1 Stateflow概述………1373.1.1状态1393.1.2迁移∴……1413.1.3事件3.1.4数据对象1463.1.5条件与动作…1463.1.6连接节点…1473.2流程图鲁·鲁.··鲁鲁鲁鲁鲁1513.2.1手动建立流程图1523.2.2快速建立流程图…1533.2.3车速控制…1553状态图的层次…·鲁1583.3.1历史节点1593.3.2迁移的层次性…160内部迁移1613.4并行机制643.4.1广播1643.4.2隐含事件1693.4.3时间逻辑事件………1703.5其他的图形对象1713.5.1真值表…………………………………………………………………………1713.5.2图形盒····鲁鲁1733.5.3图形函数1743.6 Embedded matlab函数…鲁鲁……∴∴…∴∴…1753.6.1建立调用 Embedded matlab函数的 Simulink模型1753.6.2编写 Embedded matlaB函数1773.6.3调试1773.7 Simulink函数……1803.7.1 Simulink函数的使用1813.7.2使用 Simulink函数需遵循的规则1833.8集成自定义代码1843.9 Stateflow建模实例1883.9.1嵌入 Simulink1893.9.2模拟各种操作模式的状态1903.9.3状态行为与变量…1903.9.4状态间的迁移…1923.9.5如何触发图表…1933.9.6仿真1953.9.7调试199第4章用户驱动模块的创建∴∴…∴∴∴…2024.1什么是 S-Function2024.1.1 S-Function的工作机制……∴…………∴2034.1.2 S-Function的几个重要概念2044.1.3编写 C MEX S-Function2074.1.4 Simulink引擎与 C S-Function的相互作用2114.1.5TLC文件…2184.1.6 LEVEL2M文件 S-Function介绍2214.1.7调用仿真模型外部的C代码和生成代码2304.2S- Function builder………………∴∴2334.2.1 S-Function名及参数名选项卡…2354.2.2初始化选项卡·鲁∴…2354.2.3数据属性面板2354.2.4库文件选项卡2374.2.5输出代码选项卡2394.2.6连续状态求导4.2.7离散状态更新∴………2424.2.8编译信息2434.2.9应用∴∴…∴∴…2444.3 Embedded matlab函数模块2454.3.1 Embedded matlab函数模块的生成方法……………………………………2464.3.2集成用户自定义的C代码∴2514.4实例……2524.4.1IIR滤波器…∴∴∴2524.4.2图像的相似度…2544.4.3 S-Function的参数设置与封装2574.4.4读取数据文件…261第5章嵌入式代码的快速生成…2655.1CCS介绍…2665.1.1反汇编窗口……2665.1.2链接命令文件…2665.1.3探针的设置……………268