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

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

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

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

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

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

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

正文

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.clog.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_quietlog_set_lockLOG_USE_COLOR等等,详情请看原项目。


ulog

项目地址:https://github.com/rdpoor/ulog

uLog 为嵌入式微控制器或任何资源有限的系统提供结构化的日志记录机制。它继承了流行的 Log4cLog4j 平台背后的一些概念,但开销更低。

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

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

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

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

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

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

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机是一种集成了处理器、存储器和各种外设接口的微型计算机系统,常用于控制系统和嵌入系统。而C语言是一种高级编程语言,常用于单片机的开发环境。C语言以其简洁、高效和跨平台性而受到广泛的应用。 面向对象是一种编程范,其核心思想是将程序的结构组织成对象的集合,这些对象通过相互之间的交互来完成任务。面向对象的编程语言有C++、Java等。对于单片机这样的嵌入系统来说,C语言的面向对象编程方虽然不如面向对象的编程语言直观,但可以采用一些技巧和设计模来实现类似的功能。 源码是程序员编写的计算机程序的原始文件,也可以称为源文件。在单片机的C语言开发,源码是指开发人员根据具体需求和设计思路编写的程序文件。这些源码可以包含各种函数、变量和宏定义等,用于实现特定功能或控制特定外设。通过编译器将源码转换为机器码后,可以在单片机上运行。 单片机C语言的源码通常包含开发环境搭建、初始化、断处理、功能函数等部分。开发环境搭建是指根据具体的开发需求配置单片机的开发环境,包括选择合适的开发工具和编译器以及配置相关的参数。初始化部分是为了将单片机的各个寄存器和外设初始化为合适的状态,准备好执行具体的任务。断处理部分是单片机的一种重要机制,用于在特定事件发生时打断正常的程序执行,响应相应的事件。功能函数部分是根据具体需求编写的函数,用于实现特定的功能,如读取传感器数据、控制外设等。 总之,单片机C语言源码是用C语言编写的程序文件,用于在单片机上实现特定的功能和控制外设。通过合理的编写和组织源码,可以实现各种复杂的控制和运算操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值