Win32环境下轻松调试单板安全模式软件下载功能
温辉敏(wenhm@sina.com)
摘要:本文首先提出了在单板环境下调试软件下载功能的低效率和复杂性,然后进行了Win32环境下调试软件下载功能的可行性分析。给出了Win32环境下调试软件下载功能的具体实施过程,由于可以在Win32环境下采用VC ++等良好的IDE进行开发和调试,并且避免了升级升坏了系统时的重新升级整个系统的过程,大大的提高了效率,对于要进行单板安全模式软件下载功能开发的项目具有极大的借鉴意义。
一、问题的提出
局端MCU项目要实现安全模式软件下载功能,该项目的主控程序是运行在IDT438芯片上的单板程序,由于在安全模式下文件系统为RAMDISK方式,即所有的文件系统都是放在内存中的,所有的文件操作都是在内存中并不会实际反映到Flash上去的。因此若想将数据保存到Flash上只能采取直接操作Flash分区设备(标准字符设备)的方式来完成。
若直接在单板上调试该功能就存在如下问题:
l 在单板上只能通过GdbServer来进行跟踪调试,调试比难。
l 没有好的方式来查看写入到Flash上的数据是否正确。
l 调试阶段写入错误数据是不可避免的(除非程序不经任何测试一次成型,^_^),当程序写入错误数据到Flash上去,由于破坏了原有的数据,系统重启之后将起不来,只能重新升级整个系统。而每次整体升级都很费时间,大大降低效率。
基于以上问题,为了迅速有效的完成该功能,决定尝试是否可以在Win32环境下完成调试,调试正确后再上单板测试这样可以极大的缩短开发、调试时间。[1]
二、解决思路
2.1可行性分析
在单板上对Flash分区的读写操作是通过操作MTD (Memory Technology Device)来进行的,MTD设备采用标准字符设备操作接口。通过对相应字符设备文件操作即可以完成对设备的读写,也就是说对Flash的普通读写操作可以像正常文件一样读写(一致的定位、读写),Flash设备操作和普通文件操作的不同点是:
1)使用特殊接口获得flash分区大小;
2)在写一段区域之前,必须保证该区域已经是被擦除的,只有那个字节的内容为0xFF,flash接口才允许你写入数据到里面去;
3) 对区域的擦除是以block为单位来做的,block单位就是通过ioctl获得的erasesize;同样,erase一个block也是通过ioctl来实现。[2]
也就是我们要用到的有别于一般文件操作的Flash操作接口有:
l 获取Flash分区大小,包括block的大小,该接口名字为flash_getsize(底层驱动提供)。
l 擦除某段区域的Flash内容,该接口名字为flash_erase(底层驱动提供)。
其它操作则采用open、write、read等字符设备操作接口,由上可见,只要我们在Win32平台上实现两个对应的接口flash_getsize和flash_erase即可以让操作Flash那段代码在Win32平台运行了,而在Win32平台下可以以文件模拟作为单板上的MTD设备。
2.2具体实施
2.2.1接口实现
对于接口flash_getsize的Win32实现,可以直接让该函数返回分区大小为所操作的文件大小;block的大小由于单板上的操作系统和驱动一旦定制好block的值就是固定的了,所以block的大小返回单板上固定的block大小即可。
接口flash_erase的Win32实现,可以实现为将所操作的区域的字节全部置为0xFF即可。
完成上面的工作后,操作Flash的逻辑代码可以在Win32平台上运行起来,采用普通文件来模拟单板MTD设备进行读写操作了。在Win32上使用VC++ IDE环境能方便的进行调试,打开相应操作的文件直接查看二进制内容就可以看到写入到Flash上去的东西是否正确。
2.2.2注意事项
Windows下open二进制文件要加O_BINARY选项,不然系统默认打开为文本文件将对回车换行符将进行替换操作导致文件内容和写入数据的不一致。
三、实践情况
打好桩做好一切铺垫工作后,就可以开始在Win32环境下调试Flash操作的逻辑代码了,由于直接查看相应文件的二进制内容就能方便看到写入的数据,很迅速的就调通了如下功能:
l 设置系统下次启动是否进入安全模式的标志位的功能
l 设置IP地址进入工作模式区的功能
l 设置在Flash中寻址某个分区头定位分区的功能
l 镜像文件下载功能
四、效果评价
整个安全模式软件下载更新功能中最重要的一点就是要保证写入到Flash上的数据和下载的源文件内容要一致,这个只要使用一个二进制文件比较工具将完成下载操作的模拟MTD设备的文件和源文件比较一下就可以知道下载是否正确完成了。而如果在单板上验证该操作的话必须重启系统,而且要老天保佑能进入系统,进入不了的话得重新升级整个系统,可见带来的效率是异常明显的。
整个调试过程可以在VC++ IDE环境下完成,比之使用gdbserver方便了很多提高了调试效率,虽然很多人不屑于使用Win32环境进行编程,他们喜欢使用Linux下VI编辑器来编写代码,喜欢使用gdb来调试代码,但见仁见智,现在的Kdevelop、Magic C++等Linux下可视化集成开发环境的出现和普及其实也正是因为gdb调试的不方便和VI编辑器的局限性。
五、推广建议
本文适合推广到所有要进行单板上Flash读写操作(有文件系统的普通文件操作除外)的项目,特别是安全模式下的软件升级等Flash操作,若产品代码不能全部移植到Win32环境下则只需将操作Flash的那部分逻辑代码移植到Win32环境下测试就可以了。
作者有2.2中接口的C++实现,若需要可以向作者索取。
参考资料
[1].来自同事李春生的一些建议。
[2].http://www.linux-mtd.infradead.org/,来自同事韦东山和雷明的一些建议。