ソースを参照

版本号为:2.1.0.13,修复Fota升级问题,Fota升级重启原因:指针未进行初始化。

CHENJIE-PC\QiXiang_CHENJIE 3 年 前
コミット
06e8430549
3 ファイル変更32 行追加23 行削除
  1. 1 1
      inc/TcpTask.h
  2. 18 13
      src/Fota.c
  3. 13 9
      src/TcpTask.c

+ 1 - 1
inc/TcpTask.h

@@ -8,7 +8,7 @@
  ****************************************************************************/
 #include "app.h"
 extern UINT32 TcpService;
-#define PROC_TCP_TASK_STACK_SIZE           (2048)
+#define PROC_TCP_TASK_STACK_SIZE           (2048+1024)
 #define QMSG_ID_BASE               (0x160) 
 #define QMSG_ID_NW_IP_READY        (QMSG_ID_BASE)
 #define QMSG_ID_NW_IP_SUSPEND      (QMSG_ID_BASE + 1)

+ 18 - 13
src/Fota.c

@@ -14,17 +14,17 @@
 #include "os_exception.h"
 #include "flash_ec616_rt.h"
 extern AppNVMDataType AppNVMData;
-static Fota_Type Fota_S;
 static UINT8 bcc_chk_fota(UINT8* data, UINT8 length);
 static UINT8 Fota_crc_chk(UINT8* data,UINT8 length);
 volatile bool NB_Fota_update_flag = FALSE; //NB可以升级标志
 volatile bool BMS_Fota_update_flag = FALSE; //NB可以升级标志
 void Fota_Func(UINT8 *DataPtr,INT32 connectId)
 {
+    Fota_Type Fota_S;
     UINT8 Fota_Answer[43];
     UINT8 Fota_Cmd;
     INT8 ret;
-    UINT8* Data_Read_Buffer;
+    UINT8* Data_Read_Buffer=PNULL;
     UINT8 Data_Read_Crc;
     if(*(DataPtr+30)==0x01)
     {
@@ -46,7 +46,7 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                 else
                 {
                     Fota_Answer[3] = 0x01;
-                    BSP_QSPI_Erase_Safe(Fota_S.Fota_Flash_Addres,Fota_S.Fota_All_Data_Len + 4 - (Fota_S.Fota_All_Data_Len%4)); //512k-32k = 480k -> 0x75300  0x78000
+                    BSP_QSPI_Erase_Safe(Fota_S.Fota_Flash_Addres,(FLASH_BMS_FOTA_START_ADDR - FLASH_FOTA_REGION_START)); //512k-32k = 480k -> 0x75300  0x78000
                 }
                 memcpy(&Fota_Answer[4],(DataPtr+4),BATT_SN_LEN);
                 Fota_Answer[21] = TCP_ENCPT_DISABLE;
@@ -65,26 +65,25 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                 memset(Fota_S.Fota_Recv_Data,0x00,100);
                 memcpy(Fota_S.Fota_Recv_Data,(DataPtr+42),*(DataPtr+41));
                 Fota_S.Fota_CRC = Fota_crc_chk(Fota_S.Fota_Recv_Data,Fota_S.Fota_Recv_Data_Len);
-                if(Fota_S.Fota_CRC == *(DataPtr+Fota_S.Fota_Recv_Data_Len+42))
+                Data_Read_Buffer = malloc(Fota_S.Fota_Recv_Data_Len+1);
+                if(Fota_S.Fota_CRC == *(DataPtr+Fota_S.Fota_Recv_Data_Len+42)||Data_Read_Buffer!=PNULL)
                 {
                     if(Fota_S.Fota_Recv_Data_Len%4!=0)
                     {
                     Fota_S.Fota_Recv_Data_Len = Fota_S.Fota_Recv_Data_Len + 4-(Fota_S.Fota_Recv_Data_Len%4);
                     }
                     BSP_QSPI_Write_Safe(Fota_S.Fota_Recv_Data,Fota_S.Fota_Flash_Addres+Fota_S.Fota_Current_Addres,Fota_S.Fota_Recv_Data_Len);
-                    Data_Read_Buffer = malloc(Fota_S.Fota_Recv_Data_Len);
+                    memset(Data_Read_Buffer,0x00,Fota_S.Fota_Recv_Data_Len);
                     BSP_QSPI_Read_Safe(Data_Read_Buffer,Fota_S.Fota_Flash_Addres+Fota_S.Fota_Current_Addres,Fota_S.Fota_Recv_Data_Len);
                     Data_Read_Crc = Fota_crc_chk(Data_Read_Buffer,Fota_S.Fota_Recv_Data_Len);
                     #ifdef USING_PRINTF
-                        printf("\n\n\n");
-                        UINT8 temp[1];
+                        printf("Data_Read_Buffer:\n");
                         for(int i=0;i<Fota_S.Fota_Recv_Data_Len;i++)
                         {
                             printf("%x  ",*(Data_Read_Buffer+i));
                         }    
-                        printf("\n\n\n");
+                        printf("\n");
                     #endif
-                    free(Data_Read_Buffer);
                     if(Data_Read_Crc==Fota_S.Fota_CRC )
                     {
                         Fota_Answer[3] = 0x01;
@@ -99,6 +98,9 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                 {
                     Fota_Answer[3] = 0x02;
                 }
+                if(Data_Read_Buffer!=PNULL)
+                    free(Data_Read_Buffer);
+                Data_Read_Buffer =PNULL;
                 memcpy(&Fota_Answer[4],(DataPtr+4),BATT_SN_LEN);
                 Fota_Answer[21] = TCP_ENCPT_DISABLE;
                 Fota_Answer[22] = 0x00;
@@ -175,7 +177,7 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                 tcpipConnectionSend(connectId,Fota_Answer,43,0,0,0);
                 if(Fota_Answer[3] == 0x01)
                 {
-                    BSP_QSPI_Erase_Safe(Fota_S.Fota_Flash_Addres,Fota_S.Fota_All_Data_Len + 4 - (Fota_S.Fota_All_Data_Len%4)); //512k-32k = 480k -> 0x75300  0x78000
+                    BSP_QSPI_Erase_Safe(Fota_S.Fota_Flash_Addres,(FLASH_BMS_FOTA_END_ADDR - FLASH_BMS_FOTA_START_ADDR)); //512k-32k = 480k -> 0x75300  0x78000
                 }
                 break;
             }
@@ -187,14 +189,15 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                 memset(Fota_S.Fota_Recv_Data,0x00,100);
                 memcpy(Fota_S.Fota_Recv_Data,(DataPtr+42),*(DataPtr+41));
                 Fota_S.Fota_CRC = Fota_crc_chk(Fota_S.Fota_Recv_Data,Fota_S.Fota_Recv_Data_Len);
-                if(Fota_S.Fota_CRC == *(DataPtr+Fota_S.Fota_Recv_Data_Len+42))
+                Data_Read_Buffer = malloc(Fota_S.Fota_Recv_Data_Len);
+                if(Fota_S.Fota_CRC == *(DataPtr+Fota_S.Fota_Recv_Data_Len+42)||Data_Read_Buffer!=PNULL)
                 {
                     if(Fota_S.Fota_Recv_Data_Len%4!=0)
                     {
                     Fota_S.Fota_Recv_Data_Len = Fota_S.Fota_Recv_Data_Len + 4-(Fota_S.Fota_Recv_Data_Len%4);
                     }
                     BSP_QSPI_Write_Safe(Fota_S.Fota_Recv_Data,Fota_S.Fota_Flash_Addres+Fota_S.Fota_Current_Addres,Fota_S.Fota_Recv_Data_Len);
-                    Data_Read_Buffer = malloc(Fota_S.Fota_Recv_Data_Len);
+                    
                     BSP_QSPI_Read_Safe(Data_Read_Buffer,Fota_S.Fota_Flash_Addres+Fota_S.Fota_Current_Addres,Fota_S.Fota_Recv_Data_Len);
                     Data_Read_Crc = Fota_crc_chk(Data_Read_Buffer,Fota_S.Fota_Recv_Data_Len);
                     #ifdef USING_PRINTF1
@@ -206,7 +209,6 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                         }    
                         printf("\n\n\n");
                     #endif
-                    free(Data_Read_Buffer);
                     if(Data_Read_Crc==Fota_S.Fota_CRC )
                     {
                         Fota_Answer[3] = 0x01;
@@ -221,6 +223,9 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                 {
                     Fota_Answer[3] = 0x02;
                 }
+                if(Data_Read_Buffer!=PNULL)
+                    free(Data_Read_Buffer);
+                Data_Read_Buffer =PNULL;
                 memcpy(&Fota_Answer[4],(DataPtr+4),BATT_SN_LEN);
                 Fota_Answer[21] = TCP_ENCPT_DISABLE;
                 Fota_Answer[22] = 0x00;

+ 13 - 9
src/TcpTask.c

@@ -81,7 +81,7 @@ static void TcpTask(void* arg)
     }
     if(TcpRecvHandle == NULL)
 	{
-		TcpRecvHandle = osMessageQueueNew(1,sizeof(TcpipConnectionRecvDataInd*), NULL);
+		TcpRecvHandle = osMessageQueueNew(2,sizeof(TcpipConnectionRecvDataInd*), NULL);
 	}
     if(Error_Mutex == NULL)
     {
@@ -572,7 +572,7 @@ static void TcpDataInfoAssembleSend()
     if(send_counter==0)//发送本次文件中的调试信息
     {
         DebugMsgtoTcpType DebugMsgInfo;
-        UINT8 *SendBuffer = PNULL;
+        UINT8 *SendBuffer = NULL;
         UINT16 BufferLen = 0;
         BufferLen = Debug_GetSize();
         if(BufferLen>200)
@@ -638,7 +638,7 @@ static void TcpDataInfoAssembleSend()
 //Tcp数据接收处理函数
 static void TcpDataInfoRecvHandle()
 {
-    TcpipConnectionRecvDataInd *TcpRecvData;
+    TcpipConnectionRecvDataInd *TcpRecvData=NULL;
     osMessageQueueGet(TcpRecvHandle,&TcpRecvData,0,0);
     osDelay(100);
     Uart_Write_Data_Type UartWriteCmd;
@@ -650,7 +650,7 @@ static void TcpDataInfoRecvHandle()
     UINT8 TcpCmdAnswer[31];
     TcpCmdAnswer[0] = TCP_START_SYM1;
     TcpCmdAnswer[1] = TCP_START_SYM1;
-    if(TcpRecvData != PNULL)
+    if(TcpRecvData!=NULL&&TcpRecvData->length!=0)
     {
         Ptr = TcpRecvData->data;
         if((*(Ptr+0)==TCP_START_SYM1)&&(*(Ptr+1)==TCP_START_SYM2))//服务器起始信息
@@ -733,8 +733,12 @@ static void TcpDataInfoRecvHandle()
                 }
             }
         }
-    free(TcpRecvData); 
     }
+    if(TcpRecvData!=NULL)
+    {
+        free(TcpRecvData);
+    }
+    TcpRecvData = NULL;
 }
 //TCP发送校验函数
 UINT8 bcc_chk(UINT8* data, UINT8 length)
@@ -884,7 +888,7 @@ static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEve
             TcpipConnectionRecvDataInd *rcvInd;
             TcpipConnectionRecvDataInd *rcvbuffer = NULL;
             rcvInd = (TcpipConnectionRecvDataInd *)bodyEvent;
-            if(rcvInd != PNULL)
+            if(rcvInd != NULL)
             {
                 rcvbuffer = malloc(sizeof(TcpipConnectionRecvDataInd));
                 memcpy(rcvbuffer,rcvInd,sizeof(TcpipConnectionRecvDataInd));
@@ -894,9 +898,9 @@ static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEve
                     uint8_t* Ptr;
                     Ptr=rcvInd->data;
                     printf("socket connection %u receive length %u data:", rcvInd->connectionId, rcvInd->length);
-                    for(int i = 0;i<rcvInd->length;i++)
-                        printf("%x  ",*(Ptr+i));
-                    printf("\n");
+                    // for(int i = 0;i<rcvInd->length;i++)
+                    //     printf("%x  ",*(Ptr+i));
+                    // printf("\n");
                 #endif
                 ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_5, P_INFO, 2, "socketAppConnectionCallBack socket connection %u receive length %u data", rcvInd->connectionId, rcvInd->length);
             }