前方遇到硬钉子
——顽石、USB和DMA

去年11月去庐山时,正赶上太乙公路拓宽施工,社会车辆到了观音桥后就不准向上了,接我们的车因为事先有登记通过了关卡。到了太乙峰下的住处后,时不时能听到大型机械的声音,出门一看,一台巨大的挖掘机正在100多米远的公路边作业,特种材料制成的钻头反复冲击一块巨石,哒哒地发出轰鸣。
钉子户其一:顽石
我下去和旁边的工人搭话,他说这块巨石刚好在新规划的路线上,体量巨大,推不走,挪不动,只能这样把它削平,已经打了5天,花了几万元了。
我说看起来这石头很硬,他说:“硬得很,钻头已经打费好几根了…”这时,我看到路边有好几根用过的钻头,长度超过1米,直径估计至少有10公分,分量估计数百斤。
几天后,在林场的老屋里与当地人聊天,又聊起这个话题,他们说这样的石头在这里很多,材质和太乙峰上的石头是一样的,内部是白色,石质坚硬,当地有人把它用特殊的切割机切开用来做石桌。说着,他们伸手一指,“这块也是,虽然外表黝黑,但是里面是白色的。”

林场老屋门前的石头也很巨大,离路也不远,但是不影响修路。所以它仍可安然的躺在那里,道路修好后,还会成为路边的一个风景。
而被铲平的那块巨石则不然,它的位置刚好在新规划的路线上,所以成为修路工程的大麻烦,“钉子户”,前进路上的硬钉子。
为什么叫硬钉子呢?因为它首先很硬,不像萝卜那样一砍就掉,第二是它位置牢固,像钉子那样牢牢钉在那个位置,推不走,挪不动。
钉子户其二:USB
去年秋季,向幽兰代码本移植WoA时(Windows on ARM)也遇到了很多硬钉子。比如,USB 2.0的EHCI驱动一装上就蓝屏,调查一番,深层原因竟然牵涉到复杂的硬件锁问题。而EHCI驱动如果不工作,那么所有USB 2.0的设备都不能工作,包括幽兰自带的键盘和触摸板。格蠹的团队用了2周的时间,成功拔掉了这个硬钉子。
就像太乙公路上的那块顽石,正好被它挡住去路时真是难受。一旦把它削平后,也是非常的畅快。
春节前一周,考虑到上手其它任务可能节前做不完,于是我决定把一直想做的挥码枪升级工作做了。主要的改动是增加串口支持,本来以为这个任务很小,可以很快做完,但是却遇到了硬钉子。在关键的中断处理代码中,老代码不能正确处理串口初始化时的SET_LINE_CODING对话。
我连续攻关几日没能攻克后,请非常擅长嵌入式调试的老朋友文波助阵,一起搞了一个晚上,也还是没有搞定。
主要的困难有两个:
对USB主机和设备之间通信的深层细节不够熟悉;
工具不够给力,缺少USB协议分析仪。
虽然有JTAG调试器和串口打印,但是两种方法的威力在调试中断和时序敏感的问题时都大打折扣。一旦设置断点和单步跟踪,主机端就认为设备超时,“不和你聊了”。另外,SET_LINE_CODING这样的USB对话被细分成多个步骤:SETUP、确认SETUP、OUT、确认OUT,等等。任何一个步骤出问题都会失败,断点的数量有限,常常顾此失彼,而增加串口打印,又会加大延迟。
春节之后,对症下药,有了USB分析仪帮忙,效率大不一样,首先清楚认识了正常通信时的每个动作细节。

然后抓到失败通信时的失败动作。

而后再对比代码分析原因。
重要的是,我们还找到了一种简单复现问题的方法,只要在关键的处理路径上加一行打印就可以复现问题。
我把能简单复现的代码发给格友里的几个喜欢玩嵌入式的老朋友,他们也是非常吃惊。

找到这个过于敏感的根因后,我不禁想起春节前与文波挑灯夜战时,他提到网上有同行遇到类似问题,最后就是打开编译优化就好了。是啊,关键路径上跑的快一些确实就能克服这个敏感症。
回想起来,春节前文波第一次提到“打开编译优化就好”的解决方案时,我没有太往心里去,觉得可能是巧合。因为当时还没有把问题的根因定性在“过于敏感”上,也没有找到代码中的敏感路径。
闭目沉思,与太乙公路上的那块顽石就明晃晃地摆在修路人的面前不同,计算机世界里的“顽石”是非常隐蔽的,需要花大量的时间和精力去发现它。而很多时候,在没有发现之前就放弃了。
钉子户其三:DMA
最近一段时间,AI技术很是火爆,一些自媒体更是添油加醋,把AI技术说的神乎其神。在我看来,AI技术确实有了很大进步,但短时间内肯定还与真人差距很大。让AI做些简单的辅助工作是可能的。但是让AI去解决具有创造性的,或者高难度的技术问题,那它还差距很远。以上文说的两个技术难题为例,哪个AI公司敢跳出来说他们的AI机器人可以把格蠹2周里搞定的问题在2个月内解决(把根因说清,给出能工作的代码)?
人类的思维系统具有超强的“聚焦”和钻研能力,可以持续在一个问题上探索,探索,再探索,所以爱因斯坦能想出E = mC2这样的伟大方程(E是能量,m是质量,c2是光速的平方)。
AI的发展,进一步验证了我一直坚持的一个信念,如果要想长期做技术,那就必须要做的深。唯有深,才能解决复杂问题,唯有能解决复杂问题,才有竞争力,才不可取代。
换句话来说,任何项目都会遇到难题,当前进道路上出现硬钉子时,别人都沉默不语了,而你能站出来,把它铲除,那么你就是团队里的英雄,连你的对手都打内心里佩服你。
另外,AI之所以表现出一些让我们惊叹的能力,那是因为人类用海量的信息对它进行了超乎想象的高强度训练。这一点也告诉我们,要保持我们自己大脑的竞争力,那么也要不断训练,也就是学习。
与AI训练很讲究方法一样,人类的学习也很在乎方法。论容量和运行速度,人类的大脑肯定比不过今天的高性能AI服务器。但是如上文所说,人类大脑具有超强的聚焦能力,分析能力,演绎和推理能力,要与AI竞争,我们必须不断加强这些能力。
在人类大脑的推理路径上,有时也会遇到钉子户。比如,在微信群里,多次有同行讨论到DMA,而且一提到这个问题,不少人都有同感,说是难理解,不知道它在哪里,没有搞清楚。对于有些问题,不清楚可能也不要紧,但是对于DMA,它似乎是太乙公路上的那块顽石,刚好占据关键的位置,要想通过,必须经过它这一关。

随便搜索一下我的微信聊天记录,关于dma的讨论有好几个屏幕。

上图中,有个我自己都意外的搜索结果,眼尖的格友也一定能发现。

讨论最多的当然还是兰舍群,幽兰代码本的技术大本营。
究其原因,是因为DMA代表着现代计算机系统的关键特征,自从内存中央化的思想确定了以后,外设和内存之间的通信问题就成为现代计算机的根本问题。
坦率地说,我也是在开发幽兰代码本的过去一年多时间里对DMA有了扎实的理解。以前也是和大家一样,雾里看花,如梦如幻。
每当有格友问DMA的问题时,我都会抽空回复一下,但是对于这样深的问题,我的回复多半只能是“望梅止渴”,起不到太大的作用。
当前几天又有格友提到DMA的问题时,我下定决心开个专题讲座,把这个困扰大家的钉子户铲掉。
为了能有些互动和问答,避免听者太多超过我们的服务能力,格蠹的小伙伴故意设了一个小小的门槛,象征性收费。
讲座的海报发出后,反响强烈,不到一个小时报名群就超过了50人。

就在我准备收尾这篇文章时,刚好收到一位老朋友的微信,他是工作在游戏行业的,他给出了需要深刻理解DMA的另一个理由。

-END-
【盛格塾】
正心诚意,格物致知
以人文情怀审视软件,以软件技术改变人生

格友公众号

盛格塾小程序
扫描上方二维码或在微信中搜索“盛格塾”小程序
可以阅读更多文章和有声读物
往期推荐
2万+

被折叠的 条评论
为什么被折叠?



