OTA升级--涂鸦

这段代码的作用概览

这是一段在固件升级场景下的协议处理逻辑(受 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 == 4dp_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 == 4dp_len == firm_length 来判定(最后一帧不带数据,只校对总长度)。

  • 每包实际数据字节数为 total_len - 4,必须不超过 firm_size

  • 任何长度异常会终止升级流程(清空 firm_update_flag)。

  • 变更小结

    • 解释了 system.cUPDATE_START_CMDUPDATE_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      

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值