Antkillerfarm Hacking V7.0

硬件杂谈(一)

2015-02-15

开篇的话

自从改行做起了驱动软件工程师,好多硬件的问题已经不再像当初那样,可以忽略不计了。于是就有了以下的心得。

0欧电阻的作用

在硬件原理图,特别是硬件草案的原理图中,常可看到0欧的电阻。0欧的电阻在效果上当然等同于导线,辛辛苦苦把它引出来焊上,究竟有何用处呢?硬件的同事告诉我,他们一般只在某些新添加的电路上使用这东西。一旦由于某些原因需要去掉新添加的电路的话,只要用电烙铁把电阻取下来就可以了,而不用再造一批测试版。

参考:

https://mp.weixin.qq.com/s/1DohVLPca8mj5sn4XL-u-g

0欧电阻、电感、磁珠单点接地时有什么区别?

空指针

空指针的概念,本来主要是个软件概念。上学的时候,教C语言的老师,就反复强调要检查空指针。

课本上给出的标准做法是:

1)声明一个指针变量,并初始化为NULL。

2)在程序执行过程中,指针被赋值为一个有某种含义的非空值。

3)使用该指针前,检查其是否是空指针。

这里就有疑问了。C语言中所谓的指针,保存的不过是个地址值。请看下面的例子:

int a[10];
int *p = a;

在这里p表示数组a的首地址,p+1表示a[1]的地址,那么p-1呢?在通常情况下,这也是个有意义的地址,只不过我们不知道它属于哪个变量罢了。所以课本中的做法的一个隐含的前提就是,NULL不属于任何变量。否则的话,对于以NULL开始的变量来说,检查空指针显然就毫无意义了。

对NULL的特殊性还有所怀疑的同学,可以试试往p-1中写数据和往NULL中写数据,看看在执行的时候,现象有什么不同。

从硬件的角度来说,32位的处理器有32位的地址总线,因此理论上说它的地址空间也是32位的。但是并非32位的地址都是有意义的。在一些嵌入式设备上,可能外设会占掉一部分地址空间,内存会占掉另一部分地址空间,其余的都是未定义的地址空间。向这些未定义的地址读写数据,会产生错误,通常的表现就是产生了一个异常或者中断。

在PC上,由于外设和内存有各自独立的地址空间,再加上虚拟内存的关系,这种未定义的地址空间是没有了,但是NULL开始的一段地址空间,会被定义为保护段,对其的读写同样会引发异常或者中断。(关于PC的结论,仅针对一般的用户态程序,内核态程序不适用。)

因此往NULL中读写数据的BUG,通常是比较好解决的。而往p-1中写数据的BUG,没有相当的技巧或工具的话,是很难解决的。

IRQ与FIQ的区别

IRQ(Interrupt Request):指中断模式。

FIQ(Fast Interrupt Request):指快速中断模式。

是ARM处理器的两种不同编程模式(ARM有7种处理模式)。

1、对FIQ你必须进快处理中断请求,并离开这个模式。

2、IRQ可以被FIQ所中断,但FIQ不能被IRQ所中断,在处理FIQ时必须要关闭中断。

3、FIQ的优先级比IRQ高。

4、FIQ模式下,比IRQ模式多了几个独立的寄存器。

不要小看这几个寄存器,ARM在编译的时候,如果你FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。

5、FIQ的中断向量地址在0x0000001C,而IRQ的在0x00000018。(也有的在FFFF001C以及FFFF0018)

写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。

6、IRQ和FIQ的响应延迟有区别

IRQ的响应并不及时,从Verilog仿真来看,IRQ会延迟几个指令周期才跳转到中断向量处,看起来像是在等预取的指令执行完。FIQ的响应不清楚,也许比IRQ快。

pin 1

一般的排线为了能够方便的识别pin 1,通常会在pin 1处标一个小三角,并且pin 1线的颜色也与其他的线不同。

单火线

最近研究智能家居,提到了单火线的概念,现简要描述如下:

这是一个接入电网的灯泡的原理图,图中的两根线,上面的是火线,下面的是零线。实际生活中的那些没有开关的插座灯泡就是以这样的方式接入电网的。

这是普通的开关灯泡的原理图。

这是单火线家居灯泡的原理图。从拓扑结构上来说,这个图和上一个图的结构是一样的。之所以画的时候故意弯曲了一下,是想表明一个事实:开关和灯泡之间有一定的距离。实际上对于一般的家居灯泡来说,零线、火线、开关和灯泡之间的线都是建筑商在建筑施工时,布设在墙体内部的。

那么问题就来了。由于开关和灯泡是串联的,当我们将传统的机械开关替换为智能开关的时候,由于开关本身没有和零线直接相连,因此当灯泡处于关闭状态的时候,开关本身也将无电可用。

解决的办法:

为开关再接一根线。

这就是所谓的零火线开关。但这样做的问题是,需要重新在墙体内走线布线,有比较大的施工量,对于已经入住的房屋来说,并不是太现实。这也是阻碍智能家居走进家庭的一个重要的技术问题。

单火线取电

通过加装电容等储电元件,可以给开关提供断电时的能源。但由于开关和灯泡是串联的,当灯泡本身的功耗较小时,储电元件的微小电流不仅会维持开关的工作,亦会点亮灯泡,造成灯泡在关闭状态下仍有微弱的光亮,即俗称的“鬼火”现象。这个在低功率的LED灯上,表现的十分明显。


https://kexue.fm/archives/9405

智能家居之热水器零冷水技术原理浅析

ISP与IAP

ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。

IAP(In-Application Programming)指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。

与ISP、IAP相对应的是早期单片机所使用的存储器烧写器,该方式需要从电路板取下存储芯片,安装到烧写器上烧写之后,再放回原电路板。这种传统的方式目前已经用的非常少了。

上拉电阻和下拉电阻

上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。

上拉是对器件输入电流,下拉是输出电流;强弱只是上拉电阻的阻值不同,没有什么严格区分;对于非集电极(或漏极)开路输出型电路(如普通门电路)提供电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

NOR Flash & NAND Flash

Flash按照内部存储结构不同,分为两种:NOR Flash和NAND Flash。

NOR Flash使用方便,易于连接,可以在芯片上直接运行代码(eXecute In Place),稳定性出色,传输速率高,在小容量时有很高的性价比,这使其很适合应于嵌入式系统中作为FLASH ROM。

在通信方式上NOR Flash分为两种类型:CFI Flash和SPI Flash。

NAND Flash强调更高的性能,更低的成本,更小的体积,更长的使用寿命。这使NAND Flash很擅于存储纯资料或数据等,在嵌入式系统中用来支持文件系统。NAND Flash存在坏块问题。

桀冈富士雄(Fujio Masuoka)1980年发明了NOR Flash,1986年又发明了NAND Flash。

三星最早提出Norless的概念,在它的CPU on die ROM中固话了NAND Flash的驱动,会把NAND flash的开始一小段拷贝到内存低端作为bootloader,这样昂贵的NOR Flash就被节省下来了,降低了手机主板成本和复杂度。渐渐NOR Flash在手机中慢慢消失了。

参考:

https://mp.weixin.qq.com/s/Coz81Zidz_LaSYkcErJsOQ

NAND Flash与NOR Flash究竟有何不同

https://zhuanlan.zhihu.com/p/26745577

NOR和NAND Flash

硬件调试器

Lauterbach TRACE32

TRACE32是我见过的功能最强的硬件调试器,没有之一。

它有两个系列:

PowerDebug:这个是简装版。功能大致和J-LINK差不多,但售价上千,差不多得是后者的十倍了。

PowerTrace:这个豪华版本,不但能调试,还能够记录运行期间执行的所有指令。这对于一些内存越界问题尤其好使,因为内存内容被改写,并不会导致程序立即崩溃。只有该内存再次被使用的时候,才会有异常发生,但这往往已经离破坏现场很远了。

PowerTrace唯一的缺点就是太贵了,得上万元。

SEGGER

SEGGER的硬件调试器也分了两个系列:

J-Link:简装版,只能用于调试。价格在百元左右,已经成为事实上的王者。破解降价什么的江湖传闻,看看就好,硬件想加密,办法多的是。这完全是SEGGER的市场策略吧了。

J-Trace:没用过,看说明应该和PowerTrace差不多。

https://www.cnblogs.com/neverguveip/p/9457261.html

浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别

https://blog.csdn.net/sunheshan/article/details/24535735

J-Link、J-Trace、Open JTAG区别

Open JTAG

开源的硬件调试器,但是由于需要自己找厂子做,所以价格上不可能比J-Link这种规模产品低,所以始终不温不火。

官网:

https://sourceforge.net/projects/openjtag/

ST-Link专门针对ST芯片而设计,包括ARM core以及非ARM core。

OpenOCD

OpenOCD(Open On-Chip Debugger)是一款开源软件,最初是Dominic Rath在大学期间发起的(2005年)项目。

https://zhuanlan.zhihu.com/p/41517198

跟我一起学OpenOCD

硬件爬坑记录

某次驱动死活跑不对,用示波器测量时钟信号,发现信号为三角锯齿波。初步怀疑是接上了电容后的信号。硬件工程师排查后,果然如此。


某型固件,没有打印函数,也没有断点调试工具。使用GPIO,到达程序某点之后,即改变当前的电平。然后在示波器上数电平翻转的次数,以确定程序执行到了哪里。


某芯片,外接4GB内存,运行正常。外接8GB内存,发生hung。最后发现,8GB内存需要更大的电流才能启动。因此,在此期间,芯片应该避免执行耗电的操作。

Fork me on GitHub