硬件层面的“硬骨头”被一一啃下,“蜂鸟一号”Soc的硅片本身已经证明了其强大的物理基础。然而,正如林轩反复强调的,芯片的价值最终需要通过软件来体现。特别是对于功能手机而言,那套复杂而精密的通信协议栈软件,以及运行于其上的操作系统和应用程序,才是真正决定用户体验和产品竞争力的“灵魂”。
将这套庞大而对实时性、稳定性要求极高的软件系统,完美地移植、集成并优化到全新的“蜂鸟”硬件平台上,成为了项目组下一阶段的核心任务。这项重担,主要落在了基带负责人张建华和他麾下的协议栈团队,以及小张(张明)领导的应用与嵌入式系统团队肩上。
启明芯深圳研发中心,软件实验室区域。这里的氛围与硬件测试区不同,少了几分仪器的蜂鸣和示波器的闪烁,多了键盘密集的敲击声和工程师们低声讨论代码逻辑的声音。空气中弥漫着代码编译的味道和…似乎永不枯竭的咖啡香气。
张建华团队面临的首要挑战,是如何将那套融合了收购来的以色列公司早期3G技术(可能主要是wcdmA物理层和部分协议栈Ip)和团队自主开发的GSm\/GpRS协议栈的复杂软件,高效地运行在“蜂鸟”的ARm9内核上,并与硬件基带处理器(dSp和专用加速器)实现天衣无缝的协同。
“内存!内存!还是内存!”负责协议栈底层移植的工程师小王,看着编译器报告中那超过了片上SRAm容量的代码段(code Segment)大小,痛苦地抓着本就不多的头发,“完整的L1\/L2\/L3协议栈,再加上RtoS内核和驱动,怎么塞都塞不下!必须砍功能吗?”
“不能砍核心功能!”张建华斩钉截铁地说,“GSm\/GpRS的兼容性是底线!想办法优化!把所有能优化的空间都给我榨出来!”
一场针对代码尺寸和内存占用的极致优化攻坚战开始了。
编译器优化拉满: 工程师们尝试了Gcc ARm工具链提供的所有优化选项(-os, -o2, -o3),仔细比较每种选项对代码尺寸和性能的影响,寻找最佳平衡点。 汇编级手动优化: 对于协议栈中那些被频繁调用、对性能影响最大的关键函数(如信道编译码、加密算法的核心循环),甚至不惜动用ARm汇编语言进行逐条指令的手动优化,以追求极致的代码密度和执行效率。 数据结构精简: 重新审视协议栈中使用的各种数据结构(如状态变量、消息队列、缓冲区),用位域(bit Field)、联合(Union)等技巧,将内存占用压缩到最小。 代码共享与库化: 仔细检查代码库,将重复的逻辑或功能封装成可重用的函数库,减少代码冗余。 功能裁剪的艺术: 在保证核心通信功能和标准兼容性的前提下,对一些很少使用或优先级不高的协议特性(比如某些冷门的GpRS服务等级或网络信令选项),暂时进行功能屏蔽或采用更简单的实现,待后续版本再完善。 经过数周艰苦卓绝的“抠内存”工作,协议栈软件的静态尺寸终于被成功压缩到了可以容纳进预定内存空间的范围。
解决了空间问题,接踵而来的是更严峻的实时性能挑战。移动通信协议对各种信令交互和数据处理的响应时间有着“毫秒必争”的苛刻要求。
“中断响应太慢了!”负责L1(物理层)软件的工程师报告道,“在处理高速下行数据时,如果同时有高优先级的上层信令(如切换请求)中断进来,ARm核的处理会延迟几个毫秒,可能导致错过接收窗口!” “任务调度优先级需要重新调整!”负责RtoS内核移植的工程师建议,“基带物理层的中断处理和数据搬运任务,必须拥有最高的抢占优先级!” “光靠cpU不行!必须把计算密集型任务卸载给硬件!”张建华再次强调,“卷积码\/turbo码的编解码、均衡、解扩……这些必须由dSp和硬件加速器来完成!ARm核只负责协议逻辑控制和任务调度!”
新一轮的软硬件协同设计和优化开始了。硬件团队根据软件团队提出的需求,微调了中断控制器和dmA控制器的优先级设置;dSp团队则进一步优化了提供给ARm核调用的硬件加速函数接口,使其调用开销更小,执行效率更高;协议栈软件团队则重构了任务调度模型,将实时性要求最高的任务剥离出来,用最高优先级运行,并尽可能地利用硬件加速能力。
联调过程更是充满了各种意想不到的“坑”。
“为什么手机在弱信号下尝试发起GpRS连接时,总是失败?”——排查半天,发现是软件在读取硬件提供的信号强度指示(RSSI)时,算法存在缺陷,导致在高误码率情况下对信号强度的估计不准,从而错误地放弃了连接尝试。 “为什么进行长时间GpRS下载时,偶尔会出现数据包丢失或乱序?”——检查发现是RLc(无线链路控制)层的滑动窗口确认机制,在处理高速、不连续数据流时,存在一个罕见的逻辑漏洞。 “为什么在进行小区重选(cell Reselection)后,手机无法立刻恢复GpRS连接?”——发现是移动性管理(mm)模块在更新路由区信息后,未能及时通知下层协议实体刷新状态。