From f03adfa9e6294508c70fac8e5849d450095824cb Mon Sep 17 00:00:00 2001 From: "CSSC-WORK\\murmur" Date: Thu, 14 Sep 2023 17:30:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8F=91=E9=80=81=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=9A=84=E9=80=BB=E8=BE=91=E4=B8=BA=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=B0=E5=BE=85=E5=8F=91=E5=88=97=E8=A1=A8?= =?UTF-8?q?=20=E5=8F=91=E9=80=81=E7=94=B1mutex=E6=94=B9=E5=9B=9E=E4=B8=BAs?= =?UTF-8?q?em?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/cfg/cfg.c | 11 ++++++++- applications/core.c | 52 ++++++++++++++++++++++++++---------------- applications/getinfo.c | 5 ++++ 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/applications/cfg/cfg.c b/applications/cfg/cfg.c index dd58994..76e24f5 100644 --- a/applications/cfg/cfg.c +++ b/applications/cfg/cfg.c @@ -352,7 +352,16 @@ static int setFileToSend_thread_entry(void *parameter) // list_thread(); // return RT_EOK; } - +void manualAaddlst(char *f) +{ + nsetLock(); + int rst = ini_putl(SECTION_TO_SEND, f, 0, FILE_TO_SEND); + nclearLock(); + if (!rst) { + LOG_E("manual add file to send error."); + } + LOG_D("add %s-0 to list.",f); +} /** * 添加待发文件到列表 * @param fin diff --git a/applications/core.c b/applications/core.c index a7bff66..1e71e60 100644 --- a/applications/core.c +++ b/applications/core.c @@ -34,7 +34,7 @@ static struct rt_event chkSta; //发送条件,含两部分,1-超时或文件 rt_sem_t TTReady= RT_NULL;//天通具备发送状态后 rt_sem_release(TTReady); rt_sem_t cfgUpdate = RT_NULL;//配置文件更新 rt_sem_t shuntDownTT = RT_NULL;//关闭TT -rt_mutex_t okTosend = RT_NULL;//可以发送后续文件。仅一个线程,文件依次发送 +rt_sem_t okTosend = RT_NULL;//可以发送后续文件。仅一个线程,文件依次发送 rt_sem_t okToreport = RT_NULL;//配置信息ACK static rt_thread_t initThread=RT_NULL; static rt_thread_t deinitThread=RT_NULL; @@ -211,7 +211,7 @@ static void updatecfg(void) void sysSemInit() { - okTosend = rt_mutex_create("okTosend", RT_IPC_FLAG_FIFO);//同一时间仅一个线程发送文件 + okTosend = rt_sem_create("okTosend", 0, RT_IPC_FLAG_FIFO);//同一时间仅一个线程发送文件 cfgUpdate = rt_sem_create("cfgUpdate", 0, RT_IPC_FLAG_FIFO);//更新cfg shuntDownTT = rt_sem_create("shuntDNTT", 0, RT_IPC_FLAG_FIFO);//关闭TT okToreport = rt_sem_create("reportINFO", 0, RT_IPC_FLAG_FIFO);//关闭TT @@ -281,11 +281,19 @@ void fileIsReady(void) rt_event_send(&chkSta, FILE_IS_OK); stopTM(); } +static isTTok=0; void TTIsReady(void) { + isTTok=1; rt_event_send(&chkSta, TT_IS_OK); // resetTM(); } +void TTIsNotReady(void) +{ + isTTok=0; +// rt_event_send(&chkSta, TT_IS_OK); +// resetTM(); +} @@ -425,20 +433,20 @@ static void upSendFile_thread_entry(void *parameter) { FILE_INFO *f = RT_NULL; f = (FILE_INFO *) parameter; - rt_mutex_take(okTosend, RT_WAITING_FOREVER); +// rt_mutex_take(okTosend, RT_WAITING_FOREVER); static rt_uint8_t d[BUFFER_ROW][200] = { };//need static? static rt_uint8_t s[BUFFER_ROW] = { }; memset(s,0,BUFFER_ROW); if (!getFileSize(f->fname)) { LOG_W("file '%s' is empty.",f->fname); clearFileToSend(f->fname); - rt_mutex_release(okTosend); + rt_sem_release(okTosend); return; } if (getFileSize(f->fname) > scfg.maxSizePerFile+200) {//部分demo数据体积>>1k LOG_W("file '%s' is too large to send.",f->fname); clearFileToSend(f->fname); - rt_mutex_release(okTosend); + rt_sem_release(okTosend); return; } @@ -451,24 +459,32 @@ static void upSendFile_thread_entry(void *parameter) if (len) { LOG_D("%d pack(s) to send", f->index ? 1 : len); + uint8_t issendall=1; for (size_t var = 0; (var < len && s[var]!=0); var++) { if (!f->index || (var+1) == f->index) { //index=0 全发,或者仅发index if (sendMsg(d[var], s[var]) == RT_EOK) { LOG_D("send pack[%d] with %d bytes done.",var+1,s[var]); - }; + } + else { + issendall=0; + break; + } rt_thread_mdelay(3000);//发送间隔,目前服务器未处理,暂设为3s避免粘包 } } - LOG_I("upSendFile '%s' done.",f->fname); - clearFileToSend(f->fname);//由于没有准确的校核机制,此处自能认为是发送成功 + if (issendall) { + LOG_I("upSendFile '%s' done.",f->fname); + clearFileToSend(f->fname);//由于没有准确的校核机制,此处自能认为是发送成功 + } + // list_thread(); } //当前文件处理完后置位 - rt_mutex_release(okTosend); + rt_sem_release(okTosend); } /** @@ -515,13 +531,9 @@ void getAndSendFile() //优先发送未达指定大小的文件 char fnow[50]; getLstCacheFileName(fnow); - if (getFileSize(fnow)) {//有数据才发 - updateCacheFileName(); - LOG_I("send latest data first"); -// rt_mutex_take(okTosend, RT_WAITING_FOREVER); - upSendFile(fnow,0); -// rt_mutex_release(okTosend);//由upSendFile释放 - } + manualAaddlst(fnow); + updateCacheFileName(); + rt_thread_mdelay(1000); @@ -536,16 +548,16 @@ void getAndSendFile() return; } -// rt_sem_release(okTosend);//初始赋值 + rt_sem_release(okTosend);//初始赋值 static int index[MAX_KEY_LEN]; char f[cnt][MAX_KEY_LEN]; getFilesToSend(f, index); for (int i = cnt-1; i > -1; i--)//倒序发送 { -// LOG_D("f[%d]=%s",i,f[i]); + LOG_D("f[%d]=%s",i,f[i]); // continue; -// if (rt_mutex_take(okTosend, RT_WAITING_FOREVER) == RT_EOK) + if (rt_sem_take(okTosend, RT_WAITING_FOREVER) == RT_EOK) { rt_thread_mdelay(1000);//thread close upSendFile(f[i],index[i]); @@ -585,7 +597,7 @@ static void chkAndSendFile_thread_entry() LOG_I("TT准备就绪"); sendACK(); //当前固件底层未缓存待发数据,导致前几包数据可能丢失,暂时用延时规避 -// rt_thread_mdelay(1*60*1000); + rt_thread_mdelay(15*1000); getAndSendFile(); break; } diff --git a/applications/getinfo.c b/applications/getinfo.c index f0e809f..4696747 100644 --- a/applications/getinfo.c +++ b/applications/getinfo.c @@ -199,6 +199,7 @@ static void rulecheck(void) else { okCnt = 0; // LOG_W("不符合。"); + TTIsNotReady(); return; } if (okCnt >= scfg.minTTPeriCnt) { @@ -219,6 +220,10 @@ static void rulecheck(void) // } +} +size_t isTTok(void) +{ + return okCnt; } /* 数据解析 */ static void tt_parse(rt_uint8_t *data)