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/
,来自同事韦东山和雷明的一些建议。