打印

不区分高低区的ARM IAP更新

[复制链接]
2091|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maztower|  楼主 | 2011-12-7 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前做ARM IAP在线更新的程序,发现传统的都是区分高低区,每次下载前要确认当前程序的运行位置,且确认这一步是在上位机实行的。为了减少操作人员的操作难度,我想了个办法,上位机只要点击下载,而不用判断当前程序的运行位置去选择下载文件。

传统IAP特征如下:
1.生成的HEX文件是高区还是低区使用,由分散加载文件中的地址决定
2.用户程序需要中断向量重映射,重映射地址为当前程序开始位置。

我的实现方式是由下位机的bootloader根据当前程序运行位置,修改接收的更新文件,不管接收的文件是高区还是低区的,根据程序标志区的值,强制修改接收的更新文件。

思路如下:
1.相同程序的高低区中断向量表是一样的,只是因为地址不同,其中的个别值不同,且是跟地址相关的
以我的程序为例:
startup.s中的指令LDR   R1,=Vectorsaaa (大家做过iap的话,对这条指令应该比较熟悉)     
如果低区地址为Vectorsaaa=0x00008000,则HEX文件第0x8100位置的值为801CA0E3(因为0x0008000地址在16位范围内,所以hex文件起始地址为0x8000)
而高区地址为Vectorsaaa=0x00040000的话,hex文件第0x0100位置的值为401aa0e3
(因为0x00040000这个地址超过16位了,所以hex文件的段地址为4,而16位基址以0为起点)
可见只要把801c和401a替换就可实现高低区变换了

同理,只要下位机能找到这些位置,把值替换掉,就可以实现不区分高低区的程序下载了
当然,这样做也牺牲了一些代价,比如如果程序中有使用绝对地址指针对Flash或者Ram等操作
其实也没关系,只是绝对地址要设计成相对地址另外

相关帖子

沙发
maztower|  楼主 | 2011-12-7 10:58 | 只看该作者
本来打算使用1k Xmodem协议用超级终端发送hex文件,发现这样做效率太低,
且发送的数据时以字符形式发送的,如果hex文件的大小为100KB,则以16进制发送的话其实只要50KB而已
因此我自己做了一个上位机的下载程序。协议参考1K Xmodem,但是发送的是16进制数据而不是字符(例如,HEX文件中":100000",如果是超级终端发送,则发送的数据为0x3a,0x31 0x30 0x30 0x30 0x30 0x30,需要7个字节,而以16进制数据发送则为,0x3a 0x 10 0x00 0x00,只需要4个字节)

使用特权

评论回复
板凳
maztower|  楼主 | 2011-12-8 10:27 | 只看该作者
各位抱歉了,发现我的这种方法是错误的,虽然因为中断向量表在程序开始的固定位置,所以可以轻易修改,但是程序中的各ISR入口地址、静态变量地址在Flash中的存储位置是不固定的,因此bootloader无法解决这种通用性问题。

使用特权

评论回复
地板
kingcome| | 2012-2-6 15:54 | 只看该作者
楼主辛苦了~

使用特权

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

本版积分规则

2

主题

36

帖子

1

粉丝