|
楼主 |
发表于 2009-7-4 09:21:39
|
显示全部楼层
为什么要在FLASH的特殊位置定义这样无意义的字符呢?我大致说一下:
由于我们的设备用在电信的CDMA网络监控上,在特殊情况下,需要通过CDMA网络对MEGA64主控制器升级,我们是这样实现升级的:为了稳定,在CDMA模块与MEGA64单片机之间再接一个MEGA32单片机,CDMA模块与MEGA32单片机用UART串口连接,MEGA32与MEGA64之间用SPI口连接。这样在要升级时,MEGA32获取从CDMA上下发的数据,MEGA32再通过SPI口将数据以128字节每页烧写进MEGA64单片机,问题主要出在CDMA模块与MEGA32单片机UART通信这里。
在升级时,CDMA模块(106版本)与升级服务器之间通过TCP建立连接,一旦建立TCP句柄,服务器会自动以128字节升级数据为单位向下发送数据包,CDMA的串口冒出来的升级数据包格式如下:
%TCPRECV: 1, 128
UPGRADE START0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
OK
十六进制显示格式如下:
25 54 43 50 52 45 43 56 3A 20 31 2C 20 31 32 38 0A 0D 0A
55 50 47 52 41 44 45 20 53 54 41 52 54 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0D 0A 4F 4B 0D 0A 0D 0A 0D 0A
这里“%TCPRECV: 1, 128“是模块自动冒出的TCP数据包包头,“UPGRADE START0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”是服务器下发的升级数据包,后面再跟一个“OK”。可以看到包头和包体之间有3个字节(0A,0D,0A),我的MEGA32升级程序通过定位来实现,在收到包头后,我从最后一个字节开始数,数3个字节,定位到“UPGRADE”的”U”这个字符这里,从这里开始往后数128字节,数到128字节,我就将这个128字节烧写到MEGA64的FLASH中,每次收到一个128字节,我都会以这样的方式定位,然后数128字节,将其烧进FLASH。
本来我已经实现了这个功能,但是后来这个模块升级了,升成108版本,而且我们在升级后没有对通过CDMA模块用MEGA32对MEGA64升级功能进行测试,而出货出了1000多台,现在已经安装在现场了,后来由于功能要求有变化,需要对设备进行升级才发现有问题。
新版本模块与老版本模块之间的区别在于:升级数据包包头和包体之间的字节数变了,以前是3个字节(0A,0D,0A),现在变成了只有两个字节(0D,0A),这是我最郁闷的地方。
这样按照老程序,服务器下发相同的数据包,我永远也辨别不出来这个是升级数据包了,我在想补救措施。
我想能不能以这样的方式来实现:
每次服务器下发的依旧是128字节,但是这个128字节的包体开头处多一个字节,假设为’U’,这样的话,128字节包体中其实只有127个字节是真正有效地,是我需要写进FLASH中的,如下:
%TCPRECV: 1, 128
UUPGRADE START000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(128字节)
这样的话,包头和“UPGRADE START…“之间依旧是3个字节,我的MEGA32程序收到升级包包头后,依旧会跳过3个字节,定位到“UPGRADE START。。。”的’U’处,而不会定位到第一个无用的’U’处,从这里开始往后数128字节,
UPGRADE START000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(127字节)+1个字节
数到128字节后烧写,其实从上面看到只能烧写127个有效数据,第128个字节是一个无效的数据,或者是一个任意数。因此,我现在想能不能通过在C语言中嵌入汇编,比如
0RG 0X7F(第128字节)
DB 0X00
0RG 0XFF(第256字节)
DB 0X00
……
以这样的方式,让程序编译时,就将bin文件编译成每个128字节的最后一个字节(第128字节)为无效数据,或者说是预留的一个FLASH字节?如果编译器有这样的功能,那我觉得我这个方法也是可行的?
我是这样理解的,我觉得目前我们的产品已经在运行了,如果这样不能升级,只有将其拆回来重新升级,1000多台设备的工程量难以想象,我也没有想出更好的办法,来实现升级。
谢谢大家给我建议!期待大家的回复,谢谢。
王军华
2009.07.04 |
|