大家好!
我现在要做个软件升级程序,升级的大概流程是这样的:
1、上位机通过RS485发送Hex文件到单片机,单片机需要将这些内容保存在外部Flash存储器中,比如MX25L1605D;
2、接收完文件并校验后根据上位机的指令,重启,擦除旧程序,从外部Flash读取Hex的内容并写入到程序存储器ROM中;
3、程序更新成功则运行新程序,否则仍然运行旧程序(保存在外部Flash中);
因为受内存及ROM的限制,不能使用文件系统,有如下问题要请教下:
1、上位机发送HEX文件时,是按照hex文件的原格式发送吗?比如:一个hex文件的一行是这样的:
:10751E00A019D8A4120056EC2FF0000E0101A06F96,16个数据,起始地址是:0x751E,类型是数据,校验是:0x96,请问上位机在发送时是直接发送这些16进制吗(包括地址)?这个冒号不用发送吧?
2、上位机在发送hex文件时是一次发送一行hex文件内容好还是一次发送固定长度的字节呢?
3、单片机在保存上位机发送来的数据时以什么样的方式保存在外部Flash中比较好呢?每一行的hex内容如何和其他行的区别开来呢?就是在从外部Flash读取hex文件的内容时如何知道哪些数据写入到ROM的哪个区域及数据长度?
在此先谢谢大家了!
针对以上问题:建议你把hex文件转换为bin文件。
1.bin文件不需要解析,上位机直接读取bin文件的内容,直接发送给单片机。
2.上位机发送bin文件给单片,最好发送固定长度的字节数据,每次发送自定义帧格式,防止数据出错;
3.单片机RAM空间不知道有多大,建议先把bin文件放在RAM中,等bin文件收完再写入到flash中。flash一般是按page写入,写入之前还需要先擦除。
要实现2个镜像文件的启动,还需要修改二次bootloader,比较复杂的。
不建议直接传hex,
1,是因为hex文件本身是文本方式表示,通常是bin文件的2倍以上,传输效率低
2,直接传原始文件,会造成固件泄密
建议:
1,转成bin文件,并且加密
2,在bin文件里加上一个文件头,里面包含程序的相关信息,比如长度,校验,版本,适用硬件类型等。建议这个文件头也写入到单片机里,便于启动时候检查。
3,可以在ram里开辟一个写入缓冲区,每次来的数据先放到缓冲区,满一个页后,就写入一页,剩余不足一页的继续留在里面等后续数据。收到最后一帧数据后则直接写入。
4,如果是串口可以考虑用xmodem或ymodem之类的标准协议传输,如果是其他的,就自己定义吧,其实很多通讯接口都比串口方便,比如USB, wifi,蓝牙