perf(vd960DBN): OTA RAM 优化 — union 复用块缓冲 + 命令分支数组改 static

MRS 编译 RAM 90.02% (44248/48KB) 逼近历史 .bss 挤栈红线, 减负:
- ota_srv.c: _chunk_buf[256] + _fs_frame[254] 合并为 union (下载/校验与刷写帧
  互斥复用, 省 ~260B static); ota_send_9f 组帧直接用 union 缓冲 (省 254B 栈)
- iot_mqtt_srv.c: 6 个 ota_* 分支 resp[256~400] + ota_data hexbuf[513] 局部栈
  数组改 static (栈峰值 → BSS, 防运行时栈溢出; RAM 总量不变但运行时安全)

验证: gcc 隔离单测 9/9 全过; 语法 0 新增错误
This commit is contained in:
wangfq
2026-08-20 13:41:33 +08:00
parent 49736c341c
commit 0b51d84a9b
2 changed files with 28 additions and 27 deletions
@@ -710,7 +710,7 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_
} else if (strcmp(cmd_str, "ota_begin") == 0) {
/* V1.08: 开启 OTA 会话 / 断点续传定位 (Loop MCU 远程 OTA, 先存后刷) */
char resp[400];
static char resp[400]; /* static: RAM 90% 下防栈峰值 (历史 .bss 挤栈事故) */
uint32_t size = 0, crc32 = 0;
char version[16] = {0};
uint8_t force = 0;
@@ -750,8 +750,8 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_
} else if (strcmp(cmd_str, "ota_data") == 0) {
/* V1.08: 分片下发 (256B/片, 单片 CRC32; 重复片幂等, 乱序拒收指示续传) */
char resp[400];
char hexbuf[512 + 1];
static char resp[400];
static char hexbuf[512 + 1]; /* 512 hex 最大, static 防栈峰值 */
const char *hp;
uint32_t offset = 0, crc32 = 0;
int rc;
@@ -793,7 +793,7 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_
} else if (strcmp(cmd_str, "ota_end") == 0) {
/* V1.08: 结束下载, 全镜像 CRC32 复核 */
char resp[300];
static char resp[300];
uint32_t crc32 = 0;
int rc;
memset(tmp, 0, sizeof(tmp));
@@ -827,7 +827,7 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_
} else if (strcmp(cmd_str, "ota_abort") == 0) {
/* V1.08: 中止会话, 释放暂存 */
char resp[256];
static char resp[256];
int rc = ota_cmd_abort();
snprintf(resp, sizeof(resp),
"{\"msg_id\":%lu,\"cmd\":\"ota_abort\",\"ts\":%lu,\"code\":%d,\"msg\":\"%s\"}",
@@ -837,7 +837,7 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_
} else if (strcmp(cmd_str, "ota_flash") == 0) {
/* V1.08: 触发本地 ISP 刷写 (同步安全检查 → 异步执行) */
char resp[300];
static char resp[300];
char slot_buf[8] = {0};
uint8_t slot = 0, force = 0;
int rc;
@@ -868,7 +868,7 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_
} else if (strcmp(cmd_str, "ota_status") == 0) {
/* V1.08: 查询 OTA 状态 (含刷写进度) */
char resp[400];
static char resp[400];
const OtaMeta *m = ota_meta();
snprintf(resp, sizeof(resp),
"{\"msg_id\":%lu,\"cmd\":\"ota_status\",\"ts\":%lu,\"code\":0,\"msg\":\"success\","