Win32环境下轻松调试单板安全模式软件下载功能

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/ ,来自同事韦东山和雷明的一些建议。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值