【C C++开源库】单片机 嵌入式中的C语言日志库_单片机开源库

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

日志系统在系统开发和调整过程中的重要性,大家应该都清楚,特别是项目出问题之后,却没有日志可以帮忙定位问题,就非常令人痛苦。

因为我们不可能一直通过调试器去单步调试程序,所以设备的运行日志显得尤为重要。

通常我们对日志有这些要求:

  • 不同的日志级别(Debug,Warning, Info, Error, Fatal);
  • 日志打印要和printf一样简单易用;
  • 能够设置日志级别;
  • 占用空间小;
  • 可配置,甚至可以禁用日志;
  • 基于不同日志级别,支持颜色高亮;
  • 可以自定义配置,时间戳;
  • 支持RTOS;

以上是比较基本的功能,但是在嵌入式设备中,有的时候我们希望可以保存设备的运行日志,我们需要以下的一些功能;

  • 支持多种访问方式,比如串口终端,保存到嵌入式文件系统中;
  • 支持shell命令行通过串口终端进行访问;

以上这些需求不一定会全部实现。

除了常用的log4clog4cpp,下面给大家推荐3个非常不错的开源日志库,比较适合用在单片机的项目中。从开始的轻量,到后面的功能丰富,最后一个很强大,所以请耐心看到最后。



我们平时开发中,log打印必不可少,仅仅使用printf,则log信息不好定位。一些开源稳定、成熟的log模块功能往往比较强大,而我们可能又不需要那么多功能。

这里简单分享一个我自己用的一个极简的log模块:log颜色可设置、带时间戳、文件、行号、函数。

这个log模块仅包含log.h与log.c两个文件。

log模块代码

log.h:

#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’;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
har ch = ‘a’;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-YZBvquAw-1713433297527)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值