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); }