Easy_log移植笔记

1. 目录结构

  • demo 包含多平台移植示例,如 Linux、RT-Thread、裸机系统等,提供实际工程参考,帮助开发者快速适配不同环境。

  • docs 存放中英文文档,详细说明库的配置、API 接口、移植方法及插件扩展机制。关键文档包括:

    • api/kernel.md:核心接口函数定义及使用说明。

    • port/kernel.md:跨平台移植的具体步骤和接口实现要求。

  • easylogger(源码主目录)

    • inc:公共头文件,包含核心功能定义:

      • elog.h:日志级别、初始化、输出接口声明。

      • elog_cfg.h:全局配置宏(如输出开关、缓冲区大小、异步模式使能)。

    • src:核心实现代码:

      • elog.c:日志初始化、格式化、过滤及输出调度逻辑。

      • elog_utils.c:时间戳生成、线程安全控制等工具函数。

      • elog_async.c:异步输出相关函数

      • elog_buf.c:负责日志缓冲区的实现等函数

    • port:平台适配层,需用户根据目标系统实现以下接口:

      • elog_port.c:定义输出函数(如串口发送)、锁机制(如互斥量)、时间戳获取等。
    • plugins(可选):扩展插件,支持功能动态增强:

      • flash:基于 EasyFlash 的日志存储(无需文件系统)。

      • file:文件日志转档及动态配置加载(开发中)。

  • LICENSE 开源协议文件,明确库的使用条款。

  • README.md 项目概览、特性列表、快速入门及编译配置说明。


  1. 关键文件与配置
  • 移植依赖文件

    • elog_port.c:必须针对目标平台实现输出函数(如 elog_port_output)及锁机制,确保多线程安全。

    • elog_cfg.h:通过宏定义配置日志行为,例如静态过滤级别、异步输出缓冲区大小、RAW 格式支持等。

  • 插件扩展 通过 plugins 目录集成附加功能(如 Flash 存储),需在编译时启用对应插件并实现依赖接口(如 Flash 读写操作)。

2.移植

1. EasyLogger官方文档[github]

EasyLogger 核心功能 API 说明

EasyLogger 核心功能移植说明

EasyLogger常见初始化方式

2. 移植

添加elog.c,elog_utils.c,elog_port.c并链接easylogger\inc中的header文件

编译4个报错,发现是没有定义elog_async和elog_buf相关实现的函数,不需要异步和缓冲功能,可以将

ELOG_ASYNC_OUTPUT_ENABLEELOG_BUF_OUTPUT_ENABLE

这两个宏注释掉

编译4个警告,原因:没有实现port.c中的函数

根据上面的链接实现port.c中函数

elog_port.c实现

#include <elog.h>

/*** extern header ***/
#include "stdio.h"
#include "stdint.h" #include "SEGGER_RTT.h"
#include "FreeRTOS.h"
#include "semphr.h"
#include "stm32f4xx_hal.h" /*** global var *****/
static SemaphoreHandle_t g_log_mutex = NULL; /**
* EasyLogger port initialize
*
* @return result
*/
ElogErrCode elog_port_init(void) {
ElogErrCode result = ELOG_NO_ERR; /* add your code here */
SEGGER_RTT_Init();
g_log_mutex = xSemaphoreCreateMutex(); // 创建互斥锁
return result;
} /**
* EasyLogger port deinitialize
*
*/
void elog_port_deinit(void) { /* add your code here */
vSemaphoreDelete(g_log_mutex); // 释放互斥锁资源
g_log_mutex = NULL;
} /**
* output log port interface
*
* @param log output of log
* @param size log size
*/
void elog_port_output(const char *log, size_t size) { /* add your code here */
SEGGER_RTT_printf(0, log ,size); } /**
* output lock
*/
void elog_port_output_lock(void) { /* add your code here */
if (g_log_mutex != NULL) {
xSemaphoreTake(g_log_mutex, portMAX_DELAY); // 阻塞式获取锁
}
} /**
* output unlock
*/
void elog_port_output_unlock(void) { /* add your code here */
if (g_log_mutex != NULL) {
xSemaphoreGive(g_log_mutex); // 释放锁
}
} /**
* get current time interface
*
* @return current time
*/
const char *elog_port_get_time(void) { /* add your code here */
static char time_buf[20];
uint32_t ticks = HAL_GetTick();
uint32_t ms = ticks % 1000;
uint32_t sec = (ticks / 1000) % 60;
uint32_t min = (ticks / 60000) % 60;
uint32_t hour = ticks / 3600000;
snprintf(time_buf, sizeof(time_buf), "%02lu:%02lu:%02lu.%03lu", hour, min, sec, ms);
return time_buf;
} /**
* get current process name interface
*
* @return current process name
*/
const char *elog_port_get_p_info(void) { /* add your code here */
return "main";
} /**
* get current thread name interface
*
* @return current thread name
*/
const char *elog_port_get_t_info(void) { /* add your code here */
TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
return (current_task != NULL) ? pcTaskGetName(current_task) : "Unknown";
}
//base FreeRTOS and stm32hal library
//没有接入RTC时钟

Eassylogger多种输出类型

assert: 断言,用于在代码中发现逻辑错误或不应该发生的情况,不太常用

error:致命错误,出现这种情况程序就死机了

warning: 警告,用于提示可能存在的非致命性问题,代码仍然可以运行,但需要注意这些警告。

info: 用于输出一般性信息,帮助了解程序的运行状态。

debug: 用于输出调试信息,帮助开发人员进行问题排查。

verbose:冗长输出信息,任何无关紧要的可能都会输出,不太常用

3.移植出现的问题

出现warning

将elog.c中的宏修改恢复正常

#define S_NORMAL                       "1m"
//仅支持1,2,4的字符样式

将elog.c中的宏修改恢复正常

#define S_NORMAL                       "1m"
//仅支持1,2,4的字符样式

Easy_log移植笔记的更多相关文章

  1. tslib移植笔记(1)【转】

    本文转载自:https://blog.csdn.net/zijie_xiao/article/details/50740950 tslib移植笔记(1)2016-04-25 tslib背景[摘自百度] ...

  2. STemWin5.22移植笔记【转】

    来自:http://www.openedv.com/posts/list/27697.htm STemWin5.22移植笔记 网上关于emwin的资料很少,我在移植的时候查了很多资料,对我一个感觉是好 ...

  3. JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记

    2018年5月份开始在JZ2440上陆续移植了u-boot-2016.11.u-boot-spl-2016.11.linux-4.17和busybox-1.28.4,其中linux-4.17和busy ...

  4. Linux内核红黑树2—移植笔记

    转自:https://www.cnblogs.com/hellokitty2/p/15362596.html 另外可参考:https://zhuanlan.zhihu.com/p/26599934 一 ...

  5. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

    上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建一个 ...

  6. FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅

    1.必要的准备工作 工欲善其事,必先利其器,在开始学习和移植之前,相应的准备工作必不可少.所以在开始我们写要准备如下: 测试环境:我准备在STM32F103平台上移植和测试FreeRTOS系统 准备F ...

  7. rt—移植笔记2(Lwip)

    首先参考f107已经有的目录结构添加Lwip这一组,添加各种.c文件及.文件. 还有drive下边的很重要的eth.c 到此,工程编译通过.(刚开始,小编是一个一个 的比对...一个一个错误排查... ...

  8. rt—移植笔记1

    将rtt源码往stm32f407移植的时候,源码串口打印引脚设置有误,以下是源码引脚配置. 以下是原理图 可见配置有误.

  9. i2c设备驱动移植笔记(二)

    说明:上一篇博客写了我在移植android驱动之TEF6606的苦逼遭遇,即驱动层向应用层提供接口支持,查找了两天的资料,不得不放弃,转而进行IIC下移植RTC设备的实验. 第一步:查找设备的数据手册 ...

  10. 三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记

    一:移植Boa(web服务器)到嵌入式Linux系统 一.Boa程序的移植 1.下载Boa源码    下载地址: http://www.boa.org/    目前最新发行版本: 0.94.13   ...

随机推荐

  1. QT C++ 实现数据类与 json 的转换

    QT 提供了 QJsonDocument.QJsonObject.QJsonArray.QJsonValue 等类用于 JSON 的解析和转换.QJsonValue 支持的数据类型包括:bool.do ...

  2. 一个清除数组的方法在 Kotlin、Java、C#和Nim上的性能测试

    起因 我的一个项目使用 Kotlin 编写,他是一个多维数据库应用程序,所以会非常频繁的操作 int 数组,其中有段程序就需要进行 几亿次的数组清除动作,类似这样的代码: Arrays.fill(ta ...

  3. C# Delegate 委托及事件

    1.委托Delegate实质 由一个修饰符+  delegate,跟方法的定义比较类似,也需要声明参数和返回值.声明一个委托,就是声明一种方法签名(参数+返回值),只要是和声明委托方法签名相同的方法, ...

  4. Agent安装与使用

    Agent安装与使用 前置条件 安装jdk17 下载 https://dlcdn.apache.org/skywalking/java-agent/9.1.0/apache-skywalking-ja ...

  5. SpringBoot事件驱动开发

    应用启动过程生命周期事件感知(9大事件).应用运行中事件感知(无数种) 事件发布:ApplicationEventPublisherAware或注入:ApplicationEventMulticast ...

  6. 进程的退出--exit()与_exit()的区别

    进程终止:①异常终止:②正常终止 异常终止:①进程收到某种信号: ②调用abort()函数:[堕胎] 正常终止:①main()函数返回 ②调用exit()函数 三.调用_exit()函数或_Exit( ...

  7. Oracle ACL (Access Control List) 详细介绍

    参考:https://blog.csdn.net/qq243348167/article/details/87876956 --查询acl信息 SELECT * FROM dba_network_ac ...

  8. Gin RBAC 权限基础实现

    RBAC (基于角色的访问控制) 是一种广泛应用的权限管理模型, 通过 角色 将 用户 和 权限 解耦, 简化权限分配管理. 用户 (User): 系统的使用者 权限 (Permission): 对资 ...

  9. 一文速通Python并行计算:10 Python多进程编程-进程之间的数据共享-基于共享内存和数据管理器

    一文速通 Python 并行计算:10 Python 多进程编程-进程之间的数据共享-基于共享内存和数据管理器 摘要: Python 多进程通信中,共享内存通过 Value 和 Array 实现高效数 ...

  10. 定制Django的Tag和Filter(二)

    配置 (1)最常见的放置自定义Tag和Filter的地方是在Django的app下.当一个app被添加到settings.py的INSTALLED_APPS 后,任何在它下面的合法位置将自动的可在te ...