【PCB工艺】软件是如何控制硬件的发展过程

软件与硬件的关系密不可分,软件的需求不断推动硬件的发展,而硬件的进步又为软件创新提供了基础。

时光回溯到1854年,亨利·戈培尔发明了电灯泡(1879年,托马斯·阿尔瓦·爱迪生找到了更合适的材料研制出白炽灯。)

这是一个最简单的电路。

如果加上一个秒表来自动控制灯的亮灭,

设定 30 分钟自动控制点灯的亮灭,那么,这个 计时器 便是一个参数的程序。

接下来,这是一个钢片式八音盒:上发条后,八音盒便会沿着齿轮上设定好的轨迹自动演奏一段音乐。

不同簧片在不同时间拨动从而能够产生不同的频率与声音,在钢片上哪一个位置出现凸点是音乐内容的核心,在这里,我们将软件理解为用来操控各种固定的程序组合,用于控制硬件的动作顺序。 ------ 钢片是软件的储存介质,滚筒上的凸点设计就是设计师提前设定好的程序。------ 这便是软件和硬件之间的关系,软件既不是簧片,也不是滚筒上的凸点,而是凸点设计的位置 ,因为不同的位置会产生不同的音乐,位置信息既可以是有形的,也可以是无形的。虽然凸点位置明确的存在于三维空间(大家都看见了),但是具体要打在什么位置上,会产生什么样的音乐,这是一种无形的软件设计 。所以,我们可以看出,软件的本质是信息。软件必须依附于储存介质,必须依附于硬件,但它却是无形的存在 ------ 也就是信息本身的内容。就像看一篇文章:写在书本上的文字是软件的介质 (代码)------ 而小说的故事情节则是软件的信息(程序)。

软件就是信息。

接下来,我们重新回到电量电灯泡的例子当中,

我们使用一定的规律频繁的点亮和熄灭电灯泡从而传达了某种信息, 这便是电报的基本原理。类似敲门声的暗号,使用某种节奏和频率表达某种信息,这也是早期 实现信息传达的最基本的方法,最通用的是摩尔斯电码 ------ ...---...:表示求救信号SOS。

通过电灯泡的长按和短按,就可以向远处发送各种各样的信息。不过,在这个模型当中,软件信息仍旧存在于人的大脑之中,大脑会按照某种既定的规则来解释灯泡的亮灭背后所透露出来的信息。

那么,问题来了,我们发送信息总是需要频繁的点亮和熄灭灯泡,这样每次都需要人为进行操作和解译才能实现信息的发送和接收,有没有什么更好的办法自动发送信息呢?

有没有什么办法能像八音盒的装置那样按照一定的规律发送特定的信息呢?

于是,人们想到了用纸带打孔的方式:用纸做一条长长的纸带,在纸带上按照一定的规律打孔(用于记录电灯泡的亮灭),然后,把这些纸带放入一个自动收带的机器装置里(机器装置会记录和打印、发送纸带上的孔位上的信息),于是,这个机器上被设计了一个探针,每当纸带经过时,探针可以知道,纸带上有没有打孔。如果有孔,则点亮电灯泡,如果没孔,则熄灭电灯泡,纸带按照固定速度前进,探针就可以按照纸带上有没有孔来判断灯泡的亮灭,这样的话,我们就可以自动发送信息了。

其原理和八音盒相同,通过打孔纸带这一装置,就可以把人脑当中要发送的 "某些信息" 事先变成 "纸带的孔洞"。 这样,我们便能实现各种各样的信息发送和解译,而不需要人工时时刻刻都参与。这时候,纸带便成为了软件的储存介质 ,而纸带上孔的位置则是软件的信息 (程序),也即软件本身。

有了纸带这一方便的软件储存介质,,这个装置促进了计算器发展的历史。(历史渊源:1801 年,法国人约瑟夫·玛丽·雅卡尔(Joseph-Marie Jacquard)发明了"雅卡尔织布机",该织布机使用打孔卡(Punch Card)控制织布的图案,不同的孔洞排列决定了不同的花纹,类似于"程序化操作"。雅卡尔织布机是"程序控制"的最早应用,启发了后来的计算机存储技术。)



在最初的计算机上就使用了纸带,把事先要计算的数据通过在纸带上打孔,将这部分信息储存在纸带上,然后,把纸带放入传送装置,通过探针来读取纸带的数据,纸带上不仅要包括计算的数据,还要包括计算的方法,比如计算方式【加减乘除】【保留到小数点的后几位】【是否四舍五入】,这些,都要预先通过纸带进行设置,然后,计算机将计算的结果会通过另外一个打孔装置把计算结果打印到另外一条空白纸带上。通过读取纸带上孔的位置,就能得出计算结果。

通过"硬件"编程,实现了固定软件程序。

在这一时期,软件便十分显而易见了,那就是纸带上的打孔。开发人员的工作便是在纸带上打孔,通过打孔来设计软件。不同的打孔代表着不同的数据和信息,之后,随着信息技术的发展,储存介质也在不断改变和升级 ------ 从最初的纸带 ------> 磁带 ------> 硬盘 ------> flash闪存,储存介质越来越小巧、便捷、快速、容量也越来越高,目前,我们所使用的单片机软件就存储在 flash闪存 之中,但不管软件放在 何种介质当中,他们的基本原理都是相同的。

(打孔带的衰落)随着磁带、磁盘和半导体存储的发展,打孔带逐渐被淘汰。 1970s:磁带和软盘兴起,取代打孔带。 1980s:硬盘和半导体存储(RAM、ROM)普及,计算机不再依赖打孔带。 1990s 以后:CD-ROM、USB、云存储完全取代了打孔技术。 打孔带从 18 世纪的织布机到 20 世纪的计算机,见证了信息存储与自动化的演进。

(历史渊源:1890 年,美国统计学家赫尔曼·霍列瑞斯(Herman Hollerith)发明了"打孔卡系统",用于美国人口普查数据处理,后来,这种系统加快了数据处理速度,被广泛应用于政府和企业的数据存储。霍列瑞斯后来创办了公司,也就是这家公司 ------ 最终演变为 IBM(国际商业机器公司)。)打孔卡也因此成为早期数据存储的标准,推动了计算机的发展。

软件推动硬件发展的历史演变

软件的创新也决定了硬件的发展方向:

时代 软件需求 硬件发展 代表技术
1940s-1950s 最早的机器语言程序 电子管计算机 ENIAC、IBM 701
1960s-1970s 操作系统(Unix)、高级语言(C) 晶体管 & 集成电路计算机 IBM System/360、PDP-11
1980s-1990s 图形界面(GUI)、多任务 微处理器(x86)、GPU Intel 386、Windows 95
2000s-2010s 移动互联网、AI、云计算 多核 CPU、ARM 芯片 iPhone、NVIDIA CUDA
2020s-未来 AI 计算、量子计算、边缘计算 专用 AI 芯片、RISC-V Apple M1、NPU、量子计算机

打孔带的工作原理

我们通过追根溯源的方式,用纸带和打孔机作为示例说明是为了方便大家更为直观的理解这个过程。

打孔带是一种长纸带,上面打有孔,每个孔代表二进制数据(0 或 1)。 计算机可以实现计算,也能实现控制,我们把输出计算结果的打孔机换成其他的用电设备,就能实现对用电设备的控制(于是,我们用纸带来控制一组灯泡的亮灭):

打孔带的基本结构:

纸带通常是 5 孔、6 孔或 8 孔格式。

每一列孔代表一个字符,不同的孔排列表示不同的信息。

数据通过"打孔机"写入,通过"读卡机"读取。

  1. 数据输入:
    • 通过 键盘计算机程序 输入数据。
    • 早期的打孔机使用 手动机械键盘,每按一个键,就在纸带上打出对应的字符编码。
  2. 冲孔单元:
    • 机械或电磁装置根据输入数据 打孔。
    • 例如,字母 "A" 可能在 8 孔纸带上打出 "10000001"
  3. 纸带移动:
    • 每次打孔后,纸带会自动前进一列,为下一个字符准备。
  4. 输出纸带:
    • 纸带被打上完整的数据后,可以用于存储或输入到计算机中。

通过这个过程,打孔机能够将信息转换为 "可存储的物理编码"

格式 孔数 用途
5 孔 5 列孔 早期电报机(如 Baudot 码)
6 孔 6 列孔 早期计算机输入
7 孔 7 列孔 兼容 ASCII(少部分用)
8 孔 8 列孔 计算机数据存储(完整 ASCII 码)

我们可以看见,纸带上的每一格控制一盏灯泡,有孔则亮,无孔则灭,那如果灯泡的数量成千上万呢?这种方式则需要改进,否则很浪费纸带且不易存储数据。于是,人们想出了用地址来控制多组灯泡亮灭的方法:给16个灯泡编号,用4位的二进制数表示,

我们将 8 个位 定义为 一个字节 ,8个灯泡为一组,P0~P7,每一组由一个 8 位地址来进行表示,当我们需要控制某一组灯泡中的某个灯泡的时候,只需要给出两个字节的数组便可以了:第一个字节表示灯泡组所在的地址,第二个字节表示灯泡的状态。

以上表示第 0 组的 8 个灯泡当中的 1号灯泡点亮,其他 7 个灯泡熄灭,通过这种方法我们就能实现 16 格的纸带(2个字节共计16位的数据),于是 这16位的数据共计能够控制 2048 个灯,2^8 = 256 个地址,256(个地址) * 8(每个地址 8 个灯)= 2048 个灯。如果进一步扩展,将数据位扩大到 32 位,将一组可控制的 8 个灯,放大到一组 32 个灯。所以,我们可以通过 64 格纸带 来控制高达 1374 亿个灯。------ 而如果按照之前初始版本一对一的控制方法,64格 纸带只能共计控制 64 个灯。

使用 4个字节 的二进制数控制一千多亿数据量级的灯泡是没有必要的,但我们的目的是另一个方向 ------> 实现更为复杂的电路控制,我们把控制灯的电路改成控制IO端口输出,控制内部 RTC 走时,控制 ADC、MDA、串口485通信、CAN总线,通过控制芯片内部复杂电路的不同开关组合,可以达到对内部各种功能的开关、控制和设置,但无论多么复杂的功能,多么复杂的设置,它们的原理都和打孔带控制电灯泡的本质是一样的。电路当中的高电平、低电平 对应着 开和关的状态,同时对应着数据位的 1 和 0,1 和 0 组成字节,大量的字节按照一定的顺序排列,最终形成软件程序,与此同时,电路的升级不仅能让软件来控制硬件,还可以让硬件将数据输送回软件,也就是让外部的高低电平状态来决定储存介质上的 0 和 1 状态,比如,当某个 IO 端口输入高电平,在寄存器当中对应的某一位就会变为 1,输入和输出、控制和被控制,都是双向的。单片机程序只要读取这一位的 0/1 状态,就可以知道对应 IO端口的输入电平状态,理解至这一步,我们就已经大体知道了软硬件之间的联动关系。

软件=地址+状态 ------> 硬件。 其实,单片机的控制本质就是控制某个地址当中的某一位,单片机软件开发就是在不断的给出地址 和 地址当中 位 的状态, 让单片机在时间维度上产生变化的过程,比如,LED闪灯程序就是不断的循环给出LED所连接的IO端口的地址、以及输出电平的状态,除了IO端口之外,其他功能也是如此,只是IO端口理解起来更加直观,但它们的本质都是相通的,所以最终我们可以得出结论,软件就是通过地址 和 状态 来控制 硬件的开关状态,再把开关状态变为电平的输出状态,或者某个功能的设置状态,在时间上让不同地址当中的状态不断变化,这就是单片机在运行当中始终要做的工作,也是单片机开发最核心的本质。

例如,在单片机开发中的指令集架构(ISA)设计 :软件需要特定的指令集(如 x86、ARM、RISC-V),推动 CPU 结构优化。 驱动程序(Drivers)/ 操作系统 & 硬件驱动 :操作系统通过驱动程序直接控制硬件运行(如 GPU、存储设备)。操作系统(OS)优化 :新型操作系统(如 Android、iOS、Linux)要求硬件适应新的计算模式。 算法优化(AI & 数据计算) :软件算法(如 AI 深度学习)推动 GPU、NPU 发展。各种编程语言和框架:高级语言(如 Python、Rust)需要更强的计算能力,影响芯片架构。软件需求也同样决定了硬件的设计方向。

这便是单片机如何通过软件来控制硬件的原理和过程。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

相关推荐
阳光_你好9 分钟前
解决用git bash终端 tail -f 命令查看日志中文乱码问题
开发语言·git·bash
nlog3n10 分钟前
Java 原型模式 详解
java·开发语言·原型模式
能来帮帮蒟蒻吗1 小时前
Go语言学习(15)结构体标签与反射机制
开发语言·笔记·学习·golang
陈皮话梅糖@3 小时前
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
开发语言·javascript·flutter
hvinsion4 小时前
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理
开发语言·python·自动化·自动化任务管理
Aphelios3804 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
qq_529835355 小时前
装饰器模式:如何用Java打扮一个对象?
java·开发语言·装饰器模式
日暮南城故里5 小时前
Java学习------源码解析之StringBuilder
java·开发语言·学习·源码
Vitalia5 小时前
从零开始学Rust:枚举(enum)与模式匹配核心机制
开发语言·后端·rust
双叶8366 小时前
(C语言)虚数运算(结构体教程)(指针解法)(C语言教程)
c语言·开发语言·数据结构·c++·算法·microsoft