Step to UEFI (233)屏幕分辨率研究

最近测试 (USH)UEFI Shell Helper 的时候发现一个奇怪的现象:直接启动内置的 Shell 时,会全屏打字显示;而启动 USH 上面的 Shell 后,显示字体非常小。具体照片如下,使用 HDMI 显示器,下图是正常情况:

下面是从 USH 启动后的照片,可以看到居中,字体非常小:

于是针对这个现象进行一番研究。首先,重新编译 BIOS ,替换它内置的 Shell.efi 为和 USH 相同的版本,测试显示仍然有这样的现象。之后,编译 DEBUG 版本的BIOS, 在串口 Log 中看到如下字样:

虽然没有找到直接证据,但是感觉上问题和当前屏幕分[......]

阅读全文

CH340 的替代者:CH343

南京沁恒的 CH340 是非常好用的USB 转串口芯片,在日常使用中完全可以替代FT232R。美中不足的是CH340 虽然在 Datasheet中标明可以支持2 000 000的高速波特率,但是在实际测试中这个波特率会有丢失数据的问题(该问题可以使用 LoopBack 的方式看到)。CH340C 和CH340B 同样都是内置晶振的,但是C 表现会比B 的好一点。我用逻辑分析仪确认过,问题发生在接收的时候,概率性丢失数据。理论上这种问题可以通过通讯协议来克服,但这样做会导致代码复杂性增高可靠性降低。

经过和沁恒的工程师交流,更新的 CH343(貌似是21年6月新出品的)能够支持200000[......]

阅读全文

CATERR 介绍

CATERR# 是 CPU 上的一个引脚,当CPU 有严重错误发生时,这个引脚会拉低(#表示低有效)。它在所有的Intel CPU 上都有。特别注意:这里是 OD 输出,是没法输出高电平,想要输出高电平,必须外部再接一个上拉电阻(pull-up resistor)。换句话说,如果测量这里为高或者低,务必记得在外面连接一个上拉电阻才能得到正确值【参考3】.

Intel 错误分类

首先是两大类:可以检测到的(Detected) 和 不可以检测到的(Undetected)。其中的 Undetected 是非常重要的,因为这种错误无法检测到的错误是没有办法捕捉到和处理的。进一步分为影响[......]

阅读全文

EDK2 202108 来了

edk2-stable202108 在  https://github.com/tianocore/edk2/releases/tag/edk2-stable202108

下载解压 stable202108.tar.gz 之后,尝试编译自带的模拟环境:

  1. edksetup.bat
  2. build -a X64 -p EmulatorPkg\EmulatorPkg.dsc

会遇到下面的错误

错误的原因是无法找到 Brotli相关的内容。解决方法是下载 submodule-MdeModulePkg-Library-BrotliCustomDecompressLib-b[......]

阅读全文

寄存器重命名(register renaming)

寄存器重命名是计算机CPU的微体系结构(Microarchitecture)中的一种技术,避免了机器指令或者微指令(μop)不必要的顺序化执行,从而提高了处理器的指令级并行的能力。【参考1】

例如:

mov eax, [mem1]
imul eax, 6
mov [mem2], eax
mov eax, [mem3]
add eax, 2
mov [mem4], eax

这段代码看起来是依赖于 EAX 的计算结果,但是如果将最后三条指令中的 EAX 替换为其他寄存器,就可以清楚的看到代码是在执行两个独立的操作:[MEM1]乘以6结果保存在[MEM2], 以及[MEM3]加上2之后存在[[......]

阅读全文

好用的 ESP32 DS1307 库

最近需要实验使用 DS1307 作为 RTC,惊奇的发现很多库都是为标准 Arduino 开发的,因此可能遇到使用 ESP32 不支持的寄存器,或者 TimeLib.h 没有定义的情况。

经过一段时间的探索,找到了来自下面这个网址的库

https://www.elecrow.com/wiki/index.php?title=Tiny_RTC

经过实验(在 DFRobot FireBeetle上),可以正常工作。

代码如下:

有需要的朋友可以在这里:

[......]

阅读全文

乱序执行 (out-of-order execution)

乱序执行(out-of-order execution)是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。比方Core乱序执行引擎说程序某一段有7条指令,此时CPU将根据各单元电路的空闲状态和各指令能否提前执行的具体情况分析后,将能提前执行的指令立即发送给相应电路执行。

这好比请A、B、C三个名人为晚会题写横幅“春节联欢晚会”六个大字,每人各写两个字。如果这时在一张大纸上按顺序由A写好"春节"后再交给B写"联欢",然后再由C写"晚会",那么这样在A写的时候,B和C必须等待,而在B写的时候C仍然要等待而A已经没事了。但如果采用三个人分别用三张纸同时写的做法[......]

阅读全文

CISC 和 RISC

计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。比如:日常生活中,“去吃饭”这样的命令可以看作是简单的指令。根据我的观察,男人和女人在指令集上是存在差别的。男人理解的指令集通常只是女人指令集的子集。譬如说,女人对于“洗衣服”指令的理解是包括“将衣物放入洗衣机启动洗涤”,“洗衣完成后晾衣服”以及“晾干后收起来”;但是对于男人来说“洗衣服”指令只是 “将衣物放入洗衣机启动洗涤” 的含义。

指令集[......]

阅读全文

FireBeetle USB KB/MS Shield

USB 键盘鼠标是最常见的输入设备了,之前如果想在 Arduino 上使用这两种设备,一个可行的方法是使用 USB Host Shield。这种方法的缺点是:成本比较高(MAX3421E芯片贵),操作复杂(SPI接口),资料少。因为这样缺点的存在,USB Host Shield 在使用上存在诸多不便。偶然间看到USB键鼠转串口通讯控制芯片CH9350(南京沁恒,WCH,阅读过我文章的朋友都知道CH340 也是他们家的产品)。这款能够将 USB 键盘鼠标的有效信息转为串口数据。芯片特点如下:

  • 支持12Mbps全速USB传输和1.5Mbps低速USB传输,兼容USB V2.0。
  • 上位机端USB[......]

    阅读全文