优化uapi_tar_file,减少stack内存使用。
authorSnickerSun <snickersun@163.com>
Wed, 12 Jun 2024 13:32:15 +0000 (21:32 +0800)
committerSnickerSun <snickersun@163.com>
Wed, 12 Jun 2024 13:32:15 +0000 (21:32 +0800)
保存exctar文件时加入编译版本号方便以后查找

code/sdk/drivers/peripheral/utils/custom_utils.c
code/sdk/drivers/peripheral/utils/microtar.c

index 630eea7..8563dc7 100644 (file)
@@ -1615,20 +1615,20 @@ int uapi_delete_files(const char *file_path)
     }
         
 }
-
+#define  MAX_TAR_READ_BUF  1024
 int uapi_tar_file(const char *src_path,const char *tar_path,char *tarfilename)
 {
     //const char *tarfilePath = "%s/exc_%d.tar";
     DIR *dir;
     struct dirent *entry;
     mtar_t tar;
-    char buffer[1024];
     size_t bytesRead = 0;
     FILE *fp;
     struct stat file_inf;
     long tar_size = 0;
     int ret = 0;
-
+    char *buffer = malloc(MAX_TAR_READ_BUF);
+    if (buffer == NULL) return -1;
     if(access(src_path, F_OK) == -1)
     {
         PRINT("%s does not exist!!!\r\n", src_path);
@@ -1684,11 +1684,11 @@ int uapi_tar_file(const char *src_path,const char *tar_path,char *tarfilename)
             tar_size += file_inf.st_size;
             mtar_write_file_header(&tar, entry->d_name, file_inf.st_size);
 
-            while((bytesRead = fread(buffer, 1, sizeof(buffer), fp)) > 0)
+            while((bytesRead = fread(buffer, 1, MAX_TAR_READ_BUF, fp)) > 0)
             {
                 mtar_write_data(&tar, buffer, bytesRead);
                 
-                memset(buffer, 0, sizeof(buffer));
+                memset(buffer, 0, MAX_TAR_READ_BUF);
 
                 if (bytesRead < 1024 && !feof(fp)) 
                     continue;
@@ -1714,7 +1714,7 @@ int uapi_tar_file(const char *src_path,const char *tar_path,char *tarfilename)
         remove(str);
         return -1;
     }
-    //free(str);
+    free(buffer);
     return ret;
 }
 
@@ -1722,9 +1722,11 @@ int uapi_tar_file(const char *src_path,const char *tar_path,char *tarfilename)
 int uapi_save_exc(void)
 {
     uint32_t timestamp = get_local_timestamp();
-    char *tarfilePath = "exc_%d.tar";
+    char *tarfilePath = "exc_%s_%d.tar";
     char str[200] = {0};
-    sprintf(str, tarfilePath, timestamp);
+    char buildversion[64]={0};
+    uapi_get_buildversion((uint8_t*)&buildversion[0],sizeof(buildversion));
+    sprintf(str, tarfilePath,buildversion,timestamp);
     return uapi_tar_file("/user/exc","/user/tar",str);
 }
 
index 2e5bc40..5ad339e 100644 (file)
@@ -282,21 +282,27 @@ int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h) {
 
 int mtar_read_header(mtar_t *tar, mtar_header_t *h) {
   int err;
-  mtar_raw_header_t rh;
+  mtar_raw_header_t *rh = malloc(sizeof(mtar_raw_header_t));
+
+  if(rh == NULL) return MTAR_EFAILURE;
   /* Save header position */
   tar->last_header = tar->pos;
   /* Read raw header */
-  err = tread(tar, &rh, sizeof(rh));
+  err = tread(tar, rh, sizeof(mtar_raw_header_t));
   if (err) {
+    free(rh);    
     return err;
   }
   /* Seek back to start of header */
   err = mtar_seek(tar, tar->last_header);
   if (err) {
+    free(rh);
     return err;
   }
   /* Load raw header into header struct and return */
-  return raw_to_header(h, &rh);
+  err = raw_to_header(h, rh);  
+  free(rh);
+  return err;
 }
 
 
@@ -334,11 +340,14 @@ int mtar_read_data(mtar_t *tar, void *ptr, unsigned size) {
 
 
 int mtar_write_header(mtar_t *tar, const mtar_header_t *h) {
-  mtar_raw_header_t rh;
+  mtar_raw_header_t *rh=malloc(sizeof(mtar_raw_header_t));
+  if (rh == NULL) return MTAR_EFAILURE;
   /* Build raw header and write */
-  header_to_raw(&rh, h);
+  header_to_raw(rh, h);
   tar->remaining_data = h->size;
-  return twrite(tar, &rh, sizeof(rh));
+  int err = twrite(tar, rh, sizeof(mtar_raw_header_t));
+  free(rh);
+  return err;
 }