打印

利用仿真软件的Semihost功能烧写Flash(附例程和烧写任务工具)

[复制链接]
3915|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wowow|  楼主 | 2007-5-13 10:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM的C函数库中的文件操作函数/printf函数可以用来读写主机上的文件/向主机发送字符串,这些功能的实现需要调试软件Semihost功能的支持。具体实现原画是利用了ARM的SWI,在SWI服务程序中调试软件与ARM可以交换数据。这些功能不能脱离仿真环境使用,用来调试及烧写Flash还是很不错的。

支持Semihost的仿真软件有ADS1.x和RVDebug,其它软件不详。本例在是RVDS 2.2中的RVDebug实现的,ADS帮助里说支持Semihost,应该也可以。IAR/Keil好像这两个自带了烧写功能,可惜不支持我的Multi-ICE仿真器,没有试过。

附件内容:
1.Burnjob.exe,Burn.job:生成烧写任务文件,ARM程序执行时先读Burn.job文件中存贮的烧写文件路径和烧写起始地址。最多可以存4个烧写任务,并可以指定是否烧写该任务。
2.Mainfunc.c: 烧写示例程序

使用前需要做的:
1.建立一个项目,加入示例程序与自己的启动文件/初始化程序。
2.更改Flash烧写的命令以适用于自己的Flash芯片,示例中的用的是SST39VF800
3.更改示例程序中Burn.job文件的路径。
4.编译。
5.运行Burnjob.exe,选择你要烧写的程序/字库/其它数据表等(目前只支持bin格式!),并对当前要烧写的文件前打勾,然后保存烧写任务。
6.加载运行烧写程序。


其它说明:
1.注意fread()函数需要在HEAP中开缓冲区,一定要确认足够大的HEAP。以我的经验,如果你每次读x byte,HEAP最好大于2x。

2.由于编译后的程序比较大,对于只有几k大小的内部RAM是不够的,只能放到外部中SDRAM。如果你的Flash是完全空白的,没有初始化SDRAM的程序,那么就会出现无法加载程序的情况。因此你需要建一个只包含实始化程序的小程序,先把它加载跑一下就行了。其它烧写工具一般是由主机主控的,加载到ARM中的程序很小,所以可以直接加载到内部RAM,不用初始化SDRAM。不过只要你的flash烧过了正确启动程序,以后上电时就会初始化好SDRAM了。

3.本方案作为备选方案,在以下情况下是最佳选择:
-其它烧写工具在你的板子上不**。
-其它烧写工具不支持你工作用的仿真器,时不时换仿真器挺麻烦。
-其它烧写工具不能满足一次烧写多段程序/数据的要求时。
当然前提是你用的调试软件支持Semihost :-)

4.这个程序对我目前的工作比较适用,也没有做后续改进,如果哪位把它改进得更通用一些,也请放上来共享共享。
相关链接:https://bbs.21ic.com/upfiles/img/20075/2007513101211864.rar

相关帖子

沙发
wowow|  楼主 | 2007-5-15 15:02 | 只看该作者

貌似没多少人感兴趣?

使用特权

评论回复
板凳
hqgboy| | 2007-5-15 16:48 | 只看该作者

你太牛了。告诉一下,在哪儿下的REALVIEW2,下了几个都不能

使用特权

评论回复
地板
wowow|  楼主 | 2007-5-15 18:20 | 只看该作者

上两张图片

使用特权

评论回复
5
wowow|  楼主 | 2007-5-15 19:27 | 只看该作者

可能那个patch你没用好

crack列表里所有的文件都要patch

原映像中Z.W.T有关要进行patch操作的说明中文件列表不够完整,最终会导致无法正常debug。
以下为完整列表:



%Install Path%IDEsCodeWarriorCodeWarrior5.6.11592win_32-pentiuminPluginsLicenseoemlicense.dll
%Install Path%IDEsCodeWarriorRVPlugins1.086win_32-pentiumoemlicenseoemlicense.dll
%Install Path%RDIarmsd1.3.166win_32-pentiumarmsd.exe
%Install Path%RDIAXD1.3.198win_32-pentiumaxd.exe
%Install Path%RVCTPrograms2.2349win_32-pentiumarmasm.exe
%Install Path%RVCTPrograms2.2349win_32-pentiumarmcc.exe
%Install Path%RVCTPrograms2.2349win_32-pentiumarmcpp.exe
%Install Path%RVCTPrograms2.2349win_32-pentiumarmlink.exe
%Install Path%RVCTPrograms2.2349win_32-pentiumfromelf.exe
%Install Path%RVCTPrograms2.2349win_32-pentium cc.exe
%Install Path%RVCTPrograms2.2349win_32-pentium cpp.exe
%Install Path%RVDCore1.8734win_32-pentiumin vs.exe
%Install Path%RVDCore1.8734win_32-pentiuminxry100.dll
%Install Path%RVARMulatorARMulator1.4.1206win_32-pentiumarmiss.sdi
%Install Path%RVARMulatorARMulator1.4.1206win_32-pentiumarmulate.sdi
%Install Path%RVARMulatorARMulator1.4.1206win_32-pentiumv6armiss.sdi
%Install Path%RVARMulatorv6ARMulator1.4.1238win_32-pentiumv6thumb2.sdi
%Install Path%RVARMulatorv6ARMulator1.4.1238win_32-pentiumv6trustzone.sdi

使用特权

评论回复
6
hqgboy| | 2007-5-15 19:53 | 只看该作者

谢谢。。。。

使用特权

评论回复
7
mohanwei| | 2007-5-15 20:11 | 只看该作者

楼主比较强悍,有机会多多交流,呵呵

我正在做一块AT91SAM9260的简易开发板,还没开始调试,估计到时候会碰到不少问题……^_^
https://bbs.21ic.com/club/bbs/list.asp?boardid=35&t=2530533&tp=AT91SAM9260%u7B80%u6613%u5F00%u53D1%u677F%uFF082%u5C42%uFF09PCB%u548C%u539F%u7406%u56FE
相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=35&t=2530533&tp=AT91SAM9260%u7B80%u6613%u5F00%u53D1%u677F%uFF082%u5C42%uFF09PCB%u548C%u539F%u7406%u56FE

使用特权

评论回复
8
xieqin| | 2007-11-19 09:11 | 只看该作者

呵呵

bun.job主要用来记录bin的路径和loadregion的起始地址啊.
为何不改成直接解析hex文件格式哦? 这就没有"烧写任务"最多4个限制了.
感觉这种烧写方法ulink差不多.都是通过运行一个程序烧写另一个程序.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

649

帖子

3

粉丝