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. heapdump敏感信息提取工具-heapdump_tool(二),附下载链接。

    ​ heapdump敏感信息查询工具,例如查找 spring heapdump中的密码明文,AK,SK等 下载链接: heapdump_tool下载链接:heapdump_tool下载 声明: 此工具 ...

  2. 鸿蒙Next开发实战教程-使用WebSocket实现即时聊天

    鸿蒙系统提供了WebSocket库,使用它可以很方面的实现即时聊天功能,今天就使用WebSocket来实现一个完整的聊天功能. 首先创建一个WebSocket实例: let ws = webSocke ...

  3. 实现C++智能指针

    在对象切片一文中,提到可使用充当智能指针的类shape_wrapper,可以简化资源的管理,从根本上消除资源(包括内存)泄漏的可能性,本节来看下如何将shape_wrapper改造成一个完整的智能指针 ...

  4. 操作系统 -- SLAB如何分配内存

    在Linux系统中比页更小的内存对象要怎么分配呢? -- SLAB,学习下SLAB分配器的原理和实现 SLAB 与Cosmos物理页面管理器一样,Linux中的伙伴系统是以页面为最小单位分配到,现实更 ...

  5. System.Runtime.Serialization.SerializationException:“二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。

    var buffer = new byte[1024]; using (var ms = new MemoryStream(buffer)) { //xxx } 原因是buffer的长度过短,当接受到 ...

  6. C#线程池核心技术:从原理到高效调优的实用指南

    1. 引言 在现代软件开发中,多线程编程是提升应用程序性能的关键手段.随着多核处理器的普及,合理利用并发能力已成为开发者的重要课题.然而,线程的创建和销毁是一个昂贵的过程,涉及系统资源的分配与回收,频 ...

  7. ps ef命令查询进程号pid

      楼兰胡杨已经在<五分钟扫盲:25个工作中常用的Linux命令>分享了ps命令的简单使用方法,但是,写的过于笼统,这里详细介绍一下.   语法:ps -ef | grep process ...

  8. Pod调度之亲和性

    概述 官方文档: https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and ...

  9. java 钉钉群机器人发消息通知工具类

    测测类 /** * 测试钉钉群通知 * * @return */ @GetMapping("/testDingTalk") public Result testDingTalk() ...

  10. MyAuthWeb TianYe版预览