日常机器是如何编程的?

154

日常机器(不仅限于计算机和移动设备,还包括家用电器、数字手表等)如何进行编程?可口可乐自动售货机的编程中需要哪些代码?我的咖啡机如何接受预先编程的时间,在几个小时后开始冲一壶咖啡?

这些机器内部是否有操作系统,或者它们使用的是更基础的东西?它们是用汇编语言、C语言还是其他语言编写的?

我希望找到一些列出这些操作系统或基础代码系统的资源,如果可能的话,甚至可以提供源代码。如果有人知道这样的资源(我已经搜索过了,但没有找到),那将非常棒。


13
太棒的问题!我自己也一直在想同样的事情。 - Jonathan Sterling
7
请对“嵌入式系统”进行一些搜索/研究(我已经为您添加了标签)。 - mu is too short
关于关闭投票:我认为这个问题不适合发布在Programmers上,因为它是关于编程的。另一方面,由于电子行业更专业,它可能会更适合在电子SE网站上发表。当然,答案需要考虑以上所有因素。在得到一个答案之前,您需要选择一个较小的范畴。 - dmckee --- ex-moderator kitten
这是一个非常广泛的问题,涵盖了至少三个工程学科以及许多中间阶段。 - Jodrell
如果你感兴趣的话,可以尝试一下微控制器平台,比如Arduino(约30美元)http://www.arduino.cc/。 - steamer25
投票关闭,原因是过于宽泛。 - Ciro Santilli OurBigBook.com
13个回答

50
你所讲的大多是嵌入式系统,其中C语言可能不可用。这些软件通常不是像桌面或手机上运行的独立程序,特别是如果设计师选择使用被描述为“微控制器”的芯片。

大多数时间软件是用C或汇编语言编写的。C需要为该平台编写编译器(如果它不能很好地进行优化,则可能产生臃肿或低效的汇编代码),但简单的汇编只需将文本逐行转换为机器代码即可,并且易于编写。(如果供应商希望任何人购买他们的微控制器,他们将确保至少存在一个汇编程序使得开发具有吸引力,通常也包括C编译器,尽管有时不进行优化。)

您的咖啡壶和大多数类似的简单系统都没有操作系统。它们只是从内存中的起始地址加载,并在那里放置您的代码。通常,这些系统的“代码”被烧录到EEPROMS中,作为系统的硬盘驱动器。或者根据EEPROM / flash的类型,代码可以直接从flash中运行,而无需首先加载到RAM中。(设备可能无法写入其自己的闪存;这是通过外部工具完成的。编辑/编译/运行周期可能包括重新编程实际硬件的闪存,如果不在模拟器中进行测试。)

可口可乐机、路由器等通常使用实时操作系统,如QNX、EMBOS或有时是RTlinux(如果你很幸运)。这些大多是专有的操作系统,您需要支付大量的费用来获得许可,但它们具有C编译器、与硬件配合工作的驱动程序等。

http://www.qnx.com/

http://www.segger.com/cms/embos.html

http://www.microsoft.com/windowsembedded/en-us/campaigns/compact7/default.aspx?WT.srch=1&WT.mc_ID=SEARCH

RTLinux


38
人们用二进制编程?汇编语言程序员可以写出非常简单的代码,所以很难相信这种说法。您有这方面的来源吗? 此外,这个答案给人一种错误的印象,即所有系统都包含运行代码的微处理器。虽然随着微控制器和EEPROM价格的下降,这种情况变得越来越普遍(它使调试和升级更加容易),但对于非常便宜的系统或过去20年没有太大改变的系统来说,它仍然不值得使用,比如一些数码手表。 - BlueRaja - Danny Pflughoeft
6
这个说法有些过于强烈。你不必在目标设备上安装编译器,交叉编译在嵌入式编程中非常普遍。 - dmckee --- ex-moderator kitten
14
可乐机运行QNX?真的假的!这可不是普通的可乐!而且,目前正在批量发货的每个平台都有C编译器。没有人想写汇编语言,缺乏C编译器会造成很大的障碍。(当然,有些编译器确实不太好用。) - Potatoswatter
9
根据定义,EEPROM 可以重写 100000 次以上。只能写入一次的记忆体已经过时了;现今所有常见的微控制器都有闪存。FPGA 是完全不同的市场,与低端微控制器不可相提并论...你并不知道你在说什么。 - Potatoswatter
8
我有一个朋友在从事十分复杂的自动售货机工作。这些售货机配备了蜂窝通讯,可以监测库存、追踪温度、报告财务数据,并向服务器发送HTTP调用以汇总所有数据,使您可以跨越所有售货机进行追踪。而且,这些品牌的售货机都使用嵌入式操作系统。我认为他们正在使用C语言的RTLinux。因此,即使是那些低端的自动售货机也变得足够复杂,需要使用嵌入式操作系统。 - chubbsondubs
显示剩余4条评论

30

他们使用微控制器,其中经典型号为8051。这些核心为8位或16位,很少有操作系统。程序员编写代码来初始化板载外设并实现中断处理程序。语言使用汇编和C语言。对于困难的调试工作,需要使用在线仿真器。

除此之外,还有很多发展空间,有32位嵌入式核心(ARM是百磅大猩猩),可以引导嵌入式版本的Linux和/或Java JVM。


7
这是一只相当小的大猩猩,但我想在嵌入式大型灵长类动物中电力限制相当重要。;) - Piskvor left the building
谢谢!你的回答对我很有用,我已经给你点赞了。 - Josh Leitzel
ARM芯片也进入了低端市场...价格不到1美元,尺寸为2x2毫米。 - domen

25

这些是嵌入式系统,通常会使用诸如C或汇编之类的低级语言进行编程。一般情况下,这样的系统将在没有操作系统的情况下运行,尽管一些新型的“日常机器”(例如蓝光DVD播放器和无线路由器)确实会在Unix操作系统上运行它们的代码。


更新

正如其他人所说的那样,许多现代嵌入式系统也运行Windows的变种。这取决于应用程序。此外,在许多领域存在一种趋势,即在更强大的平台上运行具有操作系统的系统,以处理蓝光播放器需要运行Java和其他用户需要更多功能的情况。


6
也许是这样,但实际的玩家运行Linux并且用C/C++编写。 - Justin Ethier
@Andrew:蓝光中的Java解释器运行在哪个操作系统上?那个操作系统用什么语言编写的? - Gunther Piez
@dwelch - 很好的观点,可悲的是我曾在当地杂货店的一台机器上看到过蓝屏死机。 - Justin Ethier
@drhirsch...我只是说它不能独立运行。就像我之前所说的,我认为这是显而易见的,因为Java无法在低级解释器之上运行。@dwelch,这很有趣,因为Justin说他们运行Linux和BSOD仅存在于Windows世界中。 - Andrew Marshall
谢谢,我很高兴这个答案对你有帮助! - Justin Ethier
显示剩余4条评论

18

让我们想一想你桌面上的处理器。它所做的只是运行机器指令,本身并不关心“操作系统”或“程序”。

你打开电脑,处理器指向第一个指令,并开始执行。

在你的桌面上,它开始执行“操作系统”。但是,没有理由你不能让处理器执行任何你选择的指令集。(这可能不是非常有用,因为你仍然希望将结果输出到屏幕上,而该功能驻留在操作系统中。)同时,如果你的机器指令包含正确的操作码,以便处理器可以输出正确的信号序列在显示器上绘制一幅画,那就更好了。无需操作系统。

桌面计算机做了很多事情,我们通常需要一个操作系统来进行抽象。但在其核心,所有处理器所做的都是执行指令。

在可乐机和咖啡机中的处理器也是同样的道理。它所做的只是执行指令。

写机器指令的工作非常繁琐。因此,就像在桌面上一样,我们通常使用C语言编写代码,然后将其编译成机器代码。该机器代码加载到嵌入式处理器上并运行。

嵌入式系统做得很少,它们不需要全功能的操作系统。一个微控制器可能在芯片上有8或16个引脚 - 与常规CPU插座中的数十个引脚相比。

因此,工作流程是编写一些代码(例如,使用C语言),将其编译到桌面机器上。编译器为嵌入式芯片生成机器代码。然后将该代码加载到微处理器上(需要特殊的硬件来完成此操作)。然后给芯片供电,它就会开始执行指令。简单!


2
非常感谢!如果我可以选择另一个最佳答案,那一定是你的。我发现它非常有用。+1 - Josh Leitzel
现代处理器非常关注操作系统。它们提供了像内存管理单元特权指令和模式硬件虚拟化等功能。现代操作系统依赖于其中一些功能。这就是为什么你不能(轻松地)在小型微控制器上运行Linux的原因。 - Mira Weller

12
许多只执行特定功能的设备不包含任何“代码”。它们通过其电子组件的属性执行其功能。更先进的系统可以执行许多不同的功能或需要易于升级,将包含微控制器和某种“操作系统”。由于这些系统的功能仍然有一定的限制,因此操作系统将是简单而专门设计的。进一步发展,设备将包含类似计算机的东西。它将具有更复杂的操作系统,可以与系统的不同部分通信。最后,您将到达像智能手机这样的设备,它们包含完整的操作系统,可以运行用户级代码,并且比简单设备具有更多的用户输入。但是,即使是现代处理器本质上也是非常大的电路。 CPU识别的每个指令都会导致使用不同的电路来执行该功能。
以下是您可能感兴趣的一些维基百科页面:

http://en.wikipedia.org/wiki/Electrical_engineering
http://en.wikipedia.org/wiki/Integrated_circuits
http://en.wikipedia.org/wiki/Electronic_engineering
http://en.wikipedia.org/wiki/Computer_engineering
http://en.wikipedia.org/wiki/Microcontroller


这是错误的。低成本芯片成本的一个主要因素是携带硅的封装。因此,一旦达到几十个门或更多,用微控制器替换离散逻辑会更便宜...而且十几个门并没有什么作用。MCU的普及推高了离散门的成本,改变了平衡。此外,大多数低端MCU不运行任何类型的操作系统。 - Potatoswatter

7
低端微控制器通常不运行操作系统,这些微控制器被选择是因为成本低廉,而主要驱动成本的因素是芯片上的引脚数量(从十几个到几百个)和内部存储器的容量(从几千字节到一兆字节的只读存储器,从几个字节到几十千字节的随机存取存储器)。
当功能不断增加时,微波炉可能需要多任务处理。在这种情况下,程序员会回想起他们的操作系统课程,并根据需要实现消息传递、任务调度、异步I/O等!
当然,出于迅速、简单、代码大小等方面的考虑,功能往往以原始方式完成。通常这取决于你如何分析程序,以找到任务特定代码中的通用OS功能。但是从硬编码的任务调度程序到操作系统还有很长的路要走,当你只有几千字节可用时,现成的操作系统不是解决方案。

请查看DigiKey,这是一个流行的电子零件选择网站,可以了解低端MCU。这里是他们关于一款非常便宜的带有LCD控制器的MCU的信息,例如可能会在咖啡机中找到。很容易获得编程手册和其他资料。


7
这是一个非常广泛的问题,很大程度上取决于机器。我只能猜测大多数自动售货机由微控制器(8051、PIC、ARM7等)控制,很少有操作系统,如果有任何操作系统,那么它将是某种RTOS,例如FreeRTOS
更复杂的机器,如DVD/BluRay播放器或手机,则运行在复杂平台上,如OMAP4。通常使用Unix操作系统。

5

操作系统的工作是提供对共享资源(CPU执行时间、RAM、I/O等)的访问。大多数简单的基于微控制器的嵌入式系统一次只运行一个程序,并且它们自己访问(和管理)这些资源,因此它们不需要操作系统。

嵌入式系统通常使用C语言编程,有时为了极端的时间或内存优化而使用汇编语言。一些嵌入式编译器允许您在高级语言中插入汇编语言。


4

最近我遇到了一台运行Ubuntu的香烟自动售货机(由于机器正在重启,所以我看到了Ubuntu的标志)。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接