前言
本文用来测试fireFlasher Mini的随机数写入功能,将随机数写入到flash的指定地址中去。成功写入之后使用JLINK反读写入的随机数(参考上一篇帖子,讲解了JLINKN反读flash数据的方法:【野火 fireFlasher Mini 脱机烧录器】2. 多套固件下载试验)。
本次试验发现了一个问题:使用了随机数超如功能之后,下载的程序不能正常运行,反读出来的FLASH代码与原始代码对比也有一些差异,见下文详细说明
1 随机数写入
打开“野火脱机烧录器”,加载固件(hex文件或者axf或者其他可执行文件),点击随机数管理 ,在弹出来的窗口中选择数组1或者其他(非0,数组0用不了),之后选择随机数的烧录地址。这里选择0x8001400。之后点击确认
为什么选择地址0x8001400呢?因为LED.axf文件的结束地址为0x800135B,不能小于这个值,所以选择了0x8001400。
接下来选择“一键烧录”,然后退出配置,将固件下载到烧录器中。
之后按下“野火脱机烧录器”上面的红色按钮,将固件下载到单片机中。具体流程不做赘述,可以参考我之前的文章:【野火 fireFlasher Mini 脱机烧录器】1. 上手实测。
在烧录固件到单片机的过程中,会比单独烧录LED.axf慢一些,我猜测是因为随机数是在烧录固件到单片机的时候才生成的,所以会比较慢一点,后边实测也验证了猜想。
2 获取烧录的随机数
使用野火脱机烧录器下载了代码到单片机之后,发现代码没有成功运行(我下载的是走马灯程序,但是添加了随机数之后,下载代码到单片机中之后,LED都不亮了,表示下载的程序有问题)
通过JLINK回读下载到单片机中的程序,回读方式见:【野火 fireFlasher Mini 脱机烧录器】2. 多套固件下载试验)。
然后使用hexview工具对比回读的数据和原始LED.hex数据的差异,对比方式如下:
-
加载回读的hex文件到hexview;
-
点击hexview菜单栏“File->Compare”,在弹出的对比文件选择框中选择原始hex文件(即LED.hex);
-
对比结果见下图,可以看到回读的数据中从地址0x8001000开始就变成了0xFF,表示数据被损坏,但是程序不能正常执行。
-
查看随机数写入地址的数据,是否成功写入了随机数到指定地址。见下图,可以看到随机数是成功写入了,但是破坏了原始数据。
3 问题描述
通过上述试验,发现使用随机数功能之后,下载到单片机中的程序会被损坏,具体现象为:
- 原始hex文件使用地址范围:0x08001000-0x0800135b
- 写入随机数起始地址为:0x08001400
- 使用随机数数组1(其他数据也测试过,也会有一样的问题)
- 写入随机数255个
- 单片机型号为:stm32f103rct6
如果不添加随机数功能,就是正常的,代码能正常执行,回读数据也正确。可以参考我钱两篇帖子,使用的试同一套代码
不知道是什么原因导致的,也可能是我使用上的问题,还望[url=home.php?mod=space&uid=722860]@野火[/url] 或知道的小伙伴能告知下原因
|