操作系统
嵌入式系统往往不需要一个完整的操作系统。有的使用特制的小型和简单的操作系统,启动速度非常快,有的则根本不需要。嵌入式系统的适应性没有那么容易,但它们的构建可以更可靠地执行任务。因为硬件比较简单,所以它的制造成本往往也比较低,运行速度也比较快。
与此相反,一台通用计算机需要为新的设备驱动程序和软件做好准备,以运行它还不知道的硬件,如新的打印机或硬盘驱动器。它需要运行不同的应用程序。
随着嵌入式系统的规模越来越大,过去只有在通用计算机甚至大型机上才有的东西,现在在嵌入式系统上也变得很普遍。这包括受保护的内存空间,以及开放的编程环境,包括Linux、NetBSD等。
一些操作系统的例子,从简单到复杂。
- 简单控制循环--用一个定时器和一个循环反复调用不同的子程序。对于小型系统来说,这通常是由一个人制作的。
- 中断控制 - 任务由不同类型的事件启动。事件可以是定时的(例如,每十秒一次),也可以是通过按下按钮或接收数据来启动。
- 非先发制人的多任务处理--每个任务都会轮流运行,当它完成时,它会调用操作系统中的调度器来运行下一个任务。
- 先发制人的多任务或多线程 - 一个任务可以在一段时间后停止,让另一个任务运行一段时间。任何任务都不能霸占系统。在这个层次上,系统被认为有一个"操作系统"内核,可以并行运行任务。这种类型的操作系统通常是从只从事嵌入式操作系统的公司购买的。
实时操作系统包括MicroC/OS-II、Green Hills INTEGRITY、QNX或VxWorks等产品。与MacOS或Windows 7不同,这些操作系统并不为大多数人所熟知。但是在很多时间和安全非常重要的地方,都会用到它们。人们每天都在使用它们,却没有意识到这一点。
大型内核的常见例子是嵌入式Linux和Windows CE。虽然这些内核没有严格的实时系统所需的严格时间限制,但它们正变得越来越普遍,特别是对于更强大的设备,如无线路由器和GPS。它们允许重用设备驱动程序、Web服务器、防火墙和其他代码的公共领域的代码。更习惯于为PC编写应用程序的软件开发人员也会发现这一点更熟悉。如果需要,对于确实需要严格时间限制的事情,可以使用FPGA或其他特殊硬件。
工具类
与其他软件一样,嵌入式系统设计人员也使用编译器、汇编器和调试器来开发嵌入式系统软件。但是,他们也可能会使用一些比较特殊的工具。
- 对于使用数字信号处理的系统,开发人员可以使用MATLAB、MathCad或Mathematica等数学工具。
- 自定义编译器和链接器可用于改善特定硬件的优化。
- 一个嵌入式系统可能有自己的特殊语言或设计工具,或者在现有的语言中添加增强功能,比如Basic Stamp使用的语言。
调试工具。
- 线路内调试器(ICD),是一种通过JTAG接口与微处理器连接的硬件设备。当微处理器运行软件时,它可以从外部启动和停止微处理器。它还允许读取内存和寄存器,并在内存中存储软件程序。
- 使用日志或串行端口输出进行外部调试,以使用闪烁的监视器(printfs)跟踪操作。
- 交互式驻留调试--如果操作系统支持,这是嵌入式处理器上的一个shell,运行开发者输入的命令(例如Linux)。
- 在线仿真器取代了电路板上的微处理器,提供了对微处理器可以做的一切的完全控制。
- 一个完整的仿真器可以模拟硬件的所有功能,让所有的硬件都可以被控制和修改。硬件并不真正存在,但在普通的PC上有一个假装的版本("虚拟"机器)。
- 用逻辑分析仪或万用表检查外部线路。
除非受限于外部调试,程序员通常可以通过工具加载和运行软件,查看处理器中运行的代码,并启动或停止其运行。代码的视图可能是汇编代码或源代码。一些集成系统(如VxWorks或Green Hills)有特殊的功能,如跟踪软件运行时占用的空间、正在运行的任务以及事情发生的时间。
根据做的是什么样的嵌入式系统,会影响到它的调试方式。例如,调试一个单一的微处理器系统与调试一个同时在外设(DSP、FPGA、协处理器)上进行处理的系统是不同的。