【嵌入式系统】
Soekris net4801,适用于网路应用程式
嵌入式系统（embedded system），是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。嵌入式系统常被用于高效控制许多常见设备，被嵌入的系统通常是包含数位硬件和机械部件的完整设备，例如汽车的防锁死煞车系统。相反，通用计算机如个人电脑则设计灵活，可以智能处理各式各样的运算情况，以满足广大终端用户不同的需要。
现代嵌入式系统通常是基于微控制器（如含集成内存和/或外设接口的中央处理单元）的，但在较复杂的系统中普通微处理器（使用外部存储芯片和外设接口电路）也很常见。通用型处理器、专门进行某类计算的处理器、为手持应用订制设计的处理器等，都可能应用到嵌入式系统。常见的专用处理器有数字信号处理器。
嵌入式系统的关键特性是处理特定的任务，因此工程师能对其进行优化，以降低产品的体积和成本，提升可靠性和性能。
嵌入式系统的物理形态包括便携设备如计步器、电子手表和MP3播放器，大型固定装置如交通灯、工厂控制器，大型复杂系统如混合动力汽车、磁共振成像设备、航空电子设备等。它们的复杂度低至单片机，高至大型底盘或外壳内安装有多个部件、外设和网络。
== 嵌入式系统实例 ==
嵌入式系统通常应用于消费类、烹饪、工业、自动化、医疗、商业及军事领域。
*电信系统
从网络级的电话交换机到手机终端都部署了大量嵌入式系统。
*消费类电子
包括PDA、MP3播放器、移动电话、游戏机、数字摄像机、DVD播放器、全球卫星定位系统接收器和打印机。
*家居应用
微波炉、洗衣机和洗碗机中采用了嵌入式系统，带来灵活性、效率和功能；高级暖通空调系统采用联网的恒温器更精确、高效的按天或季度控制温度；智能家居使用嵌入式设备进行感知、控制，通过有线和无线网络控制灯光、温湿度、安全、音视频、监控等。
*交通系统
安全要求相当高的飞机中采用了先进的航空电子设备，如惯性导航系统、全球卫星定位接收器；
各种电机——直流无刷电机、异步电机和直流电机中使用了电气/电子电机控制器；
汽车、电动车、混合动力汽车越来越多地采用嵌入式系统来节能减排；
其他汽车安全系统，包括防锁死煞车系统、电子稳定控制系统、Traction control system、自动四驱系统。
*医疗设备
使用嵌入式设备进行生命体征监测，电子听诊器放大声音，各种医疗成像系统（正电子发射计算机断层扫描、单光子发射计算机化断层显像、计算机断层扫描、核磁共振成像）进行非入侵式内部检查；
医疗设备内的嵌入式系统通常采用工业计算机。
嵌入式系统应用在交通、消防、安防、医疗和生命攸关系统中，由于这些系统能够与黑客等隔离，因而更可靠。在消防安全中，经过设计，系统能在高温环境下持续工作。出于安全需要，嵌入式系统可以自给自足，能够处理切断了电气和通信系统的情况。
WSN领域的发展，促使一种新型的微型无线设备智慧型微尘迅速普及。人们可以通过信息监测和控制系统感知并作用于物理世界的无数事物。微尘采用微制造技术，通过先进的IC设计技术，将无线子系统与尖端的传感器结合；从而让人们可以通过信息监测和控制系统感知并作用于物理世界的无数事物。这些微尘是完全自给自足的，在需要更换电池或充电前通常可以工作数年。
利用嵌入式Wi-Fi模块，原先利用串口进行通信的设备可以轻松启用无线通信功能。
== 历史 ==
MIT仪器研究室的查尔斯·斯塔克·德雷珀开发的阿波罗制导计算机是现代嵌入式系统的雏形之一。在项目初期，它被看成风险最高的部分，原因是为了减小尺寸和重量，它采用了当时最新研发的单片集成电路。
第一款大批量生产的嵌入式系统是1961年发布的民兵I导弹内的D-17自动制导计算机。当民兵II导弹在1966年开始生产的时候，D-17升级成一种新型计算机，其中首次大量使用了集成电路。仅这个项目就将反及闸模块的单价从1000美元降低至3美元，低到可用于商业产品。
由于二十世纪六十年代的这些早期应用，不仅嵌入式系统的价格降低了，同时处理能力和功能也获得了巨大的提高。以第一款单片机英特尔4004为例，它是为计算器和其他小型系统设计的，但仍然需要外部存储器和外围芯片。1978年，国家工程制造商协会发布了可编程单片机的“标准”，涵盖了几乎所有以计算机为基础的控制器，如单板机、数控设备，以及基于事件的控制器。
随着微控制器和微处理器的价格下降，消费品也可以更换掉基于按钮的模拟器件，如分压计和可变电容，采用微处理器读取开关或按钮信号。
到了二十世纪八十年代早期，存储器、输入输出部件集成到处理器内，产生了单片机。在采用通用计算机占用的成本太高昂的应用中，单片机取而代之。
较低成本的单片机编程后可取代很多独立部件，这种嵌入式系统通常比传统解决方案更复杂，但这些复杂性多数体现在单片机自身。嵌入式系统需要的外围元件很少，多数设计工作集中在软件，而软件原型的建立及测试与设计与建立新的不使用嵌入式处理器的电路相比速度更快。
== 特性 ==
区别于可以执行多重任务的通用型计算机，嵌入式系统是为某些特定任务而设计的。有些系统则必须满足实时性要求，以确保安全性和可用性；另一些系统则对性能要求很低甚至不要求性能，以简化硬件、降低成本。
嵌入式系统并不总是独立的设备。许多嵌入式系统由嵌入较大设备的小计算部件组成，提供较通用的功能。例如吉他机器人采用嵌入式系统来调弦，但总的来说它的设计目的绝不是调弦而是演奏音乐；车载电脑作为汽车的一个子系统存在，提供导航、控制、车况反馈等功能。
为嵌入式系统编写的程序称为固件，存储在只读存储器或闪存芯片内，运行在有限的硬件资源上：小容量内存，小键盘或屏幕甚至没有。
===用户界面===
嵌入式系统用户界面包括了从没有用户界面而只专注于单一任务、到类似于现代桌面操作系统的复杂图形用户界面的各类界面。
简单的嵌入式设备使用按钮、LED、图形或数字LCD和简单的菜单系统。
较高阶的嵌入式系统使用图形显示屏，配合触摸感应或屏边按钮使用，可使占用空间最小并提供灵活性：按钮的含义随屏幕显示的内容而改变，而且指向想要的选项进行操作就能实现选择。手持系统通常采用显示屏加操纵杆按钮作为触控装置。
有些系统通过序列埠（如RS-232、USB、I2C等）或网络连接远程提供用户界面。这种方式的优势在于：扩展了系统的性能、削减了显示屏的成本、简化了BSP，可以在PC上构建丰富的用户界面。例如运行在嵌入式设备平台（如IP摄像机或路由器）上的嵌入式网络服务器，它无需安装定制软件，而是在连到设备的PC端的网络浏览器中显示用户界面。
=== 嵌入式系统的处理器===
嵌入式处理器大概可分为两类。一类是普通微处理器：使用独立的集成电路存储器和外设。另一类是单片机：具有片上外设，降低了功耗、尺寸和成本。嵌入式系统的软件是为某种应用定制的，而不是像个人计算机那样的由终端用户安装的商品，因此可以使用各种不同的基本CPU架构：既有范纽曼型架构也有不同程度的哈佛结构；既有RISC也有非精简指令集处理器；字长从4位到64位甚至更高，当然最典型的仍然是8/16位。多数架构由几家不同的公司生产，使用了大量不同的变量和类型。
嵌入式系统也会使用通用型微处理器，但比单片机需要更多外围电路。
==== 嵌入式主板====
PC/104和PC/104+是小型、小批量嵌入式强固系统的标准之一，大多基于x86架构；通常比标准PC要小，而比多数简单的8/16位嵌入式系统要大；使用MSDOS、Linux、NetBSD，或实时嵌入式操作系统如MicroC/OS-II、QNX、VxWorks。有时这些主板也会使用非x86处理器。
在某些应用中，小巧、高效并非主要关注点，因而可以使用与x86型PC主板兼容的部件。VIA EPIA系列板卡则可以弥补这个空缺，它兼容PC但是高度集成、体积较小，或提供其他对嵌入式工程师很有吸引力的特性。这种方法的好处是低成本商品也可以使用通用的软件开发工具。用这种方法构建的系统仍然是嵌入式系统，因为它嵌入在较大的设备中、用于满足单一用途。例如ATM和电子游戏机，它们都包含了针对各自应用的代码。
多数嵌入式主板都不是围绕PC设计的，也不使用ISA或PCI总线。如果采用SoC处理器，用标准总线连接分立元件就不是上策，此外软硬件开发环境都可能会很不一样。
一种常用的设计模式是采用小型系统模块——也许只有商务卡片大小，容纳高密度的BGA芯片如ARM处理器和外设、用于存储的外部闪存、作为内存的DRAM。模块厂商通常会提供引导软件和操作系统选项，一般包括Linux和一些实时操作系统。这些模块由熟悉专业测试方法的组织大批量生产，配合较小批量的、带特殊应用外设的定制主板使用。
====ASIC和FPGA解决方案====
SoC是一种常见的为超大批量嵌入式系统设计的可配置阵列。它在单个芯片内包含了多处理器、乘法器、缓存和接口，形成一个完整的系统；通过专用集成电路或现场可编程门阵列来实现。
===外围设备===
嵌入式系统通过外设与外部通信：
* 序列埠：RS-232、RS-422、RS-485等
* 同步序列埠：I2C、SPI、ESSI等
* USB
* 多媒体卡：SD卡、CF卡等
* 网络：以太网、LonWorks等
* 现场总线：CAN总线、LIN总线、PROFIBUS等
* 定时器：PLL、捕获比较模块和时间处理单元
* 分立IO：GPIO
* 模拟-数位/数位-模拟转换(ADC/DAC)
* 调试接口：JTAG、ISP、ICSP、BDM端口、BITP、DP9端口等
=== 工具 ===
同典型的计算机程序员一样，嵌入式系统设计人员也使用编译器、连结器和调试器开发嵌入式系统软件。然而，他们也使用一些大多数程序员不熟悉的工具。
软件工具的来源有如下几种：
* 专注于嵌入式系统市场的软件公司
* 从GNU软件开发工具移植（参见交叉平台编译）
* 有些情况下，如果嵌入式处理器与普通个人计算机处理器很近似的话也可以使用个人计算机开发工具
嵌入式系统设计人员也使用一些不为普通计算机程序员所熟悉的软件工具：
* 一个常用工具是“电路内部仿真器”（ICE，in-circuit emulator）或者是最新设计中的嵌入式调试器。这个调试工具是开发嵌入式程序的基本技巧。它代替微处理器或者嵌入微处理器内部，提供了在系统中快速调用和调试试验代码的便捷工具。一个焊点通常就是一个插入系统的特殊电路，通常使用一台连结到这些焊点的个人计算机作为调试界面。
* 连结器通常是各种各样。对于大多数商业编程来说，连接器几乎是事后才考虑的部分，缺省设置也从来不变。与此相反，嵌入式连结器有完整、复杂的命令行语言是很普通的。经常有不同类型的内存，分别保存特殊的代码和数据。单独的数据结构能够放在特殊的地址，这样软件能够很方便地访问映射到内存的控制寄存器。嵌入式连结器经常有用于减小代码大小和运行时间的外部优化工具。例如，他们可能移动子程序的位置以使用较小的调用和跳转指令。它们经常带有管理data overlays和band switch技术的特性，这些技术是在嵌入式软件经常使用的扩展廉价CPU的方法。
* 另外一个常用的工具是一个在程序中添加代码和或者CRC的工具程序（经常是自己写的），使用这个工具嵌入式系统能够在执行程序之前先进行程序数据检查。
* 为数字信号处理开发软件的嵌入式程序员经常使用MathCad或者Mathematica这样的数学工具进行数学仿真。
* 一些较少使用的工具有将数据文件转换成代码的工具，使用这种工具就可以在程序中包含任意类型的数据。
* 少数一些项目为了特殊的可靠性或者数字信号处理要求使用同步式编程语言。
一些编程语言为嵌入式系统编程提供了一些特殊支持。
* 对于C语言，ISO/IEC TR 18037:2005定义了
** 指定的地址空间
** 指定的存储类
** 基本输入输出的硬件寻址
=== 调试 ===
调试通常使用内部电路仿真器或者其他一些能够在微控制器微码（microcode）内部产生中断的调试器。微码中断让调试器能够在只有CPU工作的硬件中进行操作，基于CPU的调试器能够从CPU的角度来测试和调试计算机的电路。PDP-11开创了这种特性的先河。
开发人员能够仍然使用断点、单步执行以及高级语言进行调试，在许多的调试工具上都有这种能力。另外开发人员在调试实时事件顺序的时候需要记录、使用简单的记录工具。
首先遇到这种问题的个人电脑和大型机程序员经常在设计优先级和可行方法的时候感到困惑。指导、代码审查和非个人风格（egoless）的编程是值得推荐的。
随着嵌入式系统变得越来越复杂，更高层次的工具和操作系统逐渐移植到可行的设备上。例如，蜂窝电话、个人数字助理和其他的消费用计算机需要一些从个人或者这些电子设备制造商之外的公司购买或者提供的一些重要软件。在这些系统中，需要如Linux、OSGi或者Java这样的开放编程环境，这样第三方软件提供上才能够在大规模的市场上销售软件。
大多数这样的开发环境都有一个运行在个人电脑上的参考设计，这种软件的绝大部分都可以在传统的个人电脑上开发。然而，从开放环境移植到专用的电子设备和电子设备的驱动程序开发通常仍然是传统的嵌入式系统软件工程师的工作。在有些情况下，the engineer works for the integrated circuit manufacturer, but there is still such a person somewhere.
=== 操作系统 ===
使用Windows XP的因特网收费电话
嵌入式系统经常没有操作系统、专用的嵌入式操作系统（经常是实时操作系统）或者指定程序员移植到这些新系统。
=== 启动 ===
嵌入式系统带有启动代码，通常它禁止中断、设置电子设备参数、测试计算机（RAM、CPU和软件），然后开始应用程序运行。许多嵌入式系统从短暂的掉电状态恢复，经常重起而不进行最近的自检。在十分之一秒内重启是常见的现象。
许多设计人员发现LED在指示错误状态上非常有用，它们可以帮助进行故障处理。一个常用的机制是在复位的时候点亮电子设备所有的LED以表明供电和LED正常工作；然后在进行加电自检时由软件改变LED的状态；在此之后，软件用这些LED指示操作过程中的正常或者故障状态。这可以让技术人员、工程师和用户了解系统的状态。一个有趣的例外是电度表（electric power meters）和其他一些大街上的东西，闪烁的指示灯是为了吸引注意力或者表示损坏状态。
==== 内部自检 ====
许多嵌入式系统都有一定程度或者一定数量的内部加电自检，自检有几种类型：
# 计算机检查：检查CPU、RAM和程序存储器。通常一加电就开始这些检查，在一些安全性非常重要的系统中，通常周期性地在安全时间间隔内进行自检，或者经过一段时间就进行自检。
# 外围设备检查：仿真输入和读入数据或者测量输出数据。有大量的通信、模拟和控制系统都有这些非常廉价的检查。
# 电源检查：通常测试每个供电电路，也可能检查电池或者主电源输入。通常供电部分的负载都很重，并且少有余量，所以这项检查很有意义。
# 通信检查：验证从相连单元接收到的简单消息，例如在互联网上使用ICMP消息“ping”。
# 电缆检查：将线连结到待检查的电缆上指示针进行检查。如电话这样的同步通信系统经常使用“同步”测试。电缆检查成本很低，当单元部分有插头的时候这项检查尤其重要。
# 装备检查：一个系统在安装时经常需要进行调整，这项检查就向安装人员做出状态指示。
# 消耗检查：检查系统所消耗的东西、在预量太低时发出警告。最常见的例子是汽车的油量表，最复杂的例子可能是维持化学反应物详细状态的自动医学分析系统。
# 运行检查：检查用户关心的系统运行状态。显然，在系统运行时必须进行这项检查，这方面的检查包括飞机上的导航仪器、汽车的速度表和磁盘的指示灯等。
# 安全检查：在'安全时限'内进行检查确保系统仍然可靠。安全时限通常小于能够产生损害的最小时间。
=== 可靠性体系 ===
根据人们需求的不同，可靠性也有不同的定义，有意思的是，可靠性的类型却相对较少，相似可靠性类型的系统，使用相似类型的内在检查和恢复方法：
# 系统非常不安全或者无法修理。这包括太空系统、水下电缆、导航灯塔、钻孔系统，非常奇怪的是还包括汽车和大规模生产产品。总的来说，嵌入式系统检测各个子系统、在线切换到冗余部分或者工作在“limp模式”提供部分的功能。大规模生产的消费产品如汽车、个人电脑或者打印机也属于这个类别，这是因为与购买的费用相比维修费用高昂、维修人员又路途遥远。
# 系统不能安全地停止运行。这包括飞机导航、反应控制系统、重要的化学工厂安全控制、铁路信号、单发动机飞机的发动机，如上所述，但是“limp模式”较难容忍，通常需要操作员选择备份系统。
# 系统停机时将会造成大量的金钱损失。这些包括电话交换机、工厂控制、桥梁和电梯控制、资金转移、市场开发、自动销售和服务等，这些系统通常有一些运转/不运转测试，它们通常带有在线冗余或者使用替换系统和人工过程的limp模式。
# 系统不安全的时候不能操作。同上面的情况类似，系统的运行将会造成大量的金钱损失。医疗设备、带有发动机这样的热备份的飞行器、化学工厂控制、自动股票交易、游戏系统等。测试可能是五花八门，但是出错时能够做的就是停止整个系统。
== 嵌入式软件架构的类型 ==
常用的嵌入式软件架构有几种不同的基本类型。
=== 控制回圈 ===
在这种设计中，软体有一个简单的循环，这个循环调用各个子程序，每个子程序管理硬体或者软体的某一部分。中断通常用来设置标记或者更新软体其他部分能够读取的暂存器。
系统使用简单的API来完成允许和禁止中断设置。如果处理得当的话，它能够在嵌套子程序中处理嵌套调用，在最外面的中断允许嵌套中恢复前面的中断状态。这种方法是实作Exokernel的一个最简单的方法。
通常在循环中有一些子程序使用周期性的即时中断控制一组软体定时器，当一个定时器时间到的时候就会执行相应的子程序或者设置相应的标志。
任何可能发生的硬体事件都应该有软体定时器的支持，硬体事件大概每万亿次出现一次错误，对于现代的硬体来说大概是一年发生一次，对于以百万计大规模生产的设备来说，遗漏一个软体软体定时器在商业上可能是灾难性的。
有时测试软体运行一组基于软体的安全定时器，它们周期性地复位硬体中的看门狗计时器。如果软体错过一个事件，安全定时器软体将会捕捉到它。如果安全定时器出错，看门狗硬体将会复位系统。
可以使用指向每个状态机函数的指标实作状态机，函数可以用C++、C或者组合语言等实作。变化的状态将不同的函数放到指标中，每次循环运行时都会执行函数指标。
许多设计人员建议每个循环读一次输入输出设备、并且保存得到的结果，这样可以保证逻辑过程的在一致的参数上运行。
许多设计人员喜欢将状态机设计成每个状态仅仅检查一到两项内容，通常是检查硬体事件和软体定时器。
设计人员建议多级状态机应该让低层状态机早于高层状态机运行，这样高层就能够根据正确的信息运行。
如内部燃烧控制这样的复杂功能通常根据多维表格进行处理，代码通常进行查表处理而不进行复杂的计算，为了减小表格的大小以及成本软体可以在条目之间进行差值运算。
在最小的微控制器中，尤其是只有128位元组堆叠的8051中，控制环允许好的链接器使用静态分配的数据覆盖本地变数。在这种机制中，离子程序调用树末端越近的变数得到的记忆体地址越高。当开始一个新的分支的时候，它的变数可以在以前分支遗弃的空间中进行重新分配。
简单控制回圈的一个主要缺点是它无法保证响应特定硬体事件的时间。
细心的设计可以很容易地保证中断不会被长时间禁止，这样中断代码就可以在非常精确的时间运行。
控制环的另外一个主要缺陷是增加新的特性的时候会变得复杂。需要花费很长时间的演算法必须小心地进行分解以使得每次只有一小部分在主循环中运行。
这种系统的优势是它的简单性，并且在很小的软体上，循环执行地很快几乎没有人关心它是不可预测的。
它的另外一个优势是这种系统保证运行软体的质量，无法将不好的运行结果归咎为其他的作业系统。
=== 非抢先式任务 ===
非抢先式任务系统非常类似于上面的系统，只是这个循环是隐藏在API中的。我们定义一系列的任务，每个任务获得自己的子程序栈；然后，当一个任务空闲的时候，它调用一个空闲子程序（通常调用“暂停”、“等候”、“交出（yield）”等等）。
带有类似属性的架构都带有一个事件队列，有一个循环根据队列列表中的一个域确定删除时间和调用子程序。
这种架构的优点和缺点都非常类似于控制环，只是这种方法添加新的软件更加简单，只需要简单地编写新的任务或者将它添加到队列解释器中。
=== 抢先式定时器 ===
使用上面的任何一种系统，但是添加一个按照定时器中断运行子程序的定时器系统，这样就给系统添加了崭新的能力，这样定时器子程序第一次能在一个有保证的时间内运行。
另外，代码第一次能够在非预期的时间访问自己的数据结构。定时器子程序必须要象中断子程序一样进行处理。
=== 抢先式任务 ===
使用上面的非抢先式任务系统，从一个抢先式定时器或者其他中断运行。
这样系统就突然变得很不一样了。任何一个任务的代码都有可能损害其他任务的数据&emdash;所以它们必须进行切缺的切分。对于共享数据的访问必须使用一些同步策略进行控制，如消息队列、信号灯或者非阻塞同步机制。
经常在这一步开发组织就会购买一套实时操作系统。如果一个组织缺少能够编写操作系统的人才或者操作系统将要在几个产品之上，这可能是一个明智的选择。这通常要将开发计划增加六到八周，and forever after programmers can blame delays on it.
=== 微内核与外内核 ===
这种方法试图将系统组织得比宏内核更易于配置，而同时提供类似的特点。
微内核是实时操作系统的一个逻辑发展，通常的组织方式是操作系统内核分配内存并且将CPU在不同的线程之间进行切换。用户模式的进程实现如文件系统、用户接口等主要的功能。
微内核在二十世纪五十年代开始首次尝试，但是由于计算机在任务间切换以及在任务间交换数据速度非常缓慢，所以人们放弃了微内核而钟情于MULTICS和UNIX风格的大内核。总体上来说，微内核在任务切换以及任务间通信速度快的时候是比较成功的，在速度慢的时候是失败的。
外内核通过使用普通的子程序调用获得的通信效率很高，硬件以及系统中的软件都是程序员能用也能扩展的。资源内核（可能是库的一部分）分配CPU时间、内存以及其他资源。如多任务、网络以及文件系统这样的大内核特性通过代码库来提供。库可以进行动态的连接、扩展或者共享。不同的应用甚至可以使用的不同的库，但是所有的资源都来自于资源内核。
=== 虚拟机 ===
一些航空电子系统使用几个商用计算机。这样更进一步，每个计算机都在模拟它们自身的几个副本，重要的程序同时在几个计算机上运行并且进行投票控制（vote）。
模拟环境的优点就是即使一个计算机出现故障，软件的不同例程能够迁移到正常工作的软件分区，表决的票数并不受影响。
通常虚拟软件运行在计算机的用户模式下，它捕捉、模拟硬件访问和不在用户模式下运行的指令。
=== 检查点计算 ===
另外一种常用的机制是两个计算机计算for a bit，然后将它们的计算结果报到那个点上。如果一个计算机的计算是nut，它就会被关闭。
=== 办公用（宏内核）操作系统 ===
这种系统通常在没有系统经费的嵌入式项目中流行，但是从这篇文章的多个作者来看，这通常是不正确的，它们的逻辑是：
* 操作系统是经过特殊封装的重用代码库。如果这些代码有用，设计人员就会节省时间和金钱，否则它们就是无用的。
* 商务系统的操作系统没有嵌入式硬件的接口。例如，如果要用Linux写一个马达控制器或者电话交换机，绝大部分的实际控制操作都是IOCTL调用，同时，正常的读、写和查询界面都是无用的。所以操作系统对于实际的开发妨碍很大。
* 大多数的嵌入式系统不处理办公事务，所以办公操作系统的大部分代码都被浪费了。例如，绝大多数的嵌入式系统从来都不使用文件系统或者屏幕，所以文件系统和图形用户界面部分就是浪费的，这些不用的代码只会影响系统的可靠性。
* 办公用操作系统保护硬件不让用户程序操作，这就严重地妨碍了嵌入式开发工作。
* 操作系统必须移植到嵌入式系统上，也就是说，硬件驱动程序无论如何都必须重写，这也是操作系统最难的部分，所以使用这样的操作系统几乎没有功效。
* 操作系统真正有用、可移植的特性是小段代码。例如，一个基本的TCP/IP接口大约有3000行代码，另外的一个例子是大约同样大小的简单文件系统。如果设计需要这些代码，能够使用少于嵌入式系统开发10%的经费就能完成，不需要支付版权费用，只需要简单地重写就可以了。如果系统这些代码有足够的通用性，嵌入式系统杂志封面的后面通常有公司销售没有版权费的C语言实现代码。
然而许多工程师并不认同这一点，嵌入式Linux越来越受到人们的欢迎，尤其是在无线路由器和全球定位系统这样的功能强大的嵌入式系统中。其中有下面一些原因：
* 有现成的移植到普通嵌入式芯片的实现代码。
* 它们允许重用公开获得的设备驱动程序、网页服务器、防火墙或者其他代码。
* 开发系统能够从许多特性组合开始，在发布的时候可以剔除不需要的功能，从而节约所消耗的内存。
* 许多工程师认为在用户模式运行应用程序更为可靠、更容易调试，所以开发过程更容易、代码更易于移植。
* 许多嵌入式系统没有控制系统那样对于实时性的严格要求，对于许多应用来说如嵌入式Linux这样的系统的响应速度就已经足够了。
* 要求更快的响应速度，而不是可靠性的特性，通常放到了硬件上。
* 许多实时操作系统都针对每件产品收取费用，当产品是消费品时，这项费用是巨大的。
=== Exotic custom操作系统 ===
一些系统需要安全、及时、可靠或者高效的特性，上面的架构却无法达到，构建这样的系统有一些广为人知的技巧：
* 雇佣一个真正的系统程序员。他们的花费很小，但是能够节约数年的调试以及相关的收入损失。
* RMA（rate monotonic analysis），可以用来评估一组任务能否在特定的硬件系统下运行，在最简单的形式下，设计人员保证最快完成的任务有最高的优先级，平均来说CPU至少有30%的空闲时间。
* 和谐的任务能够高效地优化CPU。基本上来说，设计人员保证每件工作都是从heartbeat timer开始工作的。在实时操作系统上很难这样做，因为它们在等候输入输出设备的时候通常就会切换任务。
* 刚好有两个优先级（通常是运行和禁止中断）的系统不能出现高优先级任务等候低优先级任务释放信号灯或者其他资源的优先级倒置问题，
* 有监视器（monitor）的系统不能出现死锁。监视器锁住一段代码禁止中断和其他抢先任务。如果这个监视器只用于一小段快速运行的代码，系统可能工作正常。如果能够证明监视器API在所有情况下都能够完整运行，例如仅仅禁止中断，那么就不会产生系统挂起的情况。
这就意味着使用两个优先级和监视器的系统是安全、可靠的，因为它们没有死锁和优先级倒置的问题。如果监视器能够执行到结束，那么就永远不会挂起。如果使用和谐的任务，可能还会相当高效。然而，RMA无法描述这些系统，优先级最好也不要到处都有，其中包括操作系统和硬件。