From df259f93501bec3a850f9d4149709405eba87292 Mon Sep 17 00:00:00 2001 From: ShallowGreen123 <2608653986@qq.com> Date: Mon, 9 Jan 2023 22:40:29 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F=EF=BC=8C=E5=86=99?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=B0=E5=AD=98=E5=82=A8=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=97=A0=E6=95=88=E7=9A=84=E7=8E=87=E4=B8=BA?= =?UTF-8?q?=200.167%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/data_struct/queue_malloc.c | 29 ++++++------ LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c | 7 +++ LVGL.Simulator/lvgl_mydemo/lvgl_app.c | 44 ++++++++++++------- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.c b/LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.c index b52eb34..d425ab2 100644 --- a/LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.c +++ b/LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.c @@ -34,18 +34,13 @@ void *QueueMallocInput(queue_t *q, void *val, val_size valSize) return NULL; } - if (DEF_QUEUE_RESERVE_SIZE(q) < valSize) { // 没有足够的空间保存这个数据 - return NULL; - } - if (q->elemCnt > 0) { bufPos = q->tail + DEF_QUEUE_GET_VAL_SIZE(q, q->tail); if (q->tail >= q->front) { // tail 在 front 后面,队列还没有循环 - if (((q->bufSize - bufPos) < needSize) && (q->front < needSize)) { - return NULL; // 空间虽然足够,但是一部分在头,一部分在末尾,不连续 - } if (q->bufSize - bufPos < needSize) { - DEF_QUEUE_SET_VAL_SIZE(q, bufPos, DEF_QUEUE_VAL_LEN_INVAILD); + if (bufPos + sizeof(val_size) <= q->bufSize) { + DEF_QUEUE_SET_VAL_SIZE(q, bufPos, DEF_QUEUE_VAL_LEN_INVAILD); + } bufPos = 0; } } else { // front 在 tail 后面,队列已经循环 @@ -78,18 +73,20 @@ void *QueueMallocOutput(queue_t *q, val_size *size) if (size) { *size = DEF_QUEUE_GET_VAL_SIZE(q, q->front); } - dataSize = DEF_QUEUE_GET_VAL_SIZE(q, q->front) + sizeof(val_size); + dataSize = DEF_QUEUE_GET_VAL_SIZE(q, q->front); value = &q->buf[q->front + sizeof(val_size)]; q->front += dataSize; - if (DEF_QUEUE_GET_VAL_SIZE(q, q->front) == DEF_QUEUE_VAL_LEN_INVAILD) { - q->front = 0; - } - q->usedSize -= dataSize; q->elemCnt--; + if ((q->elemCnt == 0) + || (q->front + sizeof(val_size) >= q->bufSize) + || (DEF_QUEUE_GET_VAL_SIZE(q, q->front) == DEF_QUEUE_VAL_LEN_INVAILD)) { + q->front = 0; + } + return value; } @@ -103,8 +100,8 @@ bool QueueMallocSpaceChk(queue_t *q, val_size size) } if (q->elemCnt > 0) { + bufPos = q->tail + DEF_QUEUE_GET_VAL_SIZE(q, q->tail); if (q->tail >= q->front) { - bufPos = q->tail + DEF_QUEUE_GET_VAL_SIZE(q, q->tail); if ((q->bufSize - bufPos < needSize) && (q->front < needSize)) { return false; } @@ -138,6 +135,10 @@ void *QueueMallocPeekAfter(queue_t *q, void *cur_item, val_size *size) return NULL; } + if (bufPos + sizeof(val_size) >= q->bufSize) { + bufPos = 0; + } + bufPos = bufPos + DEF_QUEUE_GET_VAL_SIZE(q, bufPos); itemSize = DEF_QUEUE_GET_VAL_SIZE(q, bufPos); if (itemSize == DEF_QUEUE_VAL_LEN_INVAILD) { diff --git a/LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c b/LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c index 0af80ca..a8327a0 100644 --- a/LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c +++ b/LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c @@ -101,6 +101,13 @@ void Lib_LogPrintf(uint8_t level, const char *fmt, ...) Lib_LogUnlock(); #if DEF_LIB_LOG_PRINTF + // static uint32_t t = 0; + // static uint32_t err = 0; + // uint32_t len = strlen(log_item->Buf); + // if (len == 0) { + // err++; + // } + // printf("File[%d] e=%d %s\n", t++, err, log_item->Buf); printf("%s\n", log_item->Buf); #endif } diff --git a/LVGL.Simulator/lvgl_mydemo/lvgl_app.c b/LVGL.Simulator/lvgl_mydemo/lvgl_app.c index d2ba906..129b4ac 100644 --- a/LVGL.Simulator/lvgl_mydemo/lvgl_app.c +++ b/LVGL.Simulator/lvgl_mydemo/lvgl_app.c @@ -36,21 +36,36 @@ static void log_write_timer_cb(lv_timer_t *t) Lib_LogLoop(); } -static bool log_write_to_file(LIB_LOG_ITEM_T *item) +void log_create_event_cb(lv_timer_t *t) { - printf("File %s\n", item->Buf); - return true; + LV_UNUSED(t); + uint32_t i; + uint32_t rand = lv_rand(3, 100); + uint8_t buf[102] = {0}; + + for (i = 0; i < rand; i++) { + buf[i] = '*'; + } + buf[i + 1] = '\0'; + + TRACE_I("%s\n", buf); // 随机添加长度为(3-100)的日志 } -static bool log_write_to_flash(LIB_LOG_ITEM_T *item) +static bool log_write_to_file(LIB_LOG_ITEM_T *item) // 日志写回调函数 { - printf("Flash %s\n", item->Buf); - return true; -} - -static bool log_write_to_sd(LIB_LOG_ITEM_T *item) -{ - printf("Sd %s\n", item->Buf); + // erroe rate = 134 / 80244 : 0.0016699067843079 + /** + * 测试结果,向日志系统中写入了80244条日志, + * 无效的日志为134条,日志无效概率为: + * 0.167% + */ + static uint32_t t = 0; + static uint32_t err = 0; //记录日志写回调函数中无效日志的个数 + uint32_t len = strlen(item->Buf); + if (len == 0) { + err++; + } + printf("File[%d] e=%d %s\n", t++, err, item->Buf); return true; } @@ -62,11 +77,7 @@ void lvgl_app_init(void) { Lib_LogInit(); - Lib_LogRegistWriter(log_write_to_file); // 模拟写日志到文件 - Lib_LogRegistWriter(log_write_to_flash); // 模拟写日志到Flash - Lib_LogRegistWriter(log_write_to_sd); // 模拟写日志到SD卡 - - Lib_LogUnregistWriter(log_write_to_sd); + Lib_LogRegistWriter(log_write_to_file); // 模拟写日志到文件 DataModelInit(); @@ -76,4 +87,5 @@ void lvgl_app_init(void) TRACE_W("Hello wrold!"); lv_timer_create(log_write_timer_cb, 50, NULL); + lv_timer_create(log_create_event_cb, 100, NULL); }