fix(log) reduce the stack usage in log function (#2649)

* fix(log): change fwrite to puts since not all platform support fwrite

This reverts commit 539388a66f.

* fix(log): don't call printf and custom_print_cb at the same time

* fix(log): remove 768B temp buffer if LV_LOG_PRINTF == 1

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* feat(printf): support %pV format specifier

to support the recursive print:
https://www.kernel.org/doc/html/latest/core-api/printk-formats.html

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>

* fix(log): save 256B temp buffer if LV_LOG_PRINTF == 0

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao
2021-10-14 07:02:41 -07:00
committed by GitHub
parent 2a701eeaa7
commit b1416369ae
3 changed files with 43 additions and 10 deletions

View File

@@ -72,9 +72,6 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, const char *
if(level >= LV_LOG_LEVEL) {
va_list args;
va_start(args, format);
char msg[256];
lv_vsnprintf(msg, sizeof(msg), format, args);
va_end(args);
/*Use only the file name not the path*/
size_t p;
@@ -85,23 +82,43 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, const char *
}
}
char buf[512];
uint32_t t = lv_tick_get();
static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"};
lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %s \t(in %s line #%d)\n",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, msg, &file[p], line);
#if LV_LOG_PRINTF
printf("[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: ",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func);
vprintf(format, args);
printf(" \t(in %s line #%d)\n", &file[p], line);
#else
if (custom_print_cb) {
char buf[512];
#if LV_SPRINTF_CUSTOM
char msg[256];
lv_vsnprintf(msg, sizeof(msg), format, args);
lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %s \t(in %s line #%d)\n",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, msg, &file[p], line);
#else
lv_vaformat_t vaf = {format, &args};
lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %pV \t(in %s line #%d)\n",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, &vaf, &file[p], line);
#endif
custom_print_cb(buf);
}
#endif
last_log_time = t;
lv_log(buf);
va_end(args);
}
}
void lv_log(const char * buf)
{
#if LV_LOG_PRINTF
fwrite(buf, 1, strlen(buf), stdout);
#endif
puts(buf);
#else
if(custom_print_cb) custom_print_cb(buf);
#endif
}
/**********************