《那些年啊,那些事——一个程序员的奋斗史》——67
最后更新于:2022-04-01 11:51:23
入赘到严董公司旗下一周之后,段伏枥那种不安感不仅没有消失,反而更加强烈了。虽然在利剑电子的时候,段伏枥凭借着不懈的努力,在编程水平上已经有很大的提升,特别是对C++的了解以及Win32编程的熟练度,相对于刚毕业之时已经有非常明显的区别。只是局限性也是非常明显的,这些经验都是建筑于应用程序之上。虽然Windows CE是嵌入式系统,但段伏枥在上面开发应用程序,其实与开发Windows的桌面程序没多大区别,根本就算不上是嵌入式开发。如果非要扯上“嵌入式”这杠大旗,那么最多就是“伪嵌入式”——打着嵌入式的幌子,干着桌面的事。
和段伏枥不同,老柳做的是Windows CE的底层,简单点来说,就是Bootloader和驱动层。以这个层面而言,则是彻彻底底地和硬件打交道。虽然说官方在放出BSP包的时候,已经将外围器件的驱动基本已经完善,客户只需要做简单的更改就好。可是段伏枥对此没有丝毫的接触,虽然在浩程微也编译过系统,但那是基于老柳已经将所有的设置都修改好并且只给自己库文件的基础之上,自己所需要做的是选择一个“Make Image”命令而已,因此对于底层而言可谓知之甚少。
现在老柳不在了,那么这底层的工作自然是由段伏枥接手。以前老柳没有给段伏枥看过任何底层的代码,那么现在自己肯定也没有老柳修改过后的任何文件,甚至连编译过的lib库都没有。对于段伏枥来说,现在只能是从原厂方面获得最原始的BSP包代码,然后再根据原理图仔细修改。只是这样的做法无异于一切重新开始,但这却又是没有办法的事情。因为过来之前,武总跟严董承诺,一个月之内就能将之前的“旅行家”这款机器给调试完毕进行出售,所以另选方案之类的决议是绝对不可能的。如果要在这武总幻想的期限内整出个产品,那么就只能在原有的产品上打文章。
所幸的是,之前批量产100台机器的时候,因为需要烧录系统,所以曹燕拥有老柳编译好的bootloader和系统的二进制文件。因为硬件是完全没有更改的,所以这系统文件肯定是不必要做任何更改便能符合硬件需求。本以为见到了一丝希望,但没想到最后的结果还是沮丧的。虽然说拥有了二进制文件,并且也能烧录到机器中,但跑起来的时候需要检测密钥——如果没有密钥,那系统就会退出!而这密钥,偏偏只有老柳一个人掌握。以前批量产的机器,都必须要经过老柳进行密钥的写入,否则是绝对不能正常运行的。
一般的,从善意的角度来说,老柳的做法是为了保护公司。因为对于硬件,只要有一块实体版,就有人可以直接抄出来。可能很多人觉得抄板是一件非常神秘非常有技术含量的活,找到抄板的人很困难;其实在华强北的赛格广场,你只要随便逛一圈,就发现不少摊位上都摆着“抄板”的广告。正是因为硬件复制是如此的简单快捷,为了避免竞争对手复制产品,只能在软件的加密上下功夫。只可惜实际上,老柳这一记的真实用意防的是武总,因为他们害怕这100台成功生产之后,后续机器武总会直接绕开他们,让他们白费功夫。老柳和武总的互相不信任,其实是由来已久。
具有讽刺意味的是,老柳这一招确实起到了实际的功效。段伏枥他们虽然掌握有编译好的系统,但却无法让它正常运作。让武总去找老柳要加密的方法?这和天方夜谭差不多。如果老柳肯给,那么今天也不会闹成这样了。
怎么办?严董的库房还有400套机器的物料呢,还盼望着这产品大赚一笔。想直接放弃,另起炉灶?门都没有。没办法,段伏枥只能硬着头皮上。只不过,对于真正嵌入式开发来说,还算沾点边的话,只能算大学时代碰的单片机了。没有任何理论知识,想旁门左道都没有办法,只好踏踏实实买本《MIPS处理器设计透视》回来仔细研究。
不能不说,这本书让段伏枥接触到了不一样的领域。自己终于知道硬件在启动时,PC指针原来会指向一个特定的地址,而这个特定的地址往往又是向量表所在之处,当然还有虚拟地址和实际物理内存地址的转换,而诸多种种,是段伏枥原来写应用程序所没有接触过的。其实如果说实话,让段伏枥感到惊诧的这些内容,完全是做嵌入式开发所必须具备的基础知识;如果连这些基础的东西都好不知情的话,那么在嵌入式领域绝对是举步维艰。
虽然说段伏枥现在知道了有这么些知识的存在,但也仅仅是知道一些概念,完全无法将它们和实际的开发相结合起来。特别是AU1200这款CPU相对怪异的方式,更让人摸不着头脑。对于现在的很多支持Windows CE的CPU来说,如果需要编译Bootloader,那么完全可以不用额外的编译工具,直接使用Platform Builder即可。可AU1200根本就不按常理出牌,系统虽然是可以使用Platform Builder,但Bootloader却另辟跷径,必须在Linux使用GCC进行编译。
Linux?对于段伏枥这个只接触过Window的菜鸟来说,简直是又是一大阻碍。何况Linux的发行版本那么多,是不是每个都支持AU1200 Bootloader的编译,也未可而知。虽然说Linux是免费获取,但下载那么多版本也需要时间,何况还有安装这漫长的过程。所幸还有Cygwin这玩意,可以在Window的环境中模拟Linux的环境进行编译。
当然咯,虽说有Cygwin这么一个玩意可以避免安装Linux系统,可这也是一个烦人的东西。就以下载来说,有1G的大小,如果使用迅雷之前的可断点下载的程序倒不会觉得有什么,可它偏偏只能使用自带的下载程序。不仅如此,在国内居然没有镜像网站,下载的源地址都是在国外,以致于那个速度简直是龟速。这也就罢了,慢就慢吧,只要稳定了,那也就是时间问题。可要命的时,还时不时连接不通,如果点继续,又会重新下载。折腾了几次,实在让段伏枥想撞豆腐自杀。所幸很多网友都遇到这样的问题,并且给出了如何强制断点下载的方法,否则段伏枥不知道还要在这问题上折腾多久。
好不容易将Bootloader编译好之后,又遇到烧录这个老大难问题。AU1200既不能像很多芯片那样支持USB烧录,也没有自带的烧录工具,而必须借助于仿真器。老柳当时用的是BDI的仿真器,而这个仿真器也是严董出钱购买然后借给利剑电子的,只是当时分家的时候根本就没有给还。现在烧录必须使用仿真器,而购买和之前一模一样的型号也是不可能的,因为这仿真器价格非常贵,售价达到3万人民币,再次让严董出资购买肯定会露出马脚。让武总这铁公鸡自己出钱?那还不如杀了他来的爽快。
唯一的解决方法,便是寻找另一款能支持AU1200的仿真器,然后以改进开发效率等接口,再次像严董申请资金进行购置。只不过MIPS架构不像ARM那么遍地开花,支持ARM架构的仿真器数不胜数,价格由高到低,可供选择余地非常大;而MIPS找来找去,只找到一款USB2DEMON的仿真器。物以稀为贵,虽然这型号比BDI要便宜,但也要一万多。不过,武总才不会去理会这些,只要不是他出钱,只要型号不同,他就能够找到不同的籍口向严董申请。
可能是因为武总和严董的关系,也可能是武总又画了一张很大的饼,这仿真器的申请很快就批下来了。再过没多久,仿真器也回来了。事情发展总不会那么一帆风顺,虽然有了仿真器,虽然将Bootloader烧录进了NOR Flash,可如何知道程序运行到了何处?是USB2DEMON的资料匮乏,还是自己实在太榆木脑袋了?这仿真器怎么无法做断点调试呢?无法从串口输出调试信息,无法通过工具断点调试,段伏枥觉得自己简直就是盲人摸象,不知所云。
虽然找到了AU1200的售后工程师,但自己却无法和对方沟通。怎么沟通啊?对方问自己调试状况是怎样,可自己根本就回答不上来。究竟这个时候Bootloader是正常跑起来了呢,还是没有?自己完全没有办法确定。菜鸟问大牛问题,很多时候也类似如此。菜鸟问问题,可能会简单地问:“为什么我的程序无法跑起来?”任何一个大牛,除非他会掐指一算,否则对于这样的问话,肯定是一头雾水。一般的大牛,对于这样的问题很多都是置之不理;好心一点的,则会进一步询问相应的状况,比如DLL有没有放进指定的目录啊,是不是权限没有开放啊。可对于一些菜鸟,他也许根本就不知道什么叫DLL,权限和程序有什么关系,所以他根本就无法借助于大牛来解决问题。此时的段伏枥,就是这个无头苍蝇的菜鸟。
如果有更多的时间,段伏枥或许可以慢慢来,将这Bootloader如何加载并运行系统的机制整得明明白白;可是时间却只有一个月,那是无论如何都不可能按时完成的。第一次,段伏枥觉得自己是那么的力不从心,有那么严重的无力感。“旅行家”这款产品,该何去何从?还有,严董那剩余的400套物料,又该如何交代?以前这些问题都可以由黄华中顶着,可现在自己却是处于风浪尖的第一个人。突然间,段伏枥觉得自己莫名地烦躁了起来。
PS:关于AU1200的烧录文章如下:
《小议DBAU1200 Development Board的Boot Flash更新》 http://blog.csdn.net/norains/article/details/2293461
《USB2DEMON烧录DBAU1200开发板flash入门教程》http://blog.csdn.net/norains/article/details/2518180[](http://blog.csdn.net/norains/article/details/2518180)