实习总结
下文本为献给我们尊敬的老师们而写,部分言语纯属多余 ^_^
实习期间,我主要负责公司Windows CE 5.0(以下简称Wince) BSP(板级支持包)和BootLoader的研发工作。通过增强软件的容错性,减少个别硬件对系统的干扰,使开发板的稳定性得到很大的提高。下面是各阶段的工作总结。
第一周,是BootLoader的调试,这一阶段主要完成Wince映象USB下载和烧写功能。刚开始时,由于对Wince的架构及其开发流程不熟悉,整个项目进度很慢。期间很多问题都不能快速判断原因所在,不得不通过仿真器一步一步的进行调试,找到出现问题的地方再查资料。确定问题的原因后,解决就十分容易。譬如Wince映象的较检,将NK.BIN解包时会根据内核虚地址的设置计算映像的入口地址和映像大小等。这时,对比BootLoader和内核的虚地址设置,问题便迎刃而解。虽然这阶段花了很长时间和很大的努力,但也正是这一阶段的知识积累,为后续工作打下坚实的基础。
第二周,是Wince BSP的调试。由于原来的BSP不是针对现在这款开发板写的,导致开发板的运行存在不稳定的因素。第一个不稳定因素是启动后内存的不确定状态。原来的FMD(闪存媒质驱动)中会根据内存中的参数共享块IMAGE_SHARE_ARGS_UA_STAR判断是热启动还是冷启动,然后执行相应的操作。部分开发板的内存启动时并没有完全清空,致使启动失败。在BootLoader里手动将这块内存区清空,问题解决。第二个不稳定参数是电源和重启按键驱动与硬件不协调。大部分开发板能正常启动,只有少部分在打印了相关信息后便不能启动。通过驱动的源码可知,该驱动分别为电源和重启按键申请中断0和中断2,不能启动的开发板都停留在中断开启后。测量中断0的端口电压,只有1.5V,即不停的陷入中断循环中。原来是端口的电压被无故拉低。问题的解决也算简单,要不给相关端口接外部上拉电阻,要不将相关驱动去除。
第三周,是给Wince BSP添加额外的功能。主要添加的功能有三个,分别是HIVE注册表的实现、NAND FLASH剩余空间的分区和RTC实时时钟的保存。关于HIVE注册表的保存,主要是修改注册表,使相关表项能在系统启动初期被加载。网上和Platform Builder自带的帮助都有详细的介绍和指示。但我按操作修改完后,却怎么也无法启动,最后实在没办法,尝试了一次Build and Sysgen,经过数小时的等待后,系统正常启动。估计是HIVE所需的部分代码没有被编译,才使启动失败。64M的NAND FLASH除去BootLoader和Wince映象所占的空间外,还有将近一半的空间供用户存储资料。但问题是BootLoader是自己写的,要移植Wince的分区管理,目前是不可能的事情。不行就换个角度吧,经过分析,FMD首先会查询每个块是否坏块,是则跳过,否则纳入其管核范围之内。这样的话,要达到我的目的就太容易了,告诉FMD的上层,存储BootLoader和Wince映象的空间都是坏的,剩下的空间便自然被纳入管理。RTC功能的添加也很简单,由于每次启动后,系统的时间都会初始化为一固定的时间。猜测是启动时执行了时间的设置,使时间停顿。事实证明,猜测是正确的,在RTC的驱动初始化时调用了OEMSetRealTime(pTime)函数,使每次启动的时间固定为pTime。注释该行后,时间正常。
第四周,是部分驱动和BootLoader的修改。需要改的驱动主要有三个:网卡、LCD和触摸屏。首先接手的是网卡,但手头没有一点关于网卡驱动的资料,除了源代码。接连几天,没有一点进展,不得不暂时放弃。至于LCD驱动,主要是修改一下硬件的参数,使其工作于7寸和8寸的屏幕。由于之前已做过Linux下相关的修改,这一部分很快完成。但屏幕增大后,触摸屏的精度有很大的下降,直接测得的数据跳动很大。这一部分的解决与Linux相同,通过增加测量时间,取各测量值的平均值来调整触摸屏的精度。驱动修改完后,轮到Bootloader了,主要是添加图片显示和Wince映象加载的进度条显示。图片显示是在初始化LCD时,将已转为数组形式的BMP图片根据屏幕的分辨率逐点显示,最后便完整地显示整幅图片。而进度条则根据当前已读取的映象大小与总的映象大小之比来更新进度条的长度和相应的颜色,使加载的进度一目了然。
第五周,是Linux相关说明文档的撰写。这部分之前已做过,也许是说明不够明晰,咨询者众。现在顺带升级根文件系统并撰写Step By Step文档,包括《基于Busybox的根文件系统制作》、《Linux内核的编译及烧写》、《Linux开发环境(NFS)的快速搭建》等。
五周的实习生活很忙碌也很充实,除了以上工作外,还学习到不少公司运营的知识、营销的策略,算是迈进职场工作中踏出的坚实的第一步。

评论
afeyq xkade dpxwl
你好!我想请教一下,“在BootLoader里手动将这块内存区清空”应该怎么实现啊?
*(unsigned int *)0x30000000=0;
就是将指向内存的指针置赋0.
(2008-03-14 19:10:08)
是自己写的吗?
呵呵,自己的实习,自己的小结^_^
(2007-12-16 16:59:07)
期待你的 Linux 文档!
文档都是带图的,粘出来不完整就没粘了。你找一下朗成要吧,留在公司我没带出来。^_^
(2007-07-27 17:53:25)