diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index cb0790b9de66..85bbbf42d53b 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -28,7 +28,7 @@ /* the number which is max stored line logs */ #ifndef ULOG_ASYNC_OUTPUT_STORE_LINES -#define ULOG_ASYNC_OUTPUT_STORE_LINES (ULOG_ASYNC_OUTPUT_BUF_SIZE * 3 / 2 / 80) +#define ULOG_ASYNC_OUTPUT_STORE_LINES (ULOG_ASYNC_OUTPUT_BUF_SIZE * 3 / 2 / 80) #endif #ifdef ULOG_USING_COLOR @@ -36,33 +36,33 @@ * CSI(Control Sequence Introducer/Initiator) sign * more information on https://en.wikipedia.org/wiki/ANSI_escape_code */ -#define CSI_START "\033[" -#define CSI_END "\033[0m" +#define CSI_START "\033[" +#define CSI_END "\033[0m" /* output log front color */ -#define F_BLACK "30m" -#define F_RED "31m" -#define F_GREEN "32m" -#define F_YELLOW "33m" -#define F_BLUE "34m" -#define F_MAGENTA "35m" -#define F_CYAN "36m" -#define F_WHITE "37m" +#define F_BLACK "30m" +#define F_RED "31m" +#define F_GREEN "32m" +#define F_YELLOW "33m" +#define F_BLUE "34m" +#define F_MAGENTA "35m" +#define F_CYAN "36m" +#define F_WHITE "37m" /* output log default color definition */ #ifndef ULOG_COLOR_DEBUG -#define ULOG_COLOR_DEBUG RT_NULL +#define ULOG_COLOR_DEBUG RT_NULL #endif #ifndef ULOG_COLOR_INFO -#define ULOG_COLOR_INFO (F_GREEN) +#define ULOG_COLOR_INFO (F_GREEN) #endif #ifndef ULOG_COLOR_WARN -#define ULOG_COLOR_WARN (F_YELLOW) +#define ULOG_COLOR_WARN (F_YELLOW) #endif #ifndef ULOG_COLOR_ERROR -#define ULOG_COLOR_ERROR (F_RED) +#define ULOG_COLOR_ERROR (F_RED) #endif #ifndef ULOG_COLOR_ASSERT -#define ULOG_COLOR_ASSERT (F_MAGENTA) +#define ULOG_COLOR_ASSERT (F_MAGENTA) #endif #endif /* ULOG_USING_COLOR */ @@ -285,7 +285,7 @@ rt_weak rt_size_t ulog_head_formater(char *log_buf, rt_uint32_t level, const cha tm = localtime_r(&t, &tm_tmp); /* show the time format MM-DD HH:MM:SS */ rt_snprintf(log_buf + log_len, ULOG_LINE_BUF_SIZE - log_len, "%02d-%02d %02d:%02d:%02d", tm->tm_mon + 1, - tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); + tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); /* check the microseconds support when kernel is startup */ if (t > 0 && !check_usec_support && rt_thread_self() != RT_NULL) { @@ -420,7 +420,7 @@ rt_weak rt_size_t ulog_tail_formater(char *log_buf, rt_size_t log_len, rt_bool_t } rt_weak rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *tag, rt_bool_t newline, - const char *format, va_list args) + const char *format, va_list args) { /* the caller has locker, so it can use static variable for reduce stack usage */ static rt_size_t log_len; @@ -449,7 +449,7 @@ rt_weak rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *ta rt_weak rt_size_t ulog_hex_formater(char *log_buf, const char *tag, const rt_uint8_t *buf, rt_size_t size, rt_size_t width, rt_base_t addr) { -#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') +#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') /* the caller has locker, so it can use static variable for reduce stack usage */ static rt_size_t log_len, j; static int fmt_result; @@ -592,14 +592,15 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons if (already_output == RT_FALSE) { rt_kprintf("Warning: There is no enough buffer for saving async log," - " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); + " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); already_output = RT_TRUE; } } } else if (ulog.async_rb) { - rt_ringbuffer_put(ulog.async_rb, (const rt_uint8_t *)log_buf, (rt_uint16_t)log_buf_size); + /* log_buf_size contain the tail \0, which will lead discard follow char, so only put log_buf_size -1 */ + rt_ringbuffer_put(ulog.async_rb, (const rt_uint8_t *)log_buf, (rt_uint16_t)log_buf_size - 1); /* send a notice */ rt_sem_release(&ulog.async_notice); } @@ -639,7 +640,7 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons * @param args variable argument list */ void ulog_voutput(rt_uint32_t level, const char *tag, rt_bool_t newline, const rt_uint8_t *hex_buf, rt_size_t hex_size, - rt_size_t hex_width, rt_base_t hex_addr, const char *format, va_list args) + rt_size_t hex_width, rt_base_t hex_addr, const char *format, va_list args) { static rt_bool_t ulog_voutput_recursion = RT_FALSE; char *log_buf = RT_NULL; @@ -793,8 +794,11 @@ void ulog_raw(const char *format, ...) fmt_result = rt_vsnprintf(log_buf, ULOG_LINE_BUF_SIZE, format, args); va_end(args); - /* calculate log length */ - if ((fmt_result > -1) && (fmt_result <= ULOG_LINE_BUF_SIZE)) + /* calculate log length + * rt_vsnprintf would add \0 to the end, push \0 to ulog.async_rb will discard the follow char + * if fmt_result = ULOG_LINE_BUF_SIZE, then the last char must be \0 + */ + if ((fmt_result > -1) && (fmt_result < ULOG_LINE_BUF_SIZE)) { log_len = fmt_result; } @@ -1358,7 +1362,7 @@ void ulog_async_output(void) { /* output to all backends */ ulog_output_to_all_backend(log_frame->level, log_frame->tag, log_frame->is_raw, log_frame->log, - log_frame->log_len); + log_frame->log_len); } rt_rbb_blk_free(ulog.async_rbb, log_blk); } @@ -1498,7 +1502,7 @@ int ulog_async_init(void) { /* async output thread */ ulog.async_th = rt_thread_create("ulog_async", async_output_thread_entry, &ulog, ULOG_ASYNC_OUTPUT_THREAD_STACK, - ULOG_ASYNC_OUTPUT_THREAD_PRIORITY, 20); + ULOG_ASYNC_OUTPUT_THREAD_PRIORITY, 20); if (ulog.async_th == RT_NULL) { rt_kprintf("Error: ulog init failed! No memory for async output thread.\n");