ZARD渐空 发表于 2025-9-19 16:38:52

关于空中OTA的疑问

<p>现在用到一个4G模块,MCU用的是STC8H4K64TL,想通过,服务器-4G模块-串口,这种方式进行空中OTA</p>
<p>问题点:目前用户程序写了20K左右,剩下40K空间够不够通过以上方式来空中OAT呢?<br />
<img src="data/attachment/forum/202509/19/163206jf1vdjj44vzr9a41.png" alt="image.png" title="image.png" /></p>
<p>HEX文件大小实际上是58KB,剩下的空间跟HEX文件大小有没有关系?<br />
<img src="data/attachment/forum/202509/19/163702mz44malqmaymaoon.png" alt="image.png" title="image.png" /></p>

国芯人工智能 发表于 2025-9-19 16:43:00

您好,关于您提到的空中OTA(Over-The-Air)升级问题,以下是针对您当前使用STC8H4K64TL MCU、4G模块实现串口OTA升级的详细分析与建议:

一、关于MCU Flash空间是否足够进行OTA升级

您提到MCU型号为 STC8H4K64TL,其Flash容量为 64KB,当前用户程序占用了约 20KB,剩余 40KB 空间。您计划通过 服务器→4G模块→串口→MCU 的方式实现OTA升级。

1. HEX文件大小与Flash占用的关系

您提到当前的HEX文件大小为 58KB,这通常包含了以下内容:
代码段(.text)
初始化数据段(.data)
配置信息(如启动代码、中断向量表等)
填充字节(可能为了对齐或保留空间)

但实际烧录到MCU Flash中的是 可执行代码和数据,并非整个HEX文件都必须一次性加载到内存中。因此,HEX文件大小 ≠ 实际运行时占用Flash空间的大小。

通常,实际占用Flash的大小应小于或等于HEX文件中代码段的实际长度。因此,建议您查看编译器生成的 map文件 或 列表文件(.lst/.map),确认实际代码与数据占用的Flash空间。若实际占用空间小于40KB,则剩余空间是足够的。

2. OTA升级机制对Flash空间的需求

OTA升级通常需要以下空间:
当前运行程序区(App)
OTA升级缓存区 / 新程序存储区
Bootloader(引导程序)

若采用 单Bank方案(无双Bank机制),则需要在Flash中预留一块空间用于暂存新固件。若采用 双Bank方案(Dual-Bank),则可以将新固件写入另一个Bank,重启后切换运行。

但STC8H系列MCU不支持硬件双Bank机制,因此需采用 单Bank + Bootloader + App 的方式:
Bootloader:负责接收OTA数据并写入Flash
App:当前运行的用户程序
OTA数据缓存区:用于暂存接收的固件数据

假设Bootloader占用2KB,OTA缓存区预留8KB,则用户程序最大可用空间约为64KB - 2KB - 8KB = 54KB,而您当前用户程序仅占用20KB,剩余空间为40KB,理论上是足够的。

二、关于OTA升级实现方式的可行性分析

您希望采用 服务器→4G模块→串口→MCU 的方式实现OTA升级,这种方式是可行的,但需要注意以下几个关键点:

1. 通信协议与数据完整性
数据传输方式:通过4G模块接收服务器下发的固件数据,经串口传输至MCU,需确保数据完整性和校验机制。
推荐方式:使用基于TCP/IP的可靠传输协议(如HTTP/FTP),并在MCU端对接收数据进行CRC32校验,确保固件完整无误后再写入Flash。

2. 固件分包与重组机制

由于串口通信速率和MCU内存限制,通常固件需分包传输。MCU需具备以下能力:
接收数据包并缓存
校验包头、包序号、数据长度、CRC
按地址写入Flash指定位置
支持断点续传或重传机制(可选)

3. Flash写入与擦除机制

Flash写入前需先擦除,且擦除单位通常为扇区(如1KB或2KB)。因此,OTA升级时需按扇区进行擦写,避免影响当前运行的Bootloader或正在运行的App。

建议将Flash划分为以下区域:

| 区域 | 地址范围 | 用途 |
|------|----------|------|
| Bootloader | 0x0000 - 0x0800(2KB) | 引导程序,负责OTA |
| App | 0x0800 - 0xF000(约58KB) | 用户程序 |
| OTA缓存区 | 0xF000 - 0xFFFF(4KB) | 存放接收的固件数据 |

4. 安全性与回滚机制
建议在升级完成后进行完整性校验(如CRC或SHA256),确认无误后再跳转运行。
若升级失败,应保留旧版本程序,支持回滚机制,避免设备“变砖”。

三、关于HEX文件大小与Flash剩余空间的关系总结

| 项目 | 内容 |
|------|------|
| MCU型号 | STC8H4K64TL |
| Flash总容量 | 64KB |
| 当前程序占用 | ~20KB |
| 剩余空间 | ~40KB |
| HEX文件大小 | 58KB |
| 实际Flash占用 | < 58KB(取决于代码段大小) |
| OTA所需空间 | Bootloader(2KB)+ OTA缓存(8KB) |
| 可用空间 | 64KB - 2KB - 8KB = 54KB |
| 结论 | 剩余40KB空间足够用于OTA升级 |

四、建议与优化方向

1. 优化Bootloader大小:尽量精简Bootloader代码,减少占用空间。
2. 使用压缩算法:若固件较大,可考虑使用LZ77、RLE等压缩算法,减少传输量。
3. 使用差分升级(Delta Update):仅传输与旧版本差异部分,减少升级包体积。
4. 加入OTA状态指示:如LED闪烁、串口打印等,便于调试与用户反馈。
5. 增加OTA加密机制:防止固件被非法篡改或窃取。

五、结语

综上所述,您当前的Flash空间是足够的,只要合理划分Flash区域、实现OTA升级逻辑,并确保数据完整性与安全性,完全可以通过 4G模块 + 串口 + Bootloader 的方式实现OTA升级。

如需进一步技术支持,如Bootloader编写、OTA协议设计、Flash操作示例等,欢迎继续交流!

祝项目顺利!

国芯人工智能 敬上

[本文内容由国芯人工智能辅助生成,仅供参考]

AI-32位8051 发表于 2025-9-19 16:46:45

如下,拿去简单改下通信协议就行了,STC 是ISP/IAP的全球领导者


深圳国芯人工智能有限公司-在线升级https://www.stcai.com/zxsj

小飞侠 发表于 2025-9-19 17:00:30

程序大小跟HEX文件大小没有关系?

DebugLab 发表于 2025-9-21 19:02:28

HEX文件大小无意义,要转换为BIN文件再看

ZARD渐空 发表于 2025-9-22 09:13:09

DebugLab 发表于 2025-9-21 19:02
HEX文件大小无意义,要转换为BIN文件再看

如果转换出来的bin文件<剩下的程序空间,那就可以正常OTA是吗?

DebugLab 发表于 2025-9-22 10:05:51

ZARD渐空 发表于 2025-9-22 09:13
如果转换出来的bin文件

还需要确定HEX是不包含空白区域的

ZARD渐空 发表于 2025-9-22 11:09:03

DebugLab 发表于 2025-9-22 10:05
还需要确定HEX是不包含空白区域的

不理解,可以展开解释一下吗?

DebugLab 发表于 2025-9-22 13:03:45

ZARD渐空 发表于 2025-9-22 11:09
不理解,可以展开解释一下吗?


可以用ISP软件打开HEX再保存为BIN
HEX是地址不连续的
打开后可能出现这种情况
大面积的0xFF空白区域
这种情况下保存的BIN是很大的




ZARD渐空 发表于 2025-9-22 13:49:37

DebugLab 发表于 2025-9-22 13:03
可以用ISP软件打开HEX再保存为BIN
HEX是地址不连续的
打开后可能出现这种情况


哦~理解了,不过了那个bin文件,我是直接从Keil5那里编译出来的,然后用ISP分别打开bin和hex,发现代码长度和校验和都一样的,所以就不用再通过ISP打开HEX重新保存数据为bin了。
页: [1] 2
查看完整版本: 关于空中OTA的疑问