打印

STR912FAW如何实现在线部分更新

[复制链接]
3581|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
want|  楼主 | 2007-12-16 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有一个方案: BANK0中存放应用程序, BANK1存放BOOTLOADER(或系统程序), BANK0应用程序如果需要更新, 则调用BANK1中的相应代码执行更新操作. 
请教各位这样是否可行? 如果可行, 那么BANK1中的相应代码应该才能准确定位?
沙发
香水城| | 2007-12-16 17:57 | 只看该作者

方案可行

不明白LZ的最后一句话:“如果可行, 那么BANK1中的相应代码应该才能准确定位?”

使用特权

评论回复
板凳
want|  楼主 | 2007-12-16 21:59 | 只看该作者

继续

下午没说完就发了,继续. 具体点说, 我本来的想法是BANK0中的程序可以部分更新, 但想来想去觉得不是很可行. 于是我想把一些常用的功能(例如串口读写, USB, 甚至以太网等等)放到BANK1中, 而BANK0中只有与硬件无关的应用, 如果想访问硬件, 就通过调用BANK1中的特定地址的函数进行例如读写串口. 那么我现在就可以尽量减少BANK0中应用程序的体积, 利于窄带网络的远程更新. 现在的问题是: 我编译好了BANK1的程序后, 例如里面有一个函数写串口, 现在有2各问题, 一是我在写BANK0应用程序的时候如何得到这个函数的入口? 象PC机的DOS调用所有函数通过一个统一的入口地址来转吗? 二是我在编译BANK1中的程序时, 我想BANK1应该作为启动块,地址是0, 而执行BANK0中的应用程序时, BANK1作为非启动块影射到0X80000000, 那么即使第一个问题解决了, 那么原来的函数地址都已经发生了变化, 特别是中断服务程序, 这个问题能不能解决?

使用特权

评论回复
地板
香水城| | 2007-12-16 22:24 | 只看该作者

在BANK1的固定地方做一个函数入口表

BANK0中的程序通过这个函数入口表调用BANK1中的函数。这个表的位置必须是固定的并被BANK0的程序知道,同时表中各项的顺序也必须是固定的并被BANK0的程序知道。中断服务程序的入口地址也照此办理。

如果不需要通过BANK1启动,则编译BANK1的程序时不必设为从0开始,而应设为他被映射到非启动模式时的地址,这样编译链接时才能正确地解析各个地址。


另外,通常BANK0很大而BANK1很小(32KB或128KB),不知你的那些常用的功能是否放得下。

使用特权

评论回复
5
greatbin| | 2007-12-17 10:46 | 只看该作者

部分更新一向是件很难的事情,在单进程系统中

使用特权

评论回复
6
want|  楼主 | 2007-12-17 10:50 | 只看该作者

继续问

谢谢香水城的关注.你所说的BANK1很小的问题我也在考虑.不知道能否把部分功能放到BANK0里面?相当于我的系统程序超过了BANK1的界限.这样做这颗芯片能支持吗?或者另外一种方式,我一个针对BANK0的程序,一个针对BANK1的程序,BANK0中的程序位于特定的位置,BANK1中的程序来调用.不过似乎从用户程序调用BANK1的公共入口,再调用BANK0的公共入口,最后才能调用实际执行的程序,层次多了一点.

使用特权

评论回复
7
香水城| | 2007-12-17 11:23 | 只看该作者

LZ是否可以从Sector的角度考虑一下


STR912FA中Flash的最小擦除单位是Sector,请看下表:
]
Flash容量Sector大小和数目
256KBBank0=64Kx4,  Bank1=8KBx4
512KBBank0=64Kx8,  Bank1=8KBx4
1024KBBank0=64Kx16,  Bank1=16KBx8
2048KBBank0=64Kx32,  Bank1=16KBx8

 
例如,你使用1MB的版本,BANK0的前6个Sector存放应用程序,BANK0的后10个Sector(高地址区)存放系统程序,而BANK1中只存放Bootloader和BANK0程序的更新程序。

使用特权

评论回复
8
want|  楼主 | 2007-12-17 13:48 | 只看该作者

这样是不是意味着我总共需要3个工程

一个是BOOLLOADER,一个是系统程序,一个是应用程序?请问香水城是ST的还是哪家代理的?:D 我现在在考虑我的系统方案中.

使用特权

评论回复
9
香水城| | 2007-12-17 14:02 | 只看该作者

基本可以这样安排

这个版面是ST出资开办的,为所有使用ST单片机的朋友提供一个交流的平台,我是在ST负责管理这个版面的。

使用特权

评论回复
10
want|  楼主 | 2007-12-18 09:25 | 只看该作者

香水城,剩下的工作有没有什么建议?

接下来我要做的就是规划一下系统的启动顺序和每一部分应该做的事情了.另外就是要知道公共入口的位置. 香水城有没有什么建议? 如果从BANK1启动, 应该怎么做, BANK1的程序能否共享系统部分的程序, 还有启动以后转到系统程序执行前是否需要执行内存重映射(这个似乎与共享系统部分程序有矛盾, 因为重映射会改变地址). 从系统部分转到用户部分执行的时候, 是不是可以先将公共入口点甚至每一个函数入口都放到内存中的某个位置然后由用户程序去读取来确定到哪里来调用这些函数?

使用特权

评论回复
11
浪淘沙| | 2007-12-18 10:10 | 只看该作者

提供一个思路

你可以把Bootloader放在Bank1中,而系统程序和应用程序均放到Bank0中,但分配在不同的Sector中;每次上电始终从Bank1启动并查看是否有任何部分要更新,如果有需要更新的部分,则对Bank0中相应部分进行更新,如果没有需更新的操作,则将Bank0中映射到地址0x00000000并执行正常的程序;当正常程序执行时需要更改部分内容,则做个标记然后将Bank1中映射到到地址0x00000000并执行Bootloader进行Sector更新。

公共入口地址,可以用一个结构的跳转表实现,只需把该结构安排在固定的地址,结构中所有函数的指针将可以通过他们在结构中的位置决定了。

使用特权

评论回复
12
wtfyxk| | 2008-3-4 08:47 | 只看该作者

回复四楼!!

 在BANK1的固定地方做一个函数入口表,这个如何实现?

 通过函数指针和数组?

 谢谢!

使用特权

评论回复
13
香水城| | 2008-3-4 09:31 | 只看该作者

是的,通过函数指针和数组

12楼理解正确。

使用特权

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

本版积分规则

5

主题

14

帖子

1

粉丝