实现串口驱动,移植方便
This commit is contained in:
20
Middlewares/logging/CMakeLists.txt
Normal file
20
Middlewares/logging/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.22)
|
||||
|
||||
# Create logging library
|
||||
add_library(logging STATIC)
|
||||
|
||||
# Add logging sources
|
||||
target_sources(logging PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/logging.c
|
||||
)
|
||||
|
||||
# Add logging include directories
|
||||
target_include_directories(logging PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/inc
|
||||
)
|
||||
|
||||
# Link with required libraries
|
||||
target_link_libraries(logging PRIVATE
|
||||
uart
|
||||
hal
|
||||
)
|
||||
149
Middlewares/logging/README.md
Normal file
149
Middlewares/logging/README.md
Normal file
@ -0,0 +1,149 @@
|
||||
# Logging中间件
|
||||
|
||||
## 功能描述
|
||||
Logging中间件用于实现不同级别的日志输出功能,支持DEBUG、INFO、WARN、ERROR、FATAL五个日志级别,通过UART接口输出日志信息。
|
||||
|
||||
## 依赖关系
|
||||
- UART模块:uart
|
||||
|
||||
## 接口说明
|
||||
|
||||
### 数据结构
|
||||
|
||||
#### log_level_t
|
||||
日志级别枚举,用于设置和获取日志级别
|
||||
```c
|
||||
typedef enum {
|
||||
LOG_LEVEL_DEBUG = 0U, /*!< 调试级别 */
|
||||
LOG_LEVEL_INFO = 1U, /*!< 信息级别 */
|
||||
LOG_LEVEL_WARN = 2U, /*!< 警告级别 */
|
||||
LOG_LEVEL_ERROR = 3U, /*!< 错误级别 */
|
||||
LOG_LEVEL_FATAL = 4U, /*!< 致命错误级别 */
|
||||
LOG_LEVEL_NONE = 5U /*!< 无日志输出 */
|
||||
} log_level_t;
|
||||
```
|
||||
|
||||
### 函数接口
|
||||
|
||||
#### logging_init
|
||||
```c
|
||||
void logging_init(void);
|
||||
```
|
||||
初始化日志模块
|
||||
|
||||
**参数**:无
|
||||
|
||||
**返回值**:无
|
||||
|
||||
#### logging_set_level
|
||||
```c
|
||||
void logging_set_level(log_level_t level);
|
||||
```
|
||||
设置日志级别
|
||||
|
||||
**参数**:
|
||||
- level: 日志级别
|
||||
|
||||
**返回值**:无
|
||||
|
||||
#### logging_get_level
|
||||
```c
|
||||
log_level_t logging_get_level(void);
|
||||
```
|
||||
获取当前日志级别
|
||||
|
||||
**参数**:无
|
||||
|
||||
**返回值**:当前日志级别
|
||||
|
||||
#### log_debug
|
||||
```c
|
||||
void log_debug(const char *format, ...);
|
||||
```
|
||||
输出调试级别日志
|
||||
|
||||
**参数**:
|
||||
- format: 格式化字符串
|
||||
- ...: 可变参数
|
||||
|
||||
**返回值**:无
|
||||
|
||||
#### log_info
|
||||
```c
|
||||
void log_info(const char *format, ...);
|
||||
```
|
||||
输出信息级别日志
|
||||
|
||||
**参数**:
|
||||
- format: 格式化字符串
|
||||
- ...: 可变参数
|
||||
|
||||
**返回值**:无
|
||||
|
||||
#### log_warn
|
||||
```c
|
||||
void log_warn(const char *format, ...);
|
||||
```
|
||||
输出警告级别日志
|
||||
|
||||
**参数**:
|
||||
- format: 格式化字符串
|
||||
- ...: 可变参数
|
||||
|
||||
**返回值**:无
|
||||
|
||||
#### log_error
|
||||
```c
|
||||
void log_error(const char *format, ...);
|
||||
```
|
||||
输出错误级别日志
|
||||
|
||||
**参数**:
|
||||
- format: 格式化字符串
|
||||
- ...: 可变参数
|
||||
|
||||
**返回值**:无
|
||||
|
||||
#### log_fatal
|
||||
```c
|
||||
void log_fatal(const char *format, ...);
|
||||
```
|
||||
输出致命错误级别日志
|
||||
|
||||
**参数**:
|
||||
- format: 格式化字符串
|
||||
- ...: 可变参数
|
||||
|
||||
**返回值**:无
|
||||
|
||||
## 使用示例
|
||||
|
||||
```c
|
||||
/* 初始化日志模块 */
|
||||
logging_init();
|
||||
|
||||
/* 设置日志级别为DEBUG */
|
||||
logging_set_level(LOG_LEVEL_DEBUG);
|
||||
|
||||
/* 输出不同级别的日志 */
|
||||
log_debug("Debug message, value: %d\r\n", 123);
|
||||
log_info("Info message\r\n");
|
||||
log_warn("Warning message\r\n");
|
||||
log_error("Error message\r\n");
|
||||
log_fatal("Fatal message\r\n");
|
||||
```
|
||||
|
||||
## 日志格式
|
||||
日志输出格式为:
|
||||
```
|
||||
[LOG_LEVEL] message\r\n
|
||||
例如:
|
||||
[DEBUG] Debug message\r\n
|
||||
[INFO] Info message\r\n
|
||||
[WARN] Warning message\r\n
|
||||
[ERROR] Error message\r\n
|
||||
[FATAL] Fatal message\r\n
|
||||
## 注意事项
|
||||
1. 日志模块依赖于UART模块,确保UART模块已正确初始化
|
||||
2. 日志级别越高,输出的日志越少
|
||||
3. 建议在生产环境中将日志级别设置为INFO或更高,以减少日志输出对系统性能的影响
|
||||
81
Middlewares/logging/inc/logging.h
Normal file
81
Middlewares/logging/inc/logging.h
Normal file
@ -0,0 +1,81 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : logging.h
|
||||
* @brief : Logging middleware header file
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
#ifndef LOGGING_H
|
||||
#define LOGGING_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/**
|
||||
* @brief Log levels definitions
|
||||
*/
|
||||
typedef enum {
|
||||
LOG_LEVEL_DEBUG = 0U,
|
||||
LOG_LEVEL_INFO = 1U,
|
||||
LOG_LEVEL_WARN = 2U,
|
||||
LOG_LEVEL_ERROR = 3U,
|
||||
LOG_LEVEL_FATAL = 4U,
|
||||
LOG_LEVEL_NONE = 5U
|
||||
} log_level_t;
|
||||
|
||||
/**
|
||||
* @brief Initialize logging module
|
||||
*/
|
||||
void logging_init(void);
|
||||
|
||||
/**
|
||||
* @brief Set logging level
|
||||
* @param level: Logging level to set
|
||||
*/
|
||||
void logging_set_level(log_level_t level);
|
||||
|
||||
/**
|
||||
* @brief Get current logging level
|
||||
* @retval Current logging level
|
||||
*/
|
||||
log_level_t logging_get_level(void);
|
||||
|
||||
/**
|
||||
* @brief Log debug message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_debug(const char *format, ...);
|
||||
|
||||
/**
|
||||
* @brief Log info message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_info(const char *format, ...);
|
||||
|
||||
/**
|
||||
* @brief Log warning message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_warn(const char *format, ...);
|
||||
|
||||
/**
|
||||
* @brief Log error message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_error(const char *format, ...);
|
||||
|
||||
/**
|
||||
* @brief Log fatal message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_fatal(const char *format, ...);
|
||||
|
||||
#endif /* LOGGING_H */
|
||||
159
Middlewares/logging/src/logging.c
Normal file
159
Middlewares/logging/src/logging.c
Normal file
@ -0,0 +1,159 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : logging.c
|
||||
* @brief : Logging middleware source file
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
#include "logging.h"
|
||||
#include "uart.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
/* Current logging level */
|
||||
static log_level_t current_level = LOG_LEVEL_INFO;
|
||||
|
||||
/**
|
||||
* @brief Get log level string
|
||||
* @param level: Log level
|
||||
* @retval Log level string
|
||||
*/
|
||||
static const char* log_level_to_string(log_level_t level) {
|
||||
switch (level) {
|
||||
case LOG_LEVEL_DEBUG:
|
||||
return "DEBUG";
|
||||
case LOG_LEVEL_INFO:
|
||||
return "INFO";
|
||||
case LOG_LEVEL_WARN:
|
||||
return "WARN";
|
||||
case LOG_LEVEL_ERROR:
|
||||
return "ERROR";
|
||||
case LOG_LEVEL_FATAL:
|
||||
return "FATAL";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initialize logging module
|
||||
*/
|
||||
void logging_init(void) {
|
||||
/* Initialize UART module */
|
||||
uart_init();
|
||||
|
||||
/* Set default log level */
|
||||
current_level = LOG_LEVEL_INFO;
|
||||
|
||||
/* Log initialization message */
|
||||
log_info("Logging module initialized\r\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set logging level
|
||||
* @param level: Logging level to set
|
||||
*/
|
||||
void logging_set_level(log_level_t level) {
|
||||
current_level = level;
|
||||
log_info("Log level set to %s\r\n", log_level_to_string(level));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get current logging level
|
||||
* @retval Current logging level
|
||||
*/
|
||||
log_level_t logging_get_level(void) {
|
||||
return current_level;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Internal log function
|
||||
* @param level: Log level
|
||||
* @param format: Format string
|
||||
* @param args: Variable arguments
|
||||
*/
|
||||
static void log_internal(log_level_t level, const char *format, va_list args) {
|
||||
char buffer[256];
|
||||
int ret;
|
||||
|
||||
/* Check if log level is enabled */
|
||||
if (level < current_level || level >= LOG_LEVEL_NONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Format log message */
|
||||
ret = snprintf(buffer, sizeof(buffer), "[%s] ", log_level_to_string(level));
|
||||
if (ret < 0 || ret >= sizeof(buffer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Append formatted message */
|
||||
ret = vsnprintf(buffer + ret, sizeof(buffer) - ret, format, args);
|
||||
if (ret < 0 || ret >= (int)(sizeof(buffer) - ret)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Send log message over UART */
|
||||
uart_send_string(buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log debug message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_debug(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
log_internal(LOG_LEVEL_DEBUG, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log info message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_info(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
log_internal(LOG_LEVEL_INFO, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log warning message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_warn(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
log_internal(LOG_LEVEL_WARN, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log error message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_error(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
log_internal(LOG_LEVEL_ERROR, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Log fatal message
|
||||
* @param format: Format string
|
||||
* @param ...: Variable arguments
|
||||
*/
|
||||
void log_fatal(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
log_internal(LOG_LEVEL_FATAL, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
Reference in New Issue
Block a user