粉丝3555获赞3.1万

前面我们介绍了 cpu 的四个单元以及算数逻辑单元的设计和实现。今天我们来介绍计算器,最早的计算机 cpu 其实就是算数逻辑单元加计算器,就像今天我们要介绍的这个电路。我们先看看计算器,这里我们设计了八个计算器, 每个姬存器有十六位,这里我们先向八个姬存器中依次存入数字一到八,然后我们看看这个简单的 cpu 是如何工作的。我们的控制部分增加了两个读取姬存器的控制 rbrc, 一个写入计算器的控制 ra。 首先我们通过 rbrc 仪式读取一个计算器的数据,然后结果通过 ra 选择计算器将结果存入。我们来演示一下四加五是怎么运作的。 首先我们让二 b 读取纪存记五的数据数字五,二七读取纪存记四中的数据数字四,控制调整为零零零零,算数逻辑单元执行加法。然后将结 写入计算器零二 a 选择零零零,我们看一下计算器零中的数据已经变成了九,我们再来计算一下八减七,首先二 b 读取计算器八中的数据数字八,然后二七读取计算器七中的数据数字七, 控制状态调整为零零零一个数,逻辑单元执行减法。这次我们将结果写入第三个计算器,让我们看看第三个计算器中的数据已经变成了一。


这可能是全网最详细的计算机存储器的讲解视频,从计算机的固态硬盘、机械硬盘,再到内存,最后到 cpu 的 缓存、寄存器,全都给你讲的明明白白的。为了便于理解,我们先来看一下它们是如何协同工作的。当你使用电脑玩网络游戏时, 计算机首先会从机械硬盘或者固态硬盘读取游戏数据,这些数据接着会传到电脑的内存中、显卡的显存中以及 cpu 的 缓存中。 cpu 或者 gpu 会从这些存储中读取游戏数据,最终就会将游戏显示出来, 你也就能流畅的玩三 a 大 作了。这里有个问题,计算机为什么需要这么多的存储来层层处理数据呢?下面我们就一一来了解这些存储设备。我们先从固态硬盘开始, 这是一个二 t b 的 m v m e 固态硬盘,它上面有一个内存控制器,一个动态随机存储器以及两个闪存芯片。而我们的数据就是存储在闪存芯片里面的。 闪存芯片的内部分为八层,每一层都通过导线连接到了底部的基板上。我们单独看其中的一层,可以看到一个巨大的存储单元序列,它们被分成了横向四万列,纵向六万行,高达两百层。这种存储单元序列可以在比一厘米还小的体积内 存储超过一百 g b 的 数据,那它究竟是如何存储数据的?电赫井, 它通过捕获八种不同的电子量来存储数据,这八种电子量分别对应三位的二禁制数据,电子会被束缚在绝缘界质包围的电和井中,这使得数据无需外部电源也可以存储很多年。由于缺少直接的电连接,在写入数据或者读取数据时, 需要往电赫井内施加一系列复杂的电压来让电子发生量子四川,而这个过程大约需要几十微秒,这就导致内存的读取时间大约为八十微秒,而写入时间更是接近五百微秒,最大传输速度大概为每秒五 gb。 除了 m v m e 固态硬盘,还有一种撒塌固态硬盘, 它内部使用的存储芯片跟 m v m e 的 一样,成本也差不多。但是由于撒哈数据传输协议的限制,它的访问时间会比 m v m e 硬盘要长,速度只有每秒五百兆左右。说完固态硬盘,我们再来说机械硬盘。 机械硬盘的存储界只是四个磁场,你电脑上的数据就存储在每个磁场的五十万个同心圆上,这些同心圆也被称为磁道,如果将磁道放大,就能看到每个扇区。 扇区的前面是一个引导码,用于记录该扇区数据的长度。接着是一个地址码,它记录数据位于哪个磁道的哪个扇区。中间的这部分就是存储数据的地方,一般可存四 kb 大 小的数据。后面这个区域是一个纠错码,用于验证数据是否正确读写。除了 磁头 b, 磁头 b 分 为上下两部分,它的末端是一个滑块和一个读写头。 滑块通过特殊设计,可以捕获高速旋转的气流,并利用气流将读写头悬浮在离磁盘表面只有十五纳米的位置。硬盘在工作时, 磁头臂会在磁盘表面进行高速移动,从而进行数据的读写。这是如何做到的呢?当我们将扇区放大到纳米尺度时,可以看到,数据的读写其实是通过磁头磁化存储单元来实现的。 在写入不同数据时,存储单元的磁场方向会发生变化。在读取数据时,如果相邻的两个存储单元的磁场方向相反,就读取为一,如果方向相同,就读取为零。通过这种方式,数万亿比特的数据就能存储到磁盘上, 从而实现 t b 级别的容量存储。由于机械硬盘依赖磁头臂的快速移动以及盘片的高速旋转,因此机械硬盘的读写速度是比较慢的, 一般都在每秒二百多兆。但是不管是机械硬盘还是固态硬盘,它们的首要任务都是用尽可能低的成本提供最大的存储空间,因此速度就会大打折扣。而 c p u 的 核心目标是速度优先,用尽可能低的延迟执行更多的指令。比如 c p u 的 寄存器, 它的读取延迟只有一纳秒左右,读写速度甚至能达到每秒几 tb。 而目前最快的 mvme 固态硬盘读取速度也不过十几 gb, 每秒,延迟却高达几十到上百微秒,二者的延迟差距 最高甚至能达到十万倍。也就是说, cpu 可能已经把数据处理完了,而硬盘的数据还没送到。如果让 cpu 直接从硬盘读取数据, 那 cpu 绝大部分时间都只能停在那里,傻等,因此就需要使用内存来作为 cpu 和硬盘之间的高速缓冲区。比如你打开一个游戏时,游戏的地图、 模型、文理等数据就会被先加载进内存, cpu 使用时就会从内存进行读取,下面我们就来了解一下内存。一般来说,每个内存条上都 会有八个存储芯片,在主板上有专门的内存插槽,这些存储芯片会通过主板上的内存通道直接连接到 cpu, 并由 cpu 的 内存控制器进行管理。如果我们打开其中的一个存储芯片,可以看到 它有好几层组成,其中最重要的就是这个芯片核心,它被分成了三十二个独立的存储体,每个存储体由六万五千乘以八千个存储单元所组成。放大到微观结构,可以看到单个存储单元是长这样的。 每个存储单元由一个晶体管和一个电容器所组成。存储芯片通过电容器内部是否存储电压来读取不同的数据。比如将电容器充电到衣服 就代表二进置的一,如果放电到零伏就代表二进置的零。由于电容器的充放电速度极快,而且不需要像固态硬盘那样进行量子碎穿,因此内存的读取延迟能做到四十到一百纳秒左右, 而读取速度通常能达到每秒四十八 g b 以上,这种速度能让操作系统在不同的进程之间快速的切换上下文。虽然与 cpu 的 缓存相比,内存的速度还有很大的差距,但是这已经是目前最优的解决方案了。 需要注意的是,由于电容器物理尺寸的限制,内存芯片的存储单元通常被限制在了二维平面上,这就导致存储单元密度低,但是成本却非常高,因此内存往往比较贵。另外, 由于芯片是通过电容器存储电阻来读取不同数据的,因此每个存储单元都必须经常刷新,如果内存断电了,那么在十分之一秒内所 所有的数据都将会丢失。虽然使用了内存,但是内存读写速度和 cpu 运算速度之间依旧存在巨大的红沟。为了填平这道红沟, cpu 通过高速缓存和寄存器解决了这个问题。我们来看下 cpu 的 内部。 cpu 被分为了八个性能核心以及十六个能效核心,其中寄存器 l 一 和 l 二缓存就位于每个核心里面, l 三缓存则由所有的核心进行共享。 其中 ios 三缓存的容量最大,不过也仅仅只有几十兆。那寄存器和缓存是如何存储数据的呢?寄存器和缓存是由晶体管所构成, 通过不同数量的晶体管组合就能存储不同的数据。比如六个晶体管组合在一起就能存储一比特的数据,而数据的读写只需要不断地切换晶体管的开关就能完成。而晶体管的开关 其实是通过电信号控制的,它不需要像内存那样充放电和刷新电信号,能在不到一纳秒内完成开关的切换。这就使得缓存和寄存器的读写速度非常的快。其中寄存器的速度是最快的,读取的延迟时间往往在一纳秒左右,一二三级缓存的读取延迟要慢一点, 通常在一纳秒到几十纳秒之间。由于寄存器速度足够快,因此它往往位于算数逻辑单元旁边,以便为 cpu 及时提供运算数据。如果寄存器中没有 cpu 所需数据, cpu 就 会去一级缓存找,如果没有,就会去到二级缓存, 如果还没有,就会到三级缓存找,如果三级缓存依旧找,如果内存也没有,内存就会去硬盘找,找到后数据会被加载到内存中, 内存会将数据同步加载到 c p u 的 三级缓存中,最终 c p u 就 能拿到自己需要的数据了。这里有个问题,既然缓存和寄存器读写速度这么快,那为什么不将它们的容量做的像内存一样大呢?因为这样做会导致两个很严重的问题, 我们来看 c p u 的 缓存和寄存器,可以看到它们几乎占据了 c p u 的 三分之一的空间,如果继续将缓存和寄存器做大,那么芯片面积会暴增。 另外,制造缓存和寄存器的成本是内存的几十倍,如果将缓存和寄存器做到 e g b 的 容量,那么价格将会是天价, 这会远超一台电脑的成本。因此,计算机现在的存储架构都是通过很多年优化之后的结果,在整体架构没有实质性改变的情况下,这种架构依旧是当下技术条件里综合表现最均衡、效率最高的解决方案。

为什么有时候程序慢得像蜗牛?换个写法就快如闪电?今天带你认识 cpu 内部那个最重要的临时工寄存器。你的数据平时都住在内存里,就像放在城市边缘的大仓库,地方大但路远, cpu 干活时不可能每次都跑大老远去 仓库搬数据,那样会卡成 ppt。 它的工作流程很简单,第一步, cpu 把内存里的数字搬到寄存器。第二步,寄存器直接把数据位给计算单元 a、 l、 u, 瞬间算完。第三步,结果存回寄存器,再写回内存。 没有寄存器, cpu 每一步都得绕路去内存。给你看一个真实案例,假设你要计算一到一百万的和慢的写法,每次循环都直接操作全区变量编一器,没办法,每次都得从内存读写回内存, 一百万次循环就是一百万次内存访问。快的写法,先把全区变量读到局部变量里,循环里全用局部变量算,循环结束再把结果写回去。编一器会自动把局部变量放到寄存器里 实测差距。慢的写法跑完要两百毫秒,快的写法只要几毫秒,几十倍的性能差距。这就是懂不懂寄存器的区别。寄存器也分工种,通用寄存器像个万能工具箱,临时放啥都行,局部变量中间计算结果都临时搁这专用寄存器干专门活的。比如 pc 程序计数器记录下一条指令在哪,没有它, cpu 不知道下一步干啥。 sp 占指真记住函数调用怎么返回?调完函数回不来,程序就飞了。想写出高性能代码,记住这几点,一、多用局部变量,少绕全局变量,给编辑器优化留空间。二、 别迷信寄存器变量关键字 register, 现代定义器比你会优化。三、去了解一下 cpu 缓存和寄存器的关系,这是写出极致性能代码的分水岭。总的来说,寄存器就是 cpu 的 贴身秘书,没有它,再强的 cpu 也跑不起速度。懂底层才能写出真正的顶级代码。关注我,带你学习更多嵌入式干货!

很多人留言问我,有没有一本书能把计算机从头到尾讲清楚,又不堆砌术语,还特别直观,特别好读?我会直接推荐这本普林斯顿计算机公开课。它的作者布莱恩科尼汉是真正意义上的计算机界泰斗,曾任职于贝尔实验室,还是大名鼎鼎的 unix 系统的核心开发者。 一位祖师爷级别的大牛亲自下场给零基础小白写科普。他带你一步步从底层硬件比特地表示基础,跨越到软件、算法和互联网的运作要点, 从 c p u 架构、程序设计、操作系统这些核心逻辑,一路讲到人工智能、云计算、网络安全与隐私保护等前沿领域的认知方法。 所以你看到的绝不是零散的技术知识,而是一套完整的计算机认知图谱。处理器到底是什么?比特和字节是如何表示信息的?操作系统和应用程序该怎么对照?看 经典机器学习和深度神经网络的逻辑有什么不同?全书用专业的思维视角和直观实力讲解,把难懂的代码和硬件原理变成了可以直观理解的画面,甚至还用极简的方式带你体验了 python 和 javascript 的 运行逻辑。 你不需要懂专业术语,更多是被透彻的逻辑和真实案例。带着往前走,不管你是正在学习相关专业的学生,还是想系统了解计算机的职场人,这本源自常春藤名校的通识读物,都能帮你快速掌握计算机的核心知识点,强烈推荐!

cpu 内部架构与信号流转第一步,取指令程序器存放下一条指令的地址, pc 将地址通过内部总线传入地址寄存器, 埃尔的地址通过地址总线发送给存储器, 控制器根据地址取出指令数据通过外部总线送入缓存, 缓存将取出的指令送入指令寄存器保存。 第二步,指令密码,指令计算机中的指令操作码部分将送入指令密码器,密码器翻译指令后,操作控制器向全机发出指令执行的控制信号。 第三步,执行运算假设是一条加法指令,操作数已进入缓冲器第二中的操作数通过内部总线送入 i l u, 同时 i c 的 值也直接送入 i l u 进行计算, i l u 计算完成后,结果重新存回 i c, 同时更新状态寄存器, 随后程序计数器自动加一,准备读取下一条指令。至此,取指一码执行的详细信号流转工作流程讲解完毕。

二零二六年的四月啊,一个名为 cloud mesa's preview 的 ai 模型悄悄地从 asteroid 实验室里面诞生,刚一露面,就牵动了整个网络安全行业敏感的神经。那到底有多猛呢? mozilla 用它给 firefox 做安全审计, 一个浏览器就揪出了四百二十三个漏洞,其中有二百七十多个是他自己独立发现的。更重要的是,这款模型不只是纸上谈兵,在一百八十一次完整的漏洞利用测试当中,啊它全部成功,其中有二十九次甚至实现了寄存器的完全控制。 相比之下,他的前代模型欧普斯四点六在同样的测试下仅仅成功了两次。如果说这种公开测试只是小试牛刀,那么接下来麦克斯的大动作就让所有人大跌眼镜了。 在为期三十天的封闭测试当中,啊 astonopy 联合了全球大概五十家科技巨头,秘密启动了一个叫 glasswing 的 项目计划呢,用 mesos 对 超过一千个开源项目进行一次彻底的地毯式扫描,结果一口气挖出了两万三千多个漏洞, 其中六千多个被标记为高危或者是严重级别。这个效率呢,大概是国际顶级安全研究团队的一百倍,成本呢,可能只有万分之一。 这些漏洞呢,覆盖了市面上几乎所有的操作系统跟浏览器,甚至包括一些在重要系统中潜伏了长达十几二十多年的漏洞。 更可怕的是啊, mesos 它就像是一把双刃剑,不仅能发现漏洞,还能自主的编写攻击程序, 甚至能将多个低危漏洞啊串联成一个攻击链。这把剑的锋利程度让 osropik 自己都感到害怕,以至于他们做了一个前所未有的决定,暂时不向公众开放,只提供给少数核心的伙伴用于防御。 mesos 的 不公开决策背后啊,是 ansovac 对 ai 安全护栏技术的审慎探索。 ansovac 明确表示啊,当前不开放的核心原因是安全护栏尚未成熟,并且提出了三个必须满足开放的条件。 第一个就是漏洞修复的进程,全球关键技术设施当中的已知漏洞需要被大规模的修补,攻防能力差距呢,要显著的缩小。 第二呢,就是监管体系完善,需要建立可审计的权限管控机制和滥用监测的系统。 第三就是模型的安全优化,要通过技术手段降低模型的攻击能力,强化防御专用型。而 mesos 的 出现呢,也彻底撕下了安全行业的最后一块遮羞布。 曾经的零的漏洞啊,因为其稀缺性被所有的攻击者都视为是战略资源。如今在 ai 的 扫描下,漏洞从稀缺品变成了快消品。当发现漏洞成本接近于零的时候,整个行业多年建立起来的防御节奏跟价值体系可能就会被颠覆。对于全球的安全团队来说,压力的爆发才刚刚开始, 当 ai 发现漏洞的速度远远超过人工修复的速度时,这个行业的运行逻辑可能已经从根本上被推翻了。而对于安全厂商来说呢,当 ai 能以机器速度自主挖掘漏洞的时候呢?单纯卖特征库的时代可能真的要过去了。 原本网络安全行业的猫鼠游戏因为迈尔斯的出现,变成了一场神魔大战,但同时呢,他也给我们指明了未来的出路,就是必须要用 ai 来对抗 ai。 未来的防御体系必须全面的升级,传统的基于规则的识别跟防御模式啊,正在加速的失效,取而代之的将是基于大模型深度代码理解的智能分析。 在这场即将席卷全球的 ai 时代安全竞赛当中啊,胜负的天平将更多的偏向于谁先让 ai 成为自己坚硬的盾,而不是紧紧担心它何时会成为刺向自己的矛。 面对如此跨越式升级的能力,网络安全从业者们该如何应对呢?我是老林,关注我评论区聊聊吧!

什么是寄存器?它是藏在 cpu 内部的高速存储单元,也是决定 cpu 运算效率的核心硬件之一。很多人对它的认知停留在比内存快的模糊印象里。 今天我们会先讲清它的本质定位,再对比它和缓存内存的核心差异,最后拆解它的实际作用和对日常使用编程的影响, 哪怕没有硬件基础,也能完全理解。你可以把 cpu 当成一个炒菜的厨师,要处理的各种数据就是食材,内存就是离厨房很远的冷藏仓库,缓存就是厨房门口的储物架, 而寄存器就是厨师手边一字排开的备菜盘。寄存器的核心属性是速度,和 cpu 的 运算速度完全匹配。它的存储戒指用的是触发器, 只要通电就能一直保持数据不需要刷新,访问延迟不到一纳秒,完全跟得上 cpu 每一次计算的节奏。接下来,我们用三个维度把寄存器和缓存内存做直观对比, 你马上就能搞懂它的定位。第一个维度是容量,寄存器的容量极小,主流 cpu 的 寄存器总容量通常只有几 kb, 甚至不到一 kb。 比如六十四位 arm 架构 cpu 的 通用寄存器,总共才三十一个,每个只能存八字节数据, 加起来还不如一条长短信的容量大。第二个维度是速度,寄存器的访问速度是 l e 高速缓存的三到五倍,是内存的一百到一千倍。如果说从寄存器取数据,相当于厨师抬手从备菜盘拿菜, 从内存取数据,就相当于厨师开车去十公里外的仓库拉食材,等待时间差了几个数量级。第三个维度是成本,寄存器的单位容量成本是普通内存的几万倍, 因为它要做在 cpu 内部用的是最先进的制成,还需要占用大量的晶体管资源,这也是它不可能做大容量的核心原因。 寄存器按照用途可以分为三类,每一类都有固定的作用。第一类是通用寄存器,相当于没有固定用途的备菜盘,你可以放代运算的数字,也可以放运算出来的中间结果,还可以放数据在内存里的存储地址, cpu 可以 按需调用。 第二类是专用寄存器,它们只能用来完成特定的任务,最典型的就是程序计数器,它专门用来存下一条要执行的指令的地址。 cpu 每执行完一条指令,就会自动把程序计数器的数值加一,跳到下一条指令的位置, 相当于厨师手边的菜单,指征永远指向下一道要做的菜,还有占指征。寄存器也属于专用寄存器,它专门用来标记内存中占区域的顶部位置,每次函数调用参数传递都会用到。它 相当于专门放托盘的固定架子,永远指向最上面一个托盘的位置,保证拿放顺序不会乱。 第三类是控制寄存器,它们用来控制 cpu 的 运行状态,比如记录 cpu 当前是运行操作系统内核的高权限模式,还是运行普通应用的低权限模式,要不要响应外部的硬件中断,相当于厨房的总电闸、防火报警器,这类管控设备 直接决定整个厨房的运行规则。我们平时常说的三十二位 cpu、 六十四位 cpu, 本质上的核心差异就是通用寄存器的位宽 三十二位, cpu 的 寄存器一次最多能存三十二位,也就是四字节的数据。六十四位 cpu 的 寄存器一次能存六十四位,也就是八字节的数据,相当于备菜盘的大小翻了一倍,每次能处理的食材量直接翻倍, 运算效率自然更高。寄存器的速度优势在实际编程里也有非常直观的体现。比如你写一个 c 语言的函数, 前四个参数通常会直接放在寄存器里传递,不需要经过内存调用,速度特别快。如果参数超过四个,多出来的参数就只能放到内存的占区域里,传递 速度会下降百分之三十以上。这也是为什么很多性能优化规则里会提到,高频调用的小函数。尽量不要设置太多参数,就是为了尽量让所有参数都能通过寄存器传递,避免多余的内存访问开销。哪怕你不写代码,寄存器的特性也会影响你的日常使用。 比如你打开一个大型软件, cpu 需要频繁调用大量重复的运算逻辑,这时候如果常用的数据能放在寄存器里,软件的响应速度就会快很多,反之就会出现卡顿。最后,我们做一个核心总结,寄存器是 cpu 运算的第一站, 所有要参与运算的数据,要执行的指令,都必须先加载到寄存器里才能被 cpu 处理。 它相当于 cpu 和外部存储之间的第一个高速跳板,容量、位宽、数量直接决定了 cpu 的 基础运算效率。现在你在听到别人说寄存器的时候,就不会只知道它快, 而是能准确理解它在整个计算机存储体系里的定位,也能明白为什么它对性能的影响比内存硬盘大得多。

你打开 stm 三二 f 四高级定时器的数据手册三十八页,你花了一个月把每个计算器的位段背下来,然后你打开 stm 三二 cube max 鼠标,点击几下,全部生成。然后你打开 cloud code, 告诉他帮我配一个一千赫兹互补 pwm 带死区三十秒。 那一个月你到底学了什么?我做了十一年嵌入式,最近半年很多同学过来问我,嵌入式到底该怎么学?今天我把我的真实想法讲清楚, 可能跟你听过的大多数想法都不太一样。先说结论,配寄存器不是底层,你想想你在做什么?芯片厂的工程师,先用数字逻辑电路把一个定时器,一个 uart, 一个 iphonec 控制器设计出来,然后他们把这套电路里能调的开关做成一份让你照着填的配置表, 就是你看到的那几十上百个寄存器。你做的事是照着说明书把人家设计好的电路啊,配成你要的功能,这是使用,不是底层。 我也不是说寄存器一点价值没有啊。挑一两个外设,比如 youart, 把它的每一位为什么这么设计,对应到内部什么电路啊?为什么要有波特率发生器?为什么要有一位寄存器?为什么有发送缓冲和接收缓冲啊?彻底搞明白一次啊,绝对有必要,但你不需要把每个外设每个位段都啃一遍, 一个外设搞透了,剩下的都是变体。那省下来的时间应该干什么呢? c p u 和外设之间的总线是怎么走的? a h b 和 app 怎么仲裁的? d m a 怎么不经过 c p u 直接搬运数据? catch 一 致性是怎么回事?中断进来怎么压站? 编辑器怎么把 c 翻成会编啊,连接器怎么把一堆点文件接成一个能跑的镜像?这些东西才是底层。我刚毕业那会把数据手册当圣经看啊,前面的 cpu 那 个架构啊,总线时钟数,终端系统这些花时间看值, 但每个外设每个寄存器的位段啊,你都背一遍啊,怎么用啊,如何去配置?那部分时间真不如拿去学啊,链接器啊和啊,操作系统原理啊,编音原理啊这些知识,那应该怎么学?一句话,和我最近在讲的面向对象本质是一回事,学习的本质是抽象, 一个新的东西出现在你面前,脑子里第一句话不该是怎么用,应该是他在解决什么问题。举个例子,以太网为什么会出现?因为串口有几件事干不了,远距离传不动,一根线只能两个设备,通信贷款不够出错,没法自动重传,所以才有了一层一层的协议啊。 mac 层啊,负责封装和共享机制上的传输啊, ip 层呢,负责跨网络的选址,那 tcp 层呢,负责可靠传输和留控,每一层都在解决上一层解决不了的问题, 那工程上九层的场合,你知道这个分层关系就够了。你不需要背啊, mac 的 字断格式啊,不需要画 tcp 的 状态机,不需要理解庸色控制算法的细节, 等你真的有需要的时候再钻进去,那时候你已经知道为什么要钻。那再举一个例子,你们做单片机的时候肯定会遇到过,你想在屏幕上画一个按钮,那最原始的办法是什么呢?一个像素,一个像素自己画能做,但是那是地狱,所以才有了 l、 v、 g、 l、 q、 t 这些图形库。他们做的事是什么呢? 是把画像素这种低级问题抽象成,我要一个按钮,我要一个列表,我要一个动画,换块芯片啊,换种屏幕,换种触摸方案,同一份应用代码几乎不用改,那这些机制内部是怎么设计的?他们的接口为什么这样?切, 这些才是你真正值得学的东西。这就跟你开车一样,你开车需要懂发动机内部吗?四缸六缸的差别,点火持续啊, e、 c u 标定啊,离合器、刹车片怎么压,变速箱里面齿轮怎么咬合,你都不需要懂,但你能开, 这不是因为你水平差,是因为汽车工程师把这些复杂的东西封装进了方向盘,油门啊,刹车啊,这三个抽象,那软件工程其实是一模一样的。 但是你要小心,抽象不等于浅长则止,该钻穿的细节必须钻穿,指针怎么用?内存布局是什么样?链接脚本是怎么把段拼接起来的?中断进来上下文怎么保存啊?对战怎么增长啊?这些是地基学习这件事,有轻重缓急的, 地基要钻到底,上层建筑能用就行。很多人说 linux 难学,我跟你讲,它不是难,是你站错了角度。如果你站在 linux 内核的开发者的角度,你要把整套调度器、内存管理、文件系统、网路站全部都吃透,那的确难,全世界做到的也没有几个人。 但九成的应用场合,你是 linux 的 使用者,你写应用,你调驱动,你跑业务,那这时候你要懂的是什么呢? 是接口器约啊,文件系统给你的 open, read, write, close 这套接口,进程间通信给你的 pipe, socket, 内核给你的系统调用设备数给你的硬件长什么样?你不需要去读调度器的原版,你不需要去理解 icu 锁的实现,你不需要把内存管理的伙伴系统化。明白 一个好的技术从来不是让你的学习曲线变陡,是让你以更低的成本做出更复杂的事儿。 如果你今天觉着一个东西非常难,你先停一下,问一下自己,我是站在了使用者的位置,还是开发者的位置? ai 时代有句话,我特别认同你的能力要和 ai 形成夹角, ai 最强的地方不是你最该用力的地方,不然你就是在 ai 赛道上当人肉,对手赢不了, 要的是夹角,是合力, ai 干它擅长的,你干 ai 干不好的,两股力合在一起,你才能走得远。那我现在的日常开发呢?主要用 cloud code 啊,配一个外设,写一段驱动模板啊,查一份手册,生成一段样板代码,它比我快一百倍,这种活我再也不自己干了。那我的时间花在哪? 花在判断这个架构对不对啊?触向层次合不合理?这个接口三年后会不会有人让人骂街?这段代码合并进主干,会不会变成屎山?这些事 ai 现在还干不好,这才是工程师真正的护城河。但 ai 反过来其实也会害你, 如果你把思考也外包给他,你就完了。我给你两个数据啊。 mit 媒体实验室,二零二五年做过一个实验,五十四个人分三组写文章。纯靠脑子的啊,用谷歌搜索的,用 chat gpt 的 脑电图,全程测大脑活动,结果用 chat gpt 那 一组大脑神经连接最弱 三组里写出的文章被英语老师评价为缺乏灵魂,而且越用越习惯,靠 ai, 自己对作品的存有权感越低。那微软研究院啊,二零二五年另一份三百一十九个职场知识工作者的调研结论,一句话总结, 对 ai 信心越高的人,批判性思维下降越明显。而对自己技能信心越高的人,批判性思维反而保持的越好。这两份研究讲的是同一件事,费曼学习法的核心是你自己用自己的话把一件事重新讲一遍,讲不清楚说明你没真懂。 你可以让 ai 当你的费曼对象,当你的对话伙伴,当你随时回答的老师,但你不能让 ai 代替你的思考过程,这是你和 ai 之间最关键的一道边界。 如果你已经过了用的舒服这一关,想再往下扎,给你一条路啊,找一个你最熟的外设,比如 uart 啊,你别菜去配它。打开一块 fpg 开发版,用 vlog 自己写一个 uart 控制器。那一刻你会突然明白为什么有那个计算器,因为你需要一个地方让 cpu 把它的数据放进去。 为什么是那个时序?因为你要保证发送端和接收端的时钟在采用点对齐。为什么要分波特率发生器和一位寄存器?因为一个负责生成时钟节拍,一个负责把字节按位串出去。 这些原本对你像谜语一样的东西,会在你写出来的那一刻全部对上号,那一刻你才真正在底层。那更狠一点的,你可以找一份开源的 risk file 的, 实现自己跟着搭一个最小的 cpu 啊。当你让自己的 cpu 跑通一句 hello, world, 你 对计算机的系统的理解会比刷一万到八股文深一个数量级。这条路不是必经之路, 但走过的人跟没走过的人,能力上能形成代差,而这种代差, ai 替代不了,因为 ai 现在能帮你生成万了个代码, 但帮不了你建立我看穿一台计算机的那个直觉。最后一段,给所有正在最痛的几个月里的同学学新东西。前几个月最难,这是真的,不是你笨,是知识网还没建起来。 脑科学有个说法,新知识进入大脑,必须挂在已有的节点上,节点越少,挂不上去的就越多。于是你看什么都像天书,所以才有书读,百变,其意自见。这句话真不是什么神奇的玄学。 学习是限性的,你只能从前往后一句一句读。但知识本身不是限性的,它是一张网。所以你第一遍读前面有些点,你后面才理解。 等你读到后面,回头看到前面啊,前面的东西,突然就懂了。因为你前面读过那些点,慢慢长成了后面读的那些挂钩。等这张网密了,新知识一进来,立刻就有地方挂, 学的越快,这是真的,不是鸡汤。我现在学一个新东西,几乎不再有学不会那种感觉。 不是因为我聪明,是这张网我织了十一年。而且这张网不只是嵌入式知识本身,还有一些数学、电路、操作系统、计算机原理、编意原理。而算法,甚至生物学和脑科学,它们之间会互相借力, 一个跨学科的连接,往往比同领域多,读诗篇博课还要有用。所以如果你正卡在最冲的那几个月,别灰心,别让 ai 替你来思考。 定期把你学过的点,自己拿张纸笔连起来画一遍,画圈连线,找到它和别的知识有什么联系,然后再走下一步。这件事看起来慢,但它是复利。今天就讲到这,如果对你有用,发给身边在学建筑师的朋友,后续有时间学习方法,我专门讲讲。我是赵明,下次见。

很多人一提到存储,想到的是手机内存、电脑硬盘或者 e t 两 t 容量。但在 ai 服务器里,存储不是一个东西,而是一套分层系统。你只要记住一个规律,越靠近 gpu, 速度越快,价格越贵。 容量越小,越远离 gpu, 速度越慢,价格越低,容量越大。最靠近 gpu 的是寄存器和缓存,它们速度最快,但容量很小,主要服务芯片内部计算。再往下一层就是 hbm。 hbm 紧贴 gpu, 是 ai 服务器最关键的高带宽内存,负责把模型参数和数据快速送到 gpu。 再往下是 d r a m 系统内存,它容量更大,成本比 h b m 低,主要承担系统运行、数据调度和缓存。 再往下是 nv i s s d, 它负责存放、训练数据、模型、文件和日制,容量更大,但速度低于内存。最底层是 h d d 机械硬盘,它速度最慢,但成本最低,适合做冷数据备份和长期规划。所以, ai 存储不是简单地买更大硬盘, 而是要在速度、容量、成本之间作平衡。一句话总结, h b m 贵不是因为容量大,而是因为它离 g p u 最近,决定 g p u 能不能持续满负荷运转。

啊,什么是硬件寄存器?那么硬件寄存器呢,它是一种特殊的 啊,存储单元,主要用于存储和控制哎,硬件设备的状态和操作,那么寄存器它通常存储于位于我们的硬件设备的内部,我们通过访问这个硬件寄存器, 软件呢,是可以读取设备的状态和向设备发送命令。那么对硬件寄存器啊,有以下几种分类啊,第一个叫控制寄存器, 第二个叫状态寄存器,第三个叫数据寄存器。那么控制寄存器啊,顾名思义是用于控制硬件设备的这些呃,操作 啊,像我们开个灯,关个灯啊,对不对?这些都通过计算器来实现,那么状态计算器就是用来读取我们硬件设备当前所处的啊,状态有哪些?那么数据计算器呢,就是用来存储数据的啊,像,呃,从 硬件设备里面读取的数据可以存在数据计算器,或者像硬件设备写的数据可以写啊,这个也是需要这个数据计算器, 那么对于寄存器,在我们的接入系统里面,我们寄存器每个寄存器啊,它都有一个唯一的硬件地址啊,通过访问这个地址我们就可以找到这个寄存器。 那么对于计算机的访问,我们有两种方式啊,一种方式是通过我们 c 语言里面的指真啊来实现,另外一种呢,就是通过我们封装好的啊,通过 c 语言里面的结构体来实现我们对计算机的访问。好, ok。

今天正式吃透数据寄存器低,彻底告别只有通断的开关量逻辑,真正踏入数值运算、参数控制、数据处理的进阶功控编程阶段。学会递寄存器,才算从电工逻辑迈向自动化高级控制。 很多刚学 plc 的 朋友,前期一直在用 x 输入、 y 输出、 m 辅助继电器,只能做开关、启停、互锁、顺序控制这类简单逻辑只能控制设备开或关,但实际功控现场温度、压力、转速、流量、技术、时间、配方参数、 上下线报警全都是数字,这就必须用到 poc 里最重要的存储单元,数据寄存器 d。 什么是数据寄存器 d? 简单来说, d 就是 poc 里用来存放数字数值参数的专用内存盒子, 每个 d 都有独立编号, d、 零第一、第二、第三 d、 一 零零、 d、 五零零等。普通 d 寄存器十六位可存放零到三万两千七百六十七或正负数值, 两个 d 组合可做三十二位寄存器,存放更大数值程序可以随时读取且入修改运算对比里面的数字,实现复杂控制。 数据寄存器第三大核心用途,一、参数记忆保存断电不掉设备的设定、转速、运行频率、延时、时间保护、预 值、配方参数都可以存在地,机情调试好参数写入地后,即使 plc 断电重启,数据依然保留,不用每次开机重新设置,直接调用工业设备最常用。二、 实时采集存储处理传感器数据接近开关技术编码器、脉冲、温度变速器、压力传感器反馈的模拟量数值全部存入 d 级存器,把现场的物理信号转换成 p、 o、 c 能识别的数字,实现精准监测。 三、数据运算与逻辑对比,实现智能控制。这是 d 级存器最核心的价值,数值加减乘除累计计数大小对比大于小于等于 大于等于小于等于上下线报警温度大于上线触发报警低于下线。自动启动加热定量控制技术,达到设定值自动停机。有了数据对比设备才能实现自动调节、自动判断、自动保护,不再是简单的手动启停。 普通继电器和地级存器的本质区别, x、 y、 m 只能存零或一只,有通断两种状态做开关逻辑。地级存器可以存任意数字,做数据逻辑运算调节监控, 学会低寄存器,后续学习定时器、技术器、模拟量编程、通讯、 pid 调节、配方管理都会轻松很多。它是 plc 数据编程的基础核心,从今天起,跳出单纯的开关控制思维,建立数值控制思维,一步步向高级自动化工程师进阶。

嵌入式开发中,对于我们新手看到单片机手册中提到的寄存器地址,零 x 四零零幺零八零零这样一串数字是不是人都妈了?不用担心,接着往下看, 其实零 x 四零零幺零八零零是一个十六禁制数,其前缀零 x 是 c 语言中表示十六禁制的标准写法。对于 arm cortex m 内核的 mcu, 整个内存世界被划分成了几个大块,就像一个国家划分成了几个省, 零 x 四开头的地址就属于片上外设省,然后我们把整个片上外设省想象成一个巨大的城市,那不同的地址段就住着不同的外设家族。 我们逐位拆解给大家看。零 x 零零幺类比于省下面的城市,在 stm 三二中,通常指 a p b 二总线上的外设。零 x 零八零零类比于门牌号,指的是从 a p b 二起始地址零 x 四零零幺零零零开始的偏移量。 那零 x 零八零零的时进制是二零四八,就意味着这个外设的加是从 a p b 二起点向后数两千零四十八个字节的位置开始的。 如此拆解一番,你会发现单片机的寄存器地址根本没那么神秘,不过是芯片厂商给外设们规划的固定住址而已。 咱们新手不用被这串十六禁止数字吓住,把它当成找地址的门牌号,先看懂分区,再理清偏移,慢慢就会发现,再复杂的地址也能轻松拆解。

大家好,那么接下来的话再给大家讲一道有关于二零二六年啊软件评测师考试寄存器透明啊相关的一道题目,我们来看一下这道题的一个回忆版啊,了解一下这种题该怎么去分析。 那么在 cpu 的 寄存器当中,什么对用户是完全透明的啊?完全透明这块的话,首先大家要理解啊,它是一个专业术语, 也就是说整个过程当中啊,我们无论是啊,程序员也好,或其他任何人员也好,是无法通过一些指令呢直接访问的啊,也不能读取或者说修改这个硬件的部件,能明白吧?那么它的操作呢,是由 cpu 硬件自动来完成的啊,主要是指这个意思。 好,那么接下来的话,给大家分析一下每一个选项,你想选 a 选项的人也不少,对吧?他选的是程序计数器, 它呢一般是用于存放下一条即将执行的指令的地址,大家都知道对不对?那么虽然说啊,这个 pc 呢,会在我们指令呢顺序执行的时候呢,会自动地递增,对不对?但是程序员啊,它是可以通过一些 转移指令,你比方说进行一些跳转啊,或者说子程序的调用啊,这个时候呢,是可以来修改 pc 的 值的,从而呢来改变程序的一个执行的流程啊,所以这块的话,我们说它并不是完全透明的,能理解吧。 那么 b 选项说指令寄存器,那这个的话,我们知道它是用于暂存正在执行的指令的,我们知道指令呢,从这个内存中取出以后呢,会自动的存入到这个指令寄存器啊,供我们控制器呢进行移码和执行,那么整个过程的话是完全由硬件呢自动完成的, 那么程序员没有任何的那一些指令,可以直接去读取或修改我们这个指令计算机中的内容,所以说它对于我们来说是完全透明的,能明白吧,所以这个 b 选项的话,是我们的啊,正确的选项。 那么 c 的 话是状态计算器啊,它是用来保存一些算数逻辑运算的一些结果状态,你比方说有没有一些溢出啊,有没有一些进位标志啊等等,能明白吧。那么在执行条件啊,转移指令的时候呢, cpu 呢,会根据这些标志位的状态来决定是否跳转, 那么程序员编辑啊,这个程序呢,需要依赖并呢感知这些状态,所以它呢对这个用户是可见的啊,所以这块的话, c 选项肯定是不选的, 那么最后这个通用计算器就更是了啊,它的话是程序员在日常的编程还有会编中呢,最直接打交道的一个计算器,一般的话存放计算数据和一些地址啊,那么程序员就可以通过指令呢,随意的去读写它们,所以对用户来说的话是可见的, 能明白吧,所以这个低选项的话也不是透明的,所以在这块的话,我有两个事情要给大家说一下,第一个的话,他说的这个用户啊,主要指的是程序员,能理解吧,并不是我们常规意义上说的客户啊,或者说使用这个我们开发的一个软件的人员, 你想一想,这个 cpu 啊或计算器这块的话,它的用户,其实,呃,最本质上的话,指的其实还是程序员啊,或者说软件工程师这一块的,能明白吧,不要被这个用户呢误导了啊,其实就是使用的人员啊,其实更多的指的是编程人员啊,那么另外的话,我们这块的话,这个 呃指令寄存器啊,说了是完全透明的,那么除此之外还有其他完全透明的一些啊,寄存器嘛,大家可以记一下, 另外的话,像这个控制器的地址寄存器也就这样说的, m a r 还有控制器数据寄存器,就是 m d r 这块的话,也是那比较典型的对用户呢透明的寄存器啊。这个题的话,其实考的还是 呃相对来说比较深的,那么这些年的话,基本上没考过啊,最起码这十年啊,没有出过相关的题目啊,他其实更多意义上的话,在程序员考试或者说软件设计师考试这里面的话,是经常会出题的,所以今年的话拿过来了,那么相对来说是比较偏的, 大家不小心在这块呢,如果丢了一分,其实也是情有可原的,但是呢,既然考过了,那么以后的话,这道题大家就要记下来,能明白吧,避免呢以后再问类似的一个这样的题目,但是我觉得呀,他 近些年考过一次后,后些年的话考的可能性就不会特别大了,但是还是建议大家记一下,避免的话,他在这个上面再给他呢重复出题 好了。以上的话就是有关于这种题目的一个分析,希望呢能够给大家呢带来一些帮助,最后的话,也预祝各位呢,能够取得一个好的成绩。

你敢信吗? ai 现在能直接读 mcu 硬件寄存器了?这个盒子叫 aix pro, 是 个开源无线调制器,连上 wifi 就 能让 ai 通过它来操作。开发版来演示, 看到了吗? ai 准确地读取到了 mcu 的 寄存器值, 一条命令, ai 就 能连上你的板子,这东西完全开源,自己就能复刻。想看怎么实现的,关注我,下期讲。


四个新手学 plc 常用的储存区你都知道吗?记住就能用。一、输入区, i 区,只读不写,读输入按钮的信号。二、输出区 q 区,只写不读控制接触器的线圈和电磁阀等。 三、中间寄存器 m 区,程序内部用存状态。四、定时器 t 区和计数器 c 区, t 区记时间, c 区记次数。一句话,什么数据放什么区设备才稳定才好维护。今天你学会了吗?

大家好,我是家电清洗老杨,相信很多同行都遇到过这种崩溃,刚做完挂机,又过来跪机, u r 的 书发按键、扫描、 flash 存储, 这些两个月前刚写过的东西,又得重写一遍。不是代码难写,而是三次的代码根本拿不出来。计算机硬编,在业务里模块藕合拆不开,关键逻辑在五六个文件里找出来的时间比重写还长。 今天用五分钟时间,结合空调磁带讲托代码服用的五条盒,服用的五条盒,让你下次做项目直接帮代码少熬一半夜。 分层架构,服用地基是初分边界,很多人以为服用就是把重复代码写成函数,复制粘贴,但停留在函数层面,服用半径最多几十行。一个项目把 s 三二换成 g d 三二, 函数里那行控制风机引角的代码直接让你前功尽弃。真正能跨空调项目的费用是从分层开始,合格的空调工程师要切成三层, 而且严格遵守只能从上往下调有的规则。最底层硬件层直观计算器和引脚操作,中间驱动层面向风机温度传感器这些抽象概念,就上层应用这些空调业务逻辑,比如温度高于二十六度,启动压缩机, 我当年踩过致命坑,第一个项目赶进度,直接在调温函数里硬编码了压缩机。后来换板子,引脚从 p b 四改成 pc 五,我翻遍整个工程,改了十几处,还漏了一处,导致压缩机一直不启动,排查了一整天。 如果做好分层换引角,只需要改硬件层的一行映色,上层所有代码不用动核,分层的核心就是把硬件变化锁在最底层。 二、硬件出现让代码不必一颗芯片锁死。很多人做硬件出现就是在原厂库上再包一层函数, 改个名叫卖 u r 的 帧就完事了,这种包了等于没包的封装,换芯片还得钱改。 真正的出现是让上层根本不知道底层用的是什么芯片。就拿空调里的最常用的创口来说, 错误的写法是函数参数里直接带 s t m 上 u r 的 tab 锯饼换 g t 三啊就得改的调用。正确的做法是出现出创口设备概念,上层只知道打开发收, 至于底层是哪个芯片,哪个外设,只有底层知道。我现在创口驱动换芯片只需要写一份,底层实现三层的协议解析,遥控通信代码一行都不用动。 还有一个关键,把所有硬件相关的材料全放在一个多的配置文件里,打开,关机引脚,创口、拨动力,传感器, adc 通道, 钱写在这里,宽板子只需要替换这个文件里的驱动代码,一点都不用改。我判断出项是否到位的标准其实很简单,前局收 stm 三二, gd 三二,如果出现驱动程以外, 就是出现漏了。三、模块化设计一个模块只干一件事,分层解决了谁调用谁模块化解决了一个模块该装什么。判断一个模块合不合格,就看能不能用一句话理清它的功能,如果必须用以及 还有那个模块就超载了,得拆。就拿空调按键模块来说,合格的描述是扫描按键产生,按下长按事件, 不合格的是扫描按键消抖、切换菜单,控制风机。这是三个模块的活,混在一起了,按键模块根本不知道菜单是什么,他只负责告诉上层哪个键被按下了。至于这个按键是调温还是切换模式,那是应用层的事。 我见过最离谱的按键模块,里面竟然写了压缩机控制逻辑,后来加长按关机功能时,差点把压缩机启停逻辑改崩, 拆成独立模块后加新功能,只需要改应用层根本碰不到按键核心代码。还有空调里天天用的环形缓冲区别用前驱变量到处读写,封装成通用结构,由艾特日制传感器各实力划一个, 一次写好,所有项目都能用,是可一次性,别让编辑器和资产毁了复用。前面讲的都是架构设计,但还有一个很隐蔽的坑,编辑器和硬件平台的差异。一段在 s t m 十二跑的好好的代码 搬到其他芯片上可能直接崩掉,原因就是你默认了很多,恰巧在当前平台上成立了假设。这里有三条铁律必须遵守,第一,不绝对不能用 int, 让这种长度不确定的类型 用 int 类型在可特斯 m 四四级也没有问题,但换到某些八位芯片上就变成两字节, 温度超过三二七六七就会溢出,导致空调乱调温。正确做法是有呃 study unit 八, unit 十六长度固定。第二,不要有假设字结合对齐 拆解空调节通信协议时,别直接把缓冲区指正强转成结构体,还得严格对齐,在 ccsm 上直接触发 hotfoot。 正确的做法是逐个字节组装数据。第三,条件编辑不要散装在各个文件里, 别在这里加个衣服,那个里加个衣服,最后代码变成一团乱麻,条件面应该集中在最底层的一字文件里,上层代码根本看不到这些。红五克制,不是所有东西都值得出现。 讲到这里,可能有人想把空调里所有代码都出现一遍,但记住,过度出现比没有出现更糟糕。我见过有人为了控制一个电源指示灯, 搞了三层函数调用,点一下一个灯要调四层,出问题时调试都找不到地方。还有人把简单的 led 闪烁 设计成可配置周期占空比回调的通用模块,结果配置下比实现代码还长。 但这个晚上用一个红色指示灯,只需要亮和灭两种状态。这种为了敷用而敷用,纯粹是自己给自己找麻烦。我判断是否值得出现的标准很简单, 他至少要在第三个空调项目里被原样调用,第一次写实线功能,第二次改改适配,第三次能直接拿来用,这时候再出现也不迟。另外,别重复照轮子 free r t o s 的 任务调度 delete fresh 读写,这已经被几千个量产产品打磨过了,谁能用别人的就别自己写。最后总结,为什么换一个空调项目 uart 按键 fresh 重写一遍, 不是因为这些东西难,而是上一次写的东西根本没把下次要拿,又放进设计目标里。代码附用不是什么高深技巧,而是一种工程习惯,在分层出现模块化、可一致性上多花一点时间。 再加一份刻字,不要为不需要的灵活性增加复杂度。第一次写的时候要看起来慢一点,但你写下去的不再只是一个人跑的代码,而是一份可以反复用的资产。 下次再做空调项目,你会发现别人还在从头写驱动,你改改配置就能跑通。