【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 孔格式。
每一列孔代表一个字符,不同的孔排列表示不同的信息。
数据通过“打孔机”写入,通过“读卡机”读取。
- 数据输入:
- 通过 键盘 或 计算机程序 输入数据。
- 早期的打孔机使用 手动机械键盘,每按一个键,就在纸带上打出对应的字符编码。
- 冲孔单元:
- 机械或电磁装置根据输入数据 打孔。
- 例如,字母 “A” 可能在 8 孔纸带上打出 “10000001”。
- 纸带移动:
- 每次打孔后,纸带会自动前进一列,为下一个字符准备。
- 输出纸带:
- 纸带被打上完整的数据后,可以用于存储或输入到计算机中。
通过这个过程,打孔机能够将信息转换为 “可存储的物理编码”。
| 格式 | 孔数 | 用途 |
|---|---|---|
| 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)需要更强的计算能力,影响芯片架构。软件需求也同样决定了硬件的设计方向。
这便是单片机如何通过软件来控制硬件的原理和过程。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【PCB工艺】软件是如何控制硬件的发展过程
软件与硬件的关系密不可分,软件的需求不断推动硬件的发展,而硬件的进步又为软件创新提供了基础。 时光回溯到1854年,亨利戈培尔发明了电灯泡(1879年,托马斯阿尔瓦爱迪生找到了更合适的材料研制出白炽灯。)…...
Javascript代码压缩混淆工具terser详解
原始的JavaScript代码在正式的服务器上,如果没有进行压缩,混淆,不仅加载速度比较慢,而且还存在安全和性能问题. 因此现在需要进行压缩,混淆处理. 处理方案简单描述一下: 1. 使用 terser 工具进行 安装 terser工具: # npm 安装 npm install terser --save-dev# 或使用 yarn 安…...
【教程】如何利用bbbrisk一步一步实现评分卡
利用bbbrisk一步一步实现评分卡 一、什么是评分卡1.1.什么是评分卡1.2.评分卡有哪些 二、评分卡怎么弄出来的2.1.如何制作评分卡2.2.制作评分卡的流程 三、变量的分箱3.1.数据介绍3.2.变量自动分箱3.3.变量的筛选 四、构建评分卡4.1.评分卡实现代码4.2.评分卡表4.3.阈值表与分数…...
RAG优化:python从零实现Proposition Chunking[命题分块]让 RAG不再“断章取义”,从此“言之有物”!
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 大家好,本篇要聊的是一个让 RAG不再“断章取义”的神奇技术——命…...
丝杆,同步带,链条选型(我要自学网)
这里的选型可以70%的正确率,正确率不高,但是选型速度会比较快。 1.丝杆选型 后面还有一堆计算公式,最终得出的结果是导程25,轴径25mm的丝杆。 丝杆选择长度时,还要注意细长比,长度/直径 一般为30到50。 2…...
【YOLO系列】基于YOLOv8的无人机野生动物检测
基于YOLOv8的无人机野生动物检测 1.前言 在野生动物保护、生态研究和环境监测领域,及时、准确地检测和识别野生动物对于保护生物多样性、预防人类与野生动物的冲突以及制定科学的保护策略至关重要。传统的野生动物监测方法通常依赖于地面巡逻、固定摄像头或无线传…...
一文详细讲解Python(详细版一篇学会Python基础和网络安全)
引言 在当今数字化时代,Python 作为一种简洁高效且功能强大的编程语言,广泛应用于各个领域,从数据科学、人工智能到网络安全等,都能看到 Python 的身影。而网络安全作为保障信息系统和数据安全的关键领域,其重要性不言…...
NFS 重传次数速率监控
这张图展示的是 NFS 重传次数速率监控,具体解释如下: 1. 指标含义 监控指标 node_nfs_rpc_retransmissions_total 统计 NFS(网络文件系统)通信中 RPC(远程过程调用)的重传次数,rate(node_nfs_…...
【Java】Hibernate的一级缓存
Session是有一个缓存, 又叫Hibernate的一级缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到Session缓存中,这个对象的引用就加入到了java的集合中,以后即使应用程序中的引用变量不再引用该对象,只要Session缓存不被清空&…...
学习笔记--(6)
import numpy as np import matplotlib.pyplot as plt from scipy.special import erfc# 设置参数 rho 0.7798 z0 4.25 # 确保使用大写 Z0,与定义一致def calculate_tau(z, z_prime, rho, s_values):return np.log(rho * z * z_prime * s_values / 2)# 定义 chi_…...
【QT5 网络编程示例】TCP 通信
文章目录 TCP 通信 TCP 通信 QT主要通过QTcpSocket 和 QTcpServer两个类实现服务器和客户端的TCP 通信。 QTcpSocket 是 Qt 提供的套接字类,看用于建立、管理和操作 TCP 连接。 常用方法 connectToHost(host, port):连接到指定服务器。disconnectFro…...
JWT在线解密/JWT在线解码 - 加菲工具
JWT在线解密/JWT在线解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.top 或者直接进入JWT 在线解密/解码 https://www.orcc.top/tools/jwt 进入功能页面 使用 输入对应的jwt内容,点击解码按钮即可...
【Linux】用户向硬件寄存器写入值过程理解
思考一下,当我们咋用户态向寄存器写入一个值,这个过程是怎么样的呢?以下是应用程序通过标准库函数(如 write()、ioctl() 或 mmap())向硬件寄存器写入值的详细过程,从用户空间到内核再到硬件的完整流程&…...
【Easylive】convertVideo2Ts 和 union 方法解析
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 这两个方法是 transferVideoFile 中用于视频文件处理的核心辅助方法,下面我将结合它们在 transferVideoFile 中的使用场景进行详细解释。 1. convertVideo2Ts 方法解析 方法签…...
飞桨PP系列新成员PP-DocLayout开源,版面检测加速大模型数据构建,超百页文档图像一秒搞定
背景介绍 文档版面区域检测技术通过精准识别并定位文档中的标题、文本块、表格等元素及其空间布局关系,为后续文本分析构建结构化上下文,是文档图像智能处理流程的核心前置环节。随着大语言模型、文档多模态及RAG(检索增强生成)等…...
Java 锁机制详解:用“厕所门”和“防盗门”轻松理解多线程同步
Java 锁机制详解:用“厕所门”和“防盗门”轻松理解多线程同步 目录 锁的作用synchronized 关键字ReentrantLockReadWriteLockStampedLock避免死锁的诀窍总结与对比 锁的作用 生活中的例子:公共厕所一次只能进一人,门上的“有人/无人”标志…...
关于修改 vue Element admin、若依, 等后台管理系统模板的一些全局样式问题:
关于修改 vue Element admin、若依, 等后台管理系统模板的一些全局样式问题: 1、修改左侧菜单和顶部(菜单)的背景色、把背景色改为炫酷的背景图。 1)上传图片 src/assets/images/menu-icon.png、 src/assets/images/…...
并发多线程八股
并发多线程 1.Java里面的线程和操作系统的线程一样吗?2.Java的线程安全在三个方面体现:3.保证数据一致性的方案4.线程创建的方式1)Thread类2)Runnable接口3)Callable接口和FutureTask4)线程池(e…...
飞速(FS)HPC无损组网:驱动AI高性能计算网络转型升级
案例亮点 部署低功耗、高密度飞速(FS)以太网交换机,紧凑机身设计节省70%机房空间,冗余电源和智能风扇确保系统高可用性,有效优化散热和降低能耗。 支持25G/40G/100G多速率自适应交换架构,构建超低时延企业…...
Nest.js学习路径
作为前端开发工程师,系统学习Nest.js可以从以下步骤入手,结合其模块化架构、依赖注入和TypeScript特性,逐步掌握核心功能。以下是结合多个资源的综合学习路径: 1. 环境搭建与项目初始化 安装CLI工具 使用Nest.js官方CLI快速生成项…...
git 常用操作整理
一.git 的概念 Git 是一个分布式版本控制系统,用于跟踪文件的更改历史,帮助开发者管理代码的版本。以下是关于 Git 的一些基本概念: 1. 仓库(Repository) - **本地仓库**:在你的计算机上存储的项目文件及…...
JAVA数据库增删改查
格式 Main.java(测试类) package com.example;import com.example.dao.UserDao; import com.example.model.User;public class Main {public static void main(String[] args) {UserDao userDao new UserDao();// 测试添加用户System.out.println(" 添加用户 ");Us…...
上海某海外视频平台Android高级工程师视频一面
问的问题比较细,有很多小细节在里面,平时真不一定会注意到,做一个备忘: 1.Object类里面有哪些方法? Object 类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写1. 常用方法 1…...
前后端数据序列化:从数组到字符串的旅程(附优化指南)
🌐 前后端数据序列化:从数组到字符串的旅程(附优化指南) 📜 背景:为何需要序列化? 在前后端分离架构中,复杂数据类型(如数组、对象)的传输常需序列化为字符…...
idea报错:程序包不存在
这里的程序包是我们项目里自己写的,idea却报错不存在。 解决方法: 参考这位大佬的方法,OK。...
【TVM教程】使用 TVMC Micro 执行微模型
Apache TVM是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者:Andrew Reusch, Mehrdad Hessar 本教程介绍如何用 C runtime 自动调优模型。 安装 microTVM Python 依赖项…...
spring boot 整合redis
1.在pom文件中添加spring-boot-starter-data-redis依赖启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.编写三个实体类 RedisHash("p…...
进程间信号
进程间信号 信号的认识信号的产生进程对信号的处理机制普通信号的处理机制实时信号的处理机制 信号集操作函数信号的捕捉 信号的认识 信号的概念: 信号是一种软件中断,它用于通知进程一个异步事件的发生。 这些事件可能来自系统内部(如硬…...
2011-2019年各省地方财政国债还本付息支出数据
2011-2019年各省地方财政国债还本付息支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政粮油物资储备管理等事务 4、范围:31省 5、指标说明:地方财政的国债…...
2025华为软件精英挑战赛2600w思路分享
这里写自定义目录标题 得分展示对象定义请求价值计算时间同步删除操作完整思路 得分展示 对象定义 // 将一个磁盘划分为多个基于标签聚合的区块 class Block{ public:int tag 0; // 区块标签int start_pos;int end_pos;int id;int use_size 0;int v;// 为区块确定范围Bloc…...
