嵌入式控制系统设计/软件工具链
的维基教科书
嵌入式控制系统设计
|
本章介绍了一些软件工具,可以帮助系统开发人员。不仅在创建控制系统的软件方面,而且在整个 设计过程中,包括硬件和软件。
一个 集成开发环境 (IDE) 是帮助程序员开发软件(仅限软件!)的软件。IDE 通常包括一个 源代码编辑器、一个 编译器、一个 链接器/定位器 以及通常的 调试器。通常,还会包含各种简化代码构建的工具,例如 版本控制 支持,以及与可重复使用代码的软件框架的集成。有时,IDE 专注于一种特定的编程语言或一种(系列)特定的处理器或硬件(例如,用于对特定供应商的机器人进行编程的软件),但更多情况下,IDE 支持多种语言、处理器等。一些常用的嵌入式系统 IDE 有 GNU 编译器集合 (gcc)、Eclipse、Delphi、Kylix、KDevelop、Matlab、Microsoft Visual Studio、Netbeans、Powerbuilder、DevC++、Jdeveloper、IntelliJ 等。
该行业(不仅仅是嵌入式系统行业!)正在转向 开源 Eclipse 框架或 专有 Visual Studio。这两个 IDE 很可能在未来继续存在的原因是 报酬递增 的效应:一个 IDE 已经提供了组件工具之间的许多集成,更容易吸引更多用户,而更多用户则会吸引更多进一步的开发机会。(这种效应无论工具是开源还是专有都适用。)嵌入式 行业在很大程度上选择了 Eclipse。
源代码编辑器是一种专门用于编辑源代码以控制嵌入式系统的文本编辑器程序。它可以是一个独立的应用程序,也可以内置到集成开发环境 (IDE) 中。源代码编辑器可能具有专门设计用于简化和加速源代码输入的功能,例如语法高亮和自动完成功能。这些功能简化了代码开发。一些常用的嵌入式系统编辑器有 BBEdit(适用于 Mac)、Emacs(GNU)、Kate(KDE)、Microsoft Visual Studio(内置编辑器)和 Vi (vim)
编译器是一个将源代码翻译成计算机语言(目标代码)的计算机程序。通常,输出采用适合由其他程序处理的形式(例如,链接器),但也可能是一个人类可读的文本文件。编译器将源代码从高级语言翻译成低级语言(例如,汇编语言或机器语言)。想要翻译源代码的最常见原因是创建可以在计算机或嵌入式系统上执行的程序。如果源代码被编译以在与编译器运行平台不同的平台上运行,则编译器称为交叉编译器。对于嵌入式系统,编译器始终在另一个平台上运行,因此需要一个交叉编译器。交叉编译器是在无法或不方便在目标平台上编译的平台上使用的工具,例如运行内存量很小的微控制器。由于许多嵌入式系统资源有限,交叉编译非常常见。
编译器可能会执行以下操作中的许多或全部操作:词法分析、预处理、解析、语义分析、代码生成和代码优化。一些常用的嵌入式系统编译器有 GCC(GNU)、Visual C/C++、CPPBuilder(Delphi/Kylix)。
链接器或链接编辑器是一个程序,它接收由编译器生成的多个目标文件,并将它们组装成一个可执行程序或库,该程序或库稍后可以自链接。编译产生的所有目标文件都必须以特殊的方式组合,然后程序才能执行。目标文件本身是不完整的,最明显的是一些内部变量和函数引用尚未解析。链接器的作用是组合这些目标文件,并在该过程中解析所有未解析的符号。链接器可以从一个称为库的集合中获取目标文件。一些链接器不会将整个库包含在输出中。它们只会包含从其他目标文件或库中引用的符号。存在用于各种目的的库,通常默认情况下会链接一个或多个系统库。不幸的是,在嵌入式程序中使用标准库例程之前,通常需要对其进行一些更改。这里的问题是,大多数软件开发工具套件提供的标准库仅以目标文件形式提供。因此,您很少有机会访问库源代码以自己进行必要的更改。如果您没有在嵌入式系统上工作,那么您就完成了软件构建。对于嵌入式系统,除了一个方面之外,程序已经完成:代码和数据尚未分配内存地址。您必须提供有关目标板上内存的信息作为定位器的输入。定位器使用这些信息将物理内存地址分配给每个代码和数据部分。它将产生一个包含可以加载到目标 ROM 中的二进制映像的输出文件。一个常用的嵌入式系统链接器/定位器是ld(GNU)。
调试器是一个用于测试和调试其他程序的计算机程序。要检查的代码可以运行在指令集模拟器 (ISS) 上,这是一种技术,它在遇到特定条件时允许强大地停止,但通常比直接在相应处理器上执行代码要慢得多。当程序崩溃时,调试器会显示原始代码中的位置(如果它是源代码级调试器或符号调试器),这在集成开发环境中很常见。如果是低级调试器或机器语言调试器,它会显示反汇编中的行。通常,程序员使用单元测试器。这些测试器可以测试最小软件组件或模块。模拟器帮助程序员测试他们的软件,它使使用硬件在回路进行测试成为可能。模拟器模拟必须由嵌入式系统控制的系统。可以使用标准测试访问端口 (JTAG) 在嵌入式系统上调试软件。这些标准定义了一个 5 线串行协议,用于访问和控制数字电路引脚上的信号电平,并且具有一些扩展,用于测试芯片本身的内部电路。一些常用的嵌入式系统调试程序有 GDB(GNU)、Microsoft Visual Studio 调试器
程序员通常使用错误数据库。错误数据库程序可以创建包含所有错误及其描述的数据库。因此,同事可以轻松地找到有关错误的信息。他们不必浪费时间搜索错误解决方案,因为其他人已经解决了。一些错误数据库程序可以使工程师之间讨论错误成为可能。一个常用的程序是 Bugzilla。
版本控制是对同一信息单元的多个修订版本进行管理。它最常用于工程和软件开发,用于管理数字文档(如应用程序源代码和其他关键信息)的持续开发,这些信息可能由一个团队的人员共同处理。对这些文档的更改通过递增相关编号或字母代码(称为“修订号”)来识别,并将更改与进行更改的人员历史关联起来。人们越来越认识到,用于版本控制的软件工具对于几乎所有软件开发项目都是必要的。如今,大多数产品都是由多个组件组成的。为了了解构建产品时使用了哪个版本的每个组件,需要将所有信息保存在详细的数据库中。在未来,版本控制软件应该提供一项功能来跟踪特定版本产品的每个组件的所有版本。这将使以后更容易解决产品的问题。目前用于嵌入式系统的版本控制软件有 Concurrent Version System (CVS)、Subversion(CVS 的新版本)和 GNU arch。
过去,有一种趋势是将软件工具链的不同步骤集成到一个集成开发环境中。这种趋势仍在继续,IDE 中添加了越来越多的功能。未来的趋势是将软件开发与 计算机辅助工程 (CAE) 分析更加集成。例如:软件开发人员必须调整他们的软件代码,因为系统对控制的动态响应存在问题。在未来,动态响应的 CAE 模型和有限元分析将被固有地嵌入到软件设计中。
UML2、SysML、Marte、AADL
用于嵌入式系统开发的重要 MDE 项目包括:www.Topcased.org、www.openEmbedd.org 和 www.papyrusuml.org;这些项目正在合作实现更多互操作性。
- 计算机编程 讨论了通用编程(主要面向桌面和网络服务器计算机)。
- Eclipse 是一个流行的 IDE
- Revctrl : 版本控制维基 讨论并比较了各种版本控制系统。
- OpenJTAG 维基