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

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

  1. Win32 环境下的堆栈

    原文已经找不到,作者应该是:http://blog.csdn.net/slimak   但是没有找到此文,其中丢了2幅图 简介 在Win32环境下利用调试器调试应用程序的时候经常要和堆栈(Stack) ...

  2. Win32环境下代码注入与API钩子的实现

    Win32环境下代码注入与API钩子的实现 本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在V ...

  3. Win32环境下动态链接库(DLL)编程原理

    Win32环境下动态链接库(DLL)编程原理 比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其它软件系 ...

  4. Centos环境下部署游戏服务器-软件安装

    这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...

  5. linux cvs服务,Linux环境下轻松搭建CVS服务器

    CVS是一种广泛应用的.开源的.透明于网络的版本控制系统.用户使用CVS时,首先要架设一台CVS服务器,在CVS服务器上导入项目实例.设置CVS项目访问控制等.而客户则通过客户端来访问CVS服务器,客 ...

  6. windows环境下_findnext()调试出现访问冲突异常。

    windows7,x64,VS2013环境下,使用_findnext()获取某文件夹内某类型文件名,报异常: 0x0000000077AEDA56 (ntdll.dll) ...处的第一机会异常:  ...

  7. 数字环境下版权制度的主要特点和功能

    由中国国家版权局.世界知识产权组织(WIPO)主办的"一带一路"版权国际论坛在成都举行,近200名中外嘉宾就数字环境下版权与创意产业新挑战和新机遇等问题进行经验交流.思想碰撞. 世 ...

  8. STM32在ArduinoIDE环境下的开发(不同的下载方式,不同的BootLoader方式,无需BootLoader方式)

    STM32在ArduinoIDE环境下的开发 1.前言 网上有不少介绍Arduino下开发STM32的帖子,但因为时间发展关系,核心库的开发和第三方库的发展有好几种,另外采用的下载方式也各不相同,因此 ...

  9. hfss matlab联合仿真_一文搞定matlab 与 STK 联合调试仿真环境配置(文末附软件下载链接)...

    最近在做导师给的课题:卫星星座的快速优化设计. 需要用到matlab 和 STK 来进行联合调试仿真,但是这第一步的环境配置就让我头疼了几天.在好几次重装,失败和查找资料之后,我终于成功实现了matl ...

最新文章

  1. 一生都要Debug,我们最需要掌握哪些硬技能?
  2. Android模拟自定义浏览器和打开另一个Ativity(06)
  3. 套路、逻辑与思辨(道理的论证)
  4. C++ Primer 5th笔记(chap 18 大型程序工具)类型转换与多个基类
  5. oracle 安装display,Linux安装Oracle 11时报错DISPLAY解决方案
  6. git安装-centos版
  7. 如何通过域名访问服务器里的文件,如何通过域名访问云服务器
  8. 思达报表工具Style Report基础教程—用选择列表,选择树进行数据过滤
  9. 【渝粤教育】国家开放大学2018年春季 0049-21T法律文书 参考试题
  10. QCC300x hello world
  11. Java程序员简历模板
  12. 惯导系统测试方法及测试系统
  13. 计算摄影: 高动态范围成像
  14. 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
  15. 一文搞明白DNS缓存投毒
  16. windows不能更改密码
  17. iPhone手机在Apple启动logo处卡住,无法开机该怎么办?
  18. ltsc系统升级为服务器,微软宣布Windows Server 2022开始转向LTSC 不再发布半年频道更新...
  19. MFC鼠标绘制直线段并使用编码裁剪算法
  20. [ROS](06)ROS通信 —— 话题(Topic)通信

热门文章

  1. 统计英文字数c语言,c语言题目,纯英文字数统计,怎么错了?
  2. 牛客OJ SQL后30题的解答
  3. 第11章 菜单及其它资源
  4. 先进先出SQL Server 语句
  5. 条码打印软件如何使用Excel表批量打印条码标签
  6. mysql万能标签调用字段_万能循环(Loop)标签与万能调用(SQL)标签
  7. 使用MNM(Microsoft Network Monitor)抓包
  8. 计算机音乐如何复制到手机桌面,电脑上的歌怎么传到手机上
  9. python判断数字在不在范围内_我的程序在python中完成数字并且不确定我是否应该在范围内使用(1,1000)或(2,n 1)...
  10. 晚风心里吹-粤语歌词谐音