几乎所有的电子设备都带有固件。我知道它存储在 ROM(只读存储器)中,因此它变得非易失性(不需要电源来保持内容不会像 RAM 那样被擦除)
我想知道的是“固件如何与电子设备通信以执行其操作?” 假设有一个小滚轮..按下按钮,它是如何移动的?有人可以解释一下背后的原因,以实现它..我认为可能需要一些简短的解释来解开它..
另外,用于编码固件的最流行的语言是什么?
几乎所有的电子设备都带有固件。我知道它存储在 ROM(只读存储器)中,因此它变得非易失性(不需要电源来保持内容不会像 RAM 那样被擦除)
我想知道的是“固件如何与电子设备通信以执行其操作?” 假设有一个小滚轮..按下按钮,它是如何移动的?有人可以解释一下背后的原因,以实现它..我认为可能需要一些简短的解释来解开它..
另外,用于编码固件的最流行的语言是什么?
像您所描述的现代硬件具有存储在 ROM 中的程序和执行该程序的通用微型计算机 (CPU)。
CPU 通过在其地址总线上设置地址然后要求 ROM 告诉它存储在该位置的值来从 ROM 读取信息。有一个类似于读取脉冲的东西(在单独的线上)来告诉 ROM 使值可以在数据总线的线上访问。简而言之,就是阅读。
为了让硬件做某事,CPU基本上执行一种写操作。它在地址总线上放置一个值,如果您想以这种方式查看它,这只是一堆位,以选择某个设备并可能在该设备上运行,然后它会引发另一条信号线,说“写!” 在地址总线上识别其地址的设备通过接受来自数据总线的数据然后执行其功能来响应该信号。通常,其中一个数据总线位将在输出设备内连接到功率输出级,即比仅用于计算的晶体管更强的晶体管,并且该晶体管会将某些电气设备连接到足以使其移动/发光的电流/任何。
小巧便宜的设备用汇编语言编码,以节省 ROM 的成本;在工业数量中,即使是少量的内存也会影响价格。汇编语言特定于 CPU;一些称为“8051”、“6502”和“Atmel (something or other)”的芯片很受欢迎。要求更复杂的大型设备可能会将其固件用 C 或类似 C 的方言编写,这使得编程比汇编程序更容易一些。大的甚至运行 C++ 代码。编译,当然。
在大多数系统中,都有用于 I/O 的特殊内存地址。对这些地址进行读写会执行一些功能,而不仅仅是移动数据。在 x86 系统中,还有专门的 I/O 指令 IN 和 OUT 。
最简单的情况称为通用并行 I/O (GPIO),您可以在其中直接从设备上的外部电气引脚读取或写入数据。有几个内存地址,称为寄存器,您可以在其中从端口读取数据(电压接近 0 = 0,接近电源电压 = 1),您可以在其中向端口写入数据,以及您可以在其中定义特定引脚是否为输入(对应的位通常为 0)或输出(位为 1)。每个微控制器都有 GPIO。
因此,在您的示例中,按钮可以连接到设置为输入的引脚,软件可以感知该引脚。它通常每 10 毫秒执行一次,并且只有在多次读取具有稳定值时才会做出反应,这称为去抖动。然后它会将 1 写入某个输出,该输出通过一些用于放大的晶体管可以驱动电机。如果它感应到您松开开关,它可以通过写入 0 再次关闭电机。依此类推,该程序将一直运行,直到您关闭设备。
还有许多用于其他目的的其他 I/O 设备,通常有数百个寄存器用于控制它们。如果您想了解更多信息,可以查看一些微控制器的数据表。例如,这里是ATtiny4/5/9/10 的数据表,这是来自 Atmel AVR 系列的一个非常小的控制器。
Today most firmware is written in C, except for the smallest devices and for a little special code for handling resets and interrupts, which is written in assembly language.