既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
#ifndef LOG\_H
#define LOG\_H
#ifdef \_\_cplusplus
extern "C" {
#endif
#define LOG\_BUF\_SIZE 1024
typedef long long (\*get_sys_time_ms_def)(void);
enum log_color
{
COLOR_NULL = 0,
RED = 1,
GREEN = 2,
YELLOW = 3,
BLUE = 4
};
void log\_print(enum log_color color, const char \*file, int line, const char \*func, const char\* fmt, ...);
void log\_time\_register(get_sys_time_ms_def p_get_sys_time_ms);
#define LOG\_D(...) log\_print(BLUE, \_\_FILE\_\_, \_\_LINE\_\_, \_\_FUNCTION\_\_, \_\_VA\_ARGS\_\_)
#ifdef \_\_cplusplus
}
#endif
#endif
log.c:
#include <stdio.h>
#include <stdarg.h>
#include "log.h"
static long long default\_get\_sys\_time\_ms(void)
{
return (long long)0;
}
static get_sys_time_ms_def s_get_sys_time_ms = default_get_sys_time_ms;
void log\_time\_register(get_sys_time_ms_def p_get_sys_time_ms)
{
s_get_sys_time_ms = p_get_sys_time_ms;
}
void log\_print(enum log_color color, const char \*file, int line, const char \*func, const char\* fmt, ...)
{
va_list ap;
char buf[LOG_BUF_SIZE] = {0};
long long time = s\_get\_sys\_time\_ms();
va\_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap);
va\_end(ap);
switch(color)
{
case COLOR_NULL:
printf("<%lld ms>[%s:%d %s] %s ", time, file, line, func, buf);
break;
case RED:
printf("\033[31m<%lld ms>[%s:%d %s] %s\033[0m", time, file, line, func, buf);
break;
case GREEN:
printf("\033[32m<%lld ms>[%s:%d %s] %s\033[0m", time, file, line, func, buf);
break;
case YELLOW:
printf("\033[33m<%lld ms>[%s:%d %s] %s\033[0m", time, file, line, func, buf);
break;
case BLUE:
printf("\033[34m<%lld ms>[%s:%d %s] %s\033[0m", time, file, line, func, buf);
break;
default:
break;
}
}
其中,默认打印ms级的系统时间。因为不同的平台(Linux、Windows、STM32等),获取系统时间的方式都不一样。
使用时,再根据不同的平台自己定义一个获取系统时间的函数,以注册的方式进行绑定。不注册获取时间函数也不影响使用,时间戳打印为0。
log模块测试
1、Linux平台
log_test.c:
#include <stdio.h>
#include <sys/time.h>
#include "log.h"
static long long linux\_get\_sys\_time\_ms(void)
{
long long time_ms = 0;
struct timeval tv;
gettimeofday(&tv, NULL);
time_ms = (long long)tv.tv_sec \* 1000 + tv.tv_usec / 1000;
return (long long)time_ms;
}
int main(void)
{
log\_time\_register(linux_get_sys_time_ms);
char ch = 'a';
char str[10] = "ZhengN";
float float_val = 10.10;
int num = 88;
double double_val = 10.123456;
LOG\_D("字符为 %c \n", ch);
LOG\_D("字符串为 %s \n" , str);
LOG\_D("浮点数为 %f \n", float_val);
LOG\_D("整数为 %d\n" , num);
LOG\_D("双精度值为 %lf \n", double_val);
LOG\_D("八进制值为 %o \n", num);
LOG\_D("十六进制值为 %x \n", num);
return 0;
}
编译,运行:
第18行屏蔽掉:
2、Windows平台
log_test.c:
#include <stdio.h>
#include <windows.h>
#include "log.h"
static long long win\_get\_sys\_time\_ms(void)
{
long long time_ms = 0;
time_ms = GetTickCount();
return time_ms;
}
void test(void)
{
LOG\_D("Hello world\n");
}
int main(void)
{
log\_time\_register(win_get_sys_time_ms);
char ch = 'a';
char str[10] = "ZhengN";
float float_val = 10.10;
int num = 88;
double double_val = 10.123456;
LOG\_D("字符为 %c \n", ch);
LOG\_D("字符串为 %s \n" , str);
LOG\_D("浮点数为 %f \n", float_val);
LOG\_D("整数为 %d\n" , num);
LOG\_D("双精度值为 %lf \n", double_val);
LOG\_D("八进制值为 %o \n", num);
LOG\_D("十六进制值为 %x \n", num);
test();
return 0;
}
编译,运行:
rxi_log
项目地址:https://github.com/rxi/log.c
基于 C99 实现的简单日志库,具体输出如下所示;
image-20211204142024466
具体用法
将源码中的log.c和log.h集成到你的项目中即可,需要打印日志的话,调用下面的API即可,如下所示;
log\_trace(const char \*fmt, ...);
log\_debug(const char \*fmt, ...);
log\_info(const char \*fmt, ...);
log\_warn(const char \*fmt, ...);
log\_error(const char \*fmt, ...);
log\_fatal(const char \*fmt, ...);
除了这些API,还有log_set_quiet,log_set_lock,LOG_USE_COLOR等等,详情请看原项目。
ulog
项目地址:https://github.com/rdpoor/ulog
uLog 为嵌入式微控制器或任何资源有限的系统提供结构化的日志记录机制。它继承了流行的 Log4c 和 Log4j 平台背后的一些概念,但开销更低。
uLog 的一些特点:
- uLog 易于集成到几乎任何环境中,由一个头文件和一个源文件组成,并且是用纯 C 编写的。
- uLog 提供熟悉的严重级别(CRITICAL、ERROR、WARNING、INFO、DEBUG、TRACE)。
- uLog 支持多个用户定义的输出(控制台、日志文件、内存缓冲区等),每个输出都有自己的报告阈值级别。
- uLog 是具有最小依赖性的“积极独立”,仅需要 stdio.h、string.h 和 stdarg.h。
- 当您不使用 uLog 时,它不会妨碍您:如果 ULOG_ENABLED 在编译时未定义,则不会生成日志记录代码。
- uLog 已经过很好的测试。有关详细信息,请参阅随附的 ulog_test.c 文件。
color coding
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新