这段代码的作用概览
这是一段在固件升级场景下的协议处理逻辑(受 SUPPORT_MCU_FIRM_UPDATE 宏控制)。处理两种命令:
UPDATE_START_CMD:开始升级,协商包大小并读取固件总长度。UPDATE_TRANS_CMD:接收并处理固件数据分包,判断是否最后一包并应答。
关键变量含义
PACKAGE_SIZE/firm_flag:升级包大小标识(0/1/2),分别对应256/512/1024字节。firm_size:根据PACKAGE_SIZE设定的单包最大有效负载大小。firm_length:固件总长度(从数据区读出的 4 字节大端值)。total_len:当前帧总数据长度字段(高低字节组合)。dp_len:本次携带的固件数据对应的总长度信息(从数据区读出的 4 字节大端值,最后一包时应与firm_length相等)。firmware_addr:当前帧中固件数据的指针(跳过数据区前 4 字节长度字段后)。firm_update_flag:升级流程状态标记。stop_update_flag:升级过程中暂停其他数据上报。ret:处理结果(SUCCESS/ERROR)。
处理流程细节
-
case UPDATE_START_CMD(升级开始)- 读取
PACKAGE_SIZE,映射出firm_size为 256/512/1024。 - 从
wifi_data_process_buf[offset + DATA_START ... +3]读取 4 字节,组装为固件总长度firm_length(大端拼接)。 - 调用
upgrade_package_choose(PACKAGE_SIZE)通知对端选择的包大小。 - 将
firm_update_flag置为UPDATE_START_CMD,进入升级中状态。
- 读取
-
case UPDATE_TRANS_CMD(升级传输)- 仅在已执行过开始命令时处理(
firm_update_flag == UPDATE_START_CMD)。 - 置
stop_update_flag = ENABLE,暂时停止其它数据上报。 - 解析长度字段:
total_len:由LENGTH_HIGH/LENGTH_LOW两字节组成。dp_len:从数据区读取 4 字节长度值(大端)。
- 计算数据指针
firmware_addr = wifi_data_process_buf + (offset + DATA_START + 4),即跳过前 4 字节长度域后,指向真正的固件数据。 - 分支判断:
- 若
total_len == 4且dp_len == firm_length:认为是最后一包(仅携带长度信息无数据),调用mcu_firm_update_handle(firmware_addr, dp_len, 0),并清除firm_update_flag结束流程。 - 否则若
(total_len - 4) <= firm_size:认为是正常数据包,调用mcu_firm_update_handle(firmware_addr, dp_len, total_len - 4)处理本包数据。 - 否则:数据长度异常,清除
firm_update_flag并置ret = ERROR。
- 若
- 若处理成功(
ret == SUCCESS),发送应答帧wifi_uart_write_frame(UPDATE_TRANS_CMD, MCU_TX_VER, 0)。 - 最后将
stop_update_flag = DISABLE,恢复数据上报。
- 仅在已执行过开始命令时处理(
要点与边界
-
包大小只支持 256/512/1024 三档,超出不处理。
-
最后一包通过
total_len == 4且dp_len == firm_length来判定(最后一帧不带数据,只校对总长度)。 -
每包实际数据字节数为
total_len - 4,必须不超过firm_size。 -
任何长度异常会终止升级流程(清空
firm_update_flag)。 -
变更小结
- 解释了
system.c中UPDATE_START_CMD与UPDATE_TRANS_CMD的升级开始、分包接收、最后一包判定与应答流程,以及关键变量与边界条件。
- 解释了
#ifdef SUPPORT_MCU_FIRM_UPDATE
case UPDATE_START_CMD: //升级开始
//获取升级包大小全局变量
firm_flag = PACKAGE_SIZE;
if(firm_flag == 0) {
firm_size = 256;
}else if(firm_flag == 1) {
firm_size = 512;
}else if(firm_flag == 2) {
firm_size = 1024;
}
firm_length = wifi_data_process_buf[offset + DATA_START];
firm_length <<= 8;
firm_length |= wifi_data_process_buf[offset + DATA_START + 1];
firm_length <<= 8;
firm_length |= wifi_data_process_buf[offset + DATA_START + 2];
firm_length <<= 8;
firm_length |= wifi_data_process_buf[offset + DATA_START + 3];
upgrade_package_choose(PACKAGE_SIZE);
firm_update_flag = UPDATE_START_CMD;
break;
case UPDATE_TRANS_CMD: //升级传输
if(firm_update_flag == UPDATE_START_CMD) {
//停止一切数据上报
stop_update_flag = ENABLE;
total_len = (wifi_data_process_buf[offset + LENGTH_HIGH] << 8) | wifi_data_process_buf[offset + LENGTH_LOW];
dp_len = wifi_data_process_buf[offset + DATA_START];
dp_len <<= 8;
dp_len |= wifi_data_process_buf[offset + DATA_START + 1];
dp_len <<= 8;
dp_len |= wifi_data_process_buf[offset + DATA_START + 2];
dp_len <<= 8;
dp_len |= wifi_data_process_buf[offset + DATA_START + 3];
firmware_addr = (unsigned char *)wifi_data_process_buf;
firmware_addr += (offset + DATA_START + 4);
if((total_len == 4) && (dp_len == firm_length)) {
//最后一包
ret = mcu_firm_update_handle(firmware_addr,dp_len,0);
firm_update_flag = 0;
}else if((total_len - 4) <= firm_size) {
ret = mcu_firm_update_handle(firmware_addr,dp_len,total_len - 4);
}else {
firm_update_flag = 0;
ret = ERROR;
}
if(ret == SUCCESS) {
wifi_uart_write_frame(UPDATE_TRANS_CMD, MCU_TX_VER, 0);
}
//恢复一切数据上报
stop_update_flag = DISABLE;
}
break;
#endif
5179

被折叠的 条评论
为什么被折叠?



