夜色如墨,但中关村的启航大厦却灯火通明,在燕京的夜空中犹如灯塔一般矗立着。
三十层的环实验室里,300ms的红色数字格外醒目。
陆佳杰和他带领的十二名工程师如同被抽走了魂魄,呆立在原地。
他们是天之骄子,是启航信息最锋利的矛,却在第一次冲锋时就折戟沉沙。
“韩总,我……”陆佳杰的嘴唇动了动,后面的话却怎么也说不出口。
这比承认自己无能更让人难受。
“失败是好事。”
韩栋的声音打破了沉闷的气氛。
他走到垂头丧气的众人面前,目光平静地扫过每一张年轻的脸。
“现在失败,好过将来在铁轨上失败,现在付出的是时间和精力,将来付出的可能就是无法挽回的代价。”
他转头看向李云禾:
“李老,您怎么看?”
李云禾没有立刻回答,他倒了杯热水,然后走到陆佳杰面前。
“小陆,知道当年我们在戈壁滩上搞导弹,第一次对接测试失败,延迟了多少吗?”
陆佳杰茫然地摇摇头。
“整整三秒。”李云禾伸出三根布满褶皱的手指。
“三秒钟,导弹能飞出去多远,你知道吗?
那一次,一个头发比我年长许多的老教授当场就哭了,他说对不起国家。”
老人喝了一口热水,哈出一口白气。
“但他哭完,擦干眼泪说的第一句话是,把所有数据扒下来,看是哪个王八蛋在捣乱。”
实验室里响起几声压抑的笑,凝重的气氛稍稍缓和。
“你们现在遇到的问题,叫总线优先级倒置。
当年我们搞导弹制导,也想过一个办法,叫时间片轮转,跟韩栋同志说的那个TTCAN,一个道理。”
“就是把时间这根线,切成一小段一小段,最重要的指令,给它留一个专属的通道。”
李云禾看着陆佳杰:
“这个道理,你们比我懂。现在,你们缺的不是理论,是把理论变成现实的决心。”
陆佳杰猛地抬起头,眼中的迷茫尽散。
“李老,韩总,我明白了。”
他转身面对自己的团队,重拾自信。
“所有人,听我命令。从现在开始七十二小时,要重写底层调度器,用C语言和汇编混编,把时间触发机制钉进系统内核里!”
“淑仪!”他看向一旁的林淑仪。
“我需要你和启航半导体硬件组的同事,配合我们重新设计控制节点的PCB。
时钟同步需要更精密的晶振和独立的供电回路,这个板子得重新走线!”
林淑仪干脆地点头。
“没问题,给我二十四小时,出第一版图纸。”
“好!”陆佳杰深吸一口气,像一个即将奔赴战场的将军。
“七十二小时后,我们在这里,再战一次!”
“是!”
十二个工程师齐声应道。
在1993年,嵌入式开发没有现成的实时操作系统,没有完善的开发库。
陆佳杰必须用C语言和汇编语言混合编程,一行一行地手写出一个支持多任务抢占的微内核。
启航大厦三十层的灯光彻夜未熄。
陆佳杰坐在工作站前,手指在键盘上飞快敲击。
屏幕上滚动着密密麻麻的汇编代码,每一行都关乎着列车控制系统的生死。
“老大,咖啡。”
一个年轻工程师递过来一杯咖啡,杯壁上还冒着热气。
陆佳杰接过来一口闷掉,苦涩的液体灌进喉咙,大脑瞬间清醒了几分。
“时钟同步模块改完了吗?”陆佳杰头也不抬地问。
“改完了,用硬件定时器替换了软件延时,误差控制在0.5微秒以内。”
那个工程师揉着发红的眼睛回答。
“不够。”陆佳杰停下敲击键盘的动作,转过身看着对方。
“0.5微秒在10毫秒的时间窗口里,累积误差会达到5%,我要0.1微秒。”
年轻工程师愣住了。
“老大,0.1微秒……这需要用原子钟级别的校准算法,咱们现在用的晶振精度根本达不到。”
“那就换晶振。”陆佳杰站起身,走到实验台前,拿起一块PCB板。
“淑仪那边不是在重新设计控制节点吗?让她用温补晶振,TCXO,温度漂移控制在正负0.5ppm以内。”
“可是TCXO的价格是普通晶振的十倍……”
“我不管价格。”陆佳杰打断他的话。
“我只要精度,去跟淑仪说,就说是我的要求。”
年轻工程师咽了口唾沫,转身快步离开。
陆佳杰重新坐回工作站前。
他盯着屏幕上那段代码,脑子里飞速运转。
CAN总线的非破坏性仲裁机制,本质上是一种分布式的优先级调度。
当多个节点同时发送数据时,总线会根据报文标识符的二进制位进行逐位比较,0占优先,1退让。
这个机制在低负载下没问题。
但在高铁这种极端环境下,几十个控制单元同时工作,总线负载率可能达到80%以上。
这时候,即使紧急制动指令的优先级最高,也得排队等前面的数据包传完。
陆佳杰在草稿纸上画了一个时间轴。
假设基本周期是10毫秒。
前5毫秒只允许传输关键指令。
紧急制动、牵引切断、防滑保护。
后5毫秒,才是共享窗口,其他非关键数据可以抢占。
这样一来,紧急制动指令最多只需要等待当前正在传输的关键指令包结束,延迟可以精确计算。
但问题来了。
如何保证所有节点的时间窗口严格同步?
如果某个节点的时钟快了1毫秒,它可能会在别人的专属窗口里发送数据,导致冲突。
陆佳杰揉了揉太阳穴。
时钟同步。
这是分布式系统的终极难题。
在1993年,GPS授时还没有民用化,NTP网络时间协议也才刚刚起步。
陆佳杰必须自己设计一套时钟同步算法。
他打开一个新的文件,开始写代码。
算法的核心思想很简单。
选一个主节点作为时间基准,其他从节点定期向主节点发送时间戳请求,根据往返延迟计算时钟偏差,然后调整本地时钟。
但魔鬼藏在细节里。
CAN总线的传输速度是1Mbps,一个字节需要8微秒。
如果时间戳请求包是8字节,往返延迟就是128微秒。
这128微秒里,主节点的时钟还在继续走,从节点收到回复时,时间戳已经过期了。
陆佳杰必须在算法里补偿这个延迟。
他在代码里加了一个修正项,用硬件定时器记录请求发送和回复接收的精确时刻,计算出单向传输延迟,然后用这个延迟去修正时钟偏差。
写完这段代码,陆佳杰靠在椅背上,闭上眼睛。
大脑像一台超负荷运转的机器,嗡嗡作响。
他想起了在麻省理工大学读书时,导师说过的一句话:
工程不是科学,工程是在约束条件下寻找最优解的艺术。
现在,陆佳杰面对的约束条件是:
无限的硬件资源。
有限的开发时间。
无限接近零的容错空间。
他睁开眼睛,继续敲代码。
……
五月十一日凌晨三点。
信息中心的门被推开。
韩栋端着一个保温杯走进来。
陆佳杰正趴在键盘上,发出轻微的鼾声。
屏幕上的代码编辑器还开着,光标在某一行闪烁。
韩栋走过去,看了一眼屏幕。
那是一段用汇编语言写的中断服务程序,每一条指令都经过精心优化,没有一个多余的时钟周期。
韩栋没有叫醒陆佳杰。
他拉过一把椅子坐下,打开陆佳杰的工作日志。
日志里密密麻麻记录着这四十八小时的每一个技术决策:
“5月10日22:15,决定采用TTCAN架构,放弃传统的事件触发机制。”
“5月10日23:47,发现时钟同步误差累积问题,需要引入硬件定时器。”
“5月11日01:23,完成时钟同步算法初版,理论误差0.3微秒。”
“5月11日02:56,开始重写CAN驱动底层,用汇编优化中断响应时间。”
韩栋合上日志。
他知道陆佳杰在做什么。
这个年轻人正在用七十二小时,走完西门子用了八年才走完的路。
不仅仅是走完。
而是超越。
西门子的MVB协议,响应时间是50毫秒。
陆佳杰要做到5毫秒。
这是十倍的差距。
韩栋站起身,然后轻轻关上门离开。
……
五月十二日上午九点。
林淑仪带着一块崭新的PCB板走进实验室。
“佳杰,新板子出来了。”
陆佳杰猛地抬起头,眼睛里布满血丝,但精神却异常亢奋。
他接过PCB板仔细端详。
板子比之前的版本大了一圈,上面密密麻麻焊满了元器件。
最显眼的是中央那颗银白色的金属外壳芯片。
“TCXO?”陆佳杰问。