CH582F使用EasyLogger
参考:
感谢开源项目和其他作者的分享,本文为新手CH582F裸机移植EasyLogger日志库的过程记录。
0.EasyLogger
EasyLogger 是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C/C++ 日志库, EasyLogger 的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件形式进行动态扩展。
下载EasyLogger 到本地,移植参考EasyLogger 核心功能移植说明,一步步来细心点就可以了。
1. 新建工程
在MounRiver中新建工程,这里我使用的是CH582F。
新建文件夹,这里我采用CommonLibrary-EasyLogger路径
因为是最简单基础的移植,没用到缓冲/异步输出模式,可以选中对应的文件后,右键选择排除编译 elog_async.c
和elog_buf.c
,如下图所示。
2.添加头文件路径并修改对应文件
添加inc
文件夹的路径 ,并应用,编译一下没有错误的往下继续。
在elog_cfg.h
头部添加#include "CH58x_common.h"
并修改部分宏定义设置,由于我们在移植的时候没有添加异步输出和缓冲区输出的源文件,因此,我们需要在配置文件中把这两个宏定义屏蔽掉。
#include "CH58x_common.h"
/*.......其余设置默认...........*/
/* output newline sign */
#define ELOG_NEWLINE_SIGN "\r\n"
/*---------------------------------------------------------------------------*/
/* enable asynchronous output mode */
//#define ELOG_ASYNC_OUTPUT_ENABLE
/*---------------------------------------------------------------------------*/
/* enable buffered output mode */
//#define ELOG_BUF_OUTPUT_ENABLE
#endif /* _ELOG_CFG_H_ */
之后在elog_port.c
中的函数中添加一些代码如下
ElogErrCode elog_port_init(void) {
ElogErrCode result = ELOG_NO_ERR;
/* add your code here */
/* 这里我用的配置串口1:先配置IO口模式,再配置串口 */
GPIOA_SetBits(bTXD1);
GPIOA_ModeCfg(bRXD1, GPIO_ModeIN_PU); // PA8-RXD1-配置上拉输入
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // PA9-TXD1-配置推挽输出,注意先让IO口输出高电平
UART1_DefInit(); // 默认115200波特率,8N1
return result;
}
void elog_port_output(const char *log, size_t size) {
/* add your code here */
printf("%.*s", size, log);
// %s表示字符串输出,.<十进制数>是精度控制格式符,输出字符时表示输出字符的位数,
// 在精度控制时,小数点后的十进制数可以使用*来占位,在后面提供一个变量作为精度控制的具体值。
}
// 因为我们是裸机的工程,没有使用到,因此直接返回空分别是获取系统时间、进程信息、线程信息
const char *elog_port_get_time(void) {
/* add your code here */
return "";
}
const char *elog_port_get_p_info(void) {
/* add your code here */
return "";
}
const char *elog_port_get_t_info(void) {
/* add your code here */
return "";
}
最后修改main.c
文件,添加测试代码,编译成功下载即可。
/********************************** (C) COPYRIGHT *******************************
* File Name : Main.c
* Author : WCH
* Version : V1.0
* Date : 2020/08/06
* Description : CH582F使用串口1,EayLogger基础移植测试
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
#define LOG_TAG "main"
#include "CH58x_common.h"
#include "elog.h"
static void test_elog(void);
/**
* EasyLogger demo
*/
void test_elog(void) {
/* test log output for all level */
log_a("log_a: Hello EasyLogger!");
log_e("log_e: Hello EasyLogger!");
log_w("log_w: Hello EasyLogger!");
log_i("log_i: Hello EasyLogger!");
log_d("log_d: Hello EasyLogger!");
log_v("log_v: Hello EasyLogger!");
elog_raw("elog_raw: Hello EasyLogger!\r\n");
}
/*
* 函数名称:Easylogger_Init
* 输入参数:None
* 返 回 值:None
* 作 者:Barry
* 功能描述:初始化Easylogger打印,配置log输出的颜色、字体、输出内容等
* 修改记录:None
*/
void Easylogger_Init(void)
{
#if 1
/* 初始化Easylogger */
elog_init();
/* 使能颜色输出 */
elog_set_text_color_enabled(true);
/* 输出所有内容 */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);
/* 输出日志级别信息和日志TAG */
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG);
/* 除了时间、进程信息、线程信息之外,其余全部输出 */
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~(ELOG_FMT_TIME | ELOG_FMT_P_INFO | ELOG_FMT_T_INFO));
/* 输出所有内容 */
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL);
/* 启动Easylogger */
elog_start();
#endif
}
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
Easylogger_Init();
while(1)
{
test_elog();
DelayMs(1000);
}
while(1);
}
3.串口终端测试
这里使用的是xshell(MobaXterm也很不错的啊)查看CH582F串口1打印出来的日志测试数据,串口设置默认为115200波特率,8N1,测试效果如下。
修改elog_cfg.h
中的相关定义,还可以实现错误信息闪烁等效果。
这里我设置了错误信息的Blink闪烁,大家可以都试下不同的设置,效果美滋滋啊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?