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.这个程序对我目前的工作比较适用,也没有做后续改进,如果哪位把它改进得更通用一些,也请放上来共享共享。