一下内容出自知乎话题
历史上有哪些发明到后来脱离了发明者的初衷?原文地址
我来说个电子电路方面的,JTAG
这货设计出来是通过边界扫描测试电路板的连通性用的,可以简单理解成硬件Debug,比如电路板上的芯片引脚有没有焊好,有没有虚焊脱焊之类,或者PCB在制造过程中有没有断线短路,诸如此类。。。
原理也很简单,通过一个外接接口(就是JTAG啦)把电路板上所有支持这个功能芯片全部串接起来,然后朝这些芯片发指令,比如两个芯片有引脚是连起来的,发指令让一个芯片把引脚置高/低电平,让另一个芯片把那几个引脚的电平状态通过JTAG接口传过来,检测是不是和发送的一致,如果一致就表示电路板上的互联没问题;或者直接通过JTAG把接口置高/低后,看看电路板上其他部分电路的行为是不是和预期一样,比如有没有一个小灯亮起来。
但是呢,这东西虽然已经成为了一个IEEE标准,使用率却不高,原因大致上分为两类
1. 随着计算机视觉的发展,现在电路板在PCB制作完成以后、锡浆印刷之后和组装焊接成PCBA以后,都会通过AOI(自动光学检测)与AXI(自动X射线检测)进行测试,来检出PCB制造缺陷,SMT打件缺陷,以及焊接不良的问题,而JTAG只能检测有JTAG接口芯片的之间的连接问题,只是电路板上互联的一部分,检出以后还要人工判断到底是打件、焊接还是PCB制造的问题。
2. JTAG还有个问题,就是默认往引脚上施加的都是直流电平信号,而且JTAG本质上是个串行接口,受限于JTAG接口本身的速度,即使反复改写引脚电平值,芯片引脚的输出频率也不可能太高,一般1Mbps就已经很不错了,而且大部分外设芯片是没有JTAG接口的,需要使用各种总线进行测试,但即使不管时钟速度问题,要使用JTAG测试,还要手写JTAG指令来模拟各种总线,累死人的好吧。并且现在的高速电路板,尤其在开发过程中,最重要的测试就是各种互联实际传输信号的最高频率和误码率,你JTAG只能测试直流信号,那怎么行~所以现在对于微控制器、FPGA之类的可编程器件,基本上都是自己撸一个测试模式出来,专门测试板子上的DDR、SDIO、LVDS、CAN、I2C等各类总线互联,这样既可以使用开发时用的库和IP核,又可以用实际运行速度跑各种总线。
不行不行,费了那么大劲开发出来的接口,还被IEEE接纳为标准,结果使用率那么低可怎么说的过去?来来来,让我们把时间倒回51、AVR、PIC横行天下的年代,当时各个厂商都有自己的单片机,以及对应特定型号的一套下载协议、调试协议,以及对应的编程器、仿真器。由于这些协议都是私有的,很少公开,而且这些工具的开发工作量大,销量少,所以那个时代的编程器和仿真器往往都非常贵。
后来,有一家公司(atmel?)突然想到,这个JTAG接口连外部引脚电平都能改写,那写个内部Flash问题应该不大吧?读写寄存器就更没问题了吧?这样一来,就用JTAG协议来下载程序和调试程序不就好了?通用性多强啊,开发工作量也小,只要把JTAG接口搞进芯片里,什么芯片都能用,各种工具也有成熟的方案,完美~
再后来,到了ARM时代,JTAG接口已经成了所有ARM核微控制器的标配,大家都已经习惯了把一个J-Link或者别的什么Link插到JTAG接口上,所有ARM核芯片的程序下载和程序Debug全部搞定,妈妈再也不用担心我换一个型号就要花个万把块钱买个仿真器啦,做嵌入式开发的都没人知道JTAG接口一开始是干什么的了。。。
于是,一个本来是用于硬件Debug的接口,就这样开开心心的变成了人民群众喜闻乐见的软件Debug接口~