使用循环(环形)缓冲区实现的嵌入式系统的 C 中的记录器库在主文件中不起作用
Logger library in C for embedded system using circular(ring) buffer implementation isn't working in the main file
因此,我正在尝试为我的嵌入式系统编写自己的记录器 API 库。嵌入式系统正在使用裸机编程,没有任何 OS。因此,记录器库是一个静态库。该项目正在使用 CMake 构建。
记录器的第一个目标是将日志消息打印到控制台。它完成了。没有任何问题。它按预期工作。
该项目的第二个目标是将日志消息保存到循环缓冲区中。这是因为如果我的嵌入式设备未连接到计算机,我想使用循环(环形)缓冲区将这些日志消息存储在内存中,以便稍后当嵌入式设备连接到我的计算机时打印出来。这是我遇到的麻烦。
当我尝试在 main.c 文件中对其进行测试时,似乎在控制台中没有从实施循环(环形)缓冲区中打印出任何内容。
我对记录器库的意图就是这样。用户可以使用 main.c 中的任何字符串调用“log_print_buf” API,API 会将字符串保存到环形缓冲区。例如:log_print_buf(“为什么会出错”)。
我正在尝试同时使用 variadic c 宏和环形缓冲区。但是,有人有更好的想法或建议吗?
我选择的circular(ring)缓冲库来自Embedded Artistry网站。这是文章的 link 及其在 GitHub 上的代码:https://embeddedartistry.com/blog/2017/05/17/creating-a-circular-buffer-in-c-and-c/
圆形(环形)缓冲区 GitHub : https://github.com/embeddedartistry/embedded-resources/tree/master/examples/c/circular_buffer
非常欢迎和赞赏任何建议。谢谢
这是我的记录器实现代码:
------------- log.h ------------------
#ifndef LOG_H
#define LOG_H
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <stdarg.h>
#include "cbuf.h"
int log_cbuf_init();
void log_print_cbuf(char *format, ...);
void log_read_cbuf();
#endif // __LOG_H_
-------- log.c ------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "log.h"
#include "cbuf.h"
#define MAX_CBUFFER_SIZE 512
#define MAX_LOGDATA_SIZE 128
cbuf_handle_t klog_cbuf;
int log_cbuf_init(){
buffer = malloc(sizeof(uint8_t) *MAX_CBUFFER_SIZE);
klog_cbuf = circular_buf_init(buffer, MAX_CBUFFER_SIZE);
return 0;
}
void log_print_cbuf(char *format, ...){
char log_data[MAX_LOGDATA_SIZE];
va_list args;
va_start(args, format);
vsnprintf(log_data,MAX_LOGDATA_SIZE - 1, format, args);
va_end(args);
circular_buf_put(klog_cbuf, log_data[MAX_LOGDATA_SIZE - 1]);
return 0;
}
void log_read_cbuf(){
uint8_t data;
while(!circular_buf_empty(klog_cbuf)){
circular_buf_get(klog_cbuf, &data);
printf("%c", data);
}
}
------------ main.c ------------------
#include <stdio.h>
#include <stdlib.h>
#include <log.h>
#include "cbuf.h"
int main(){
klog_cbuf_init();
log_print_cbuf("Hello World\n");
log_read_cbuf();
return 0;
}
----------------结束----------------
我对这个循环缓冲库不熟悉。但是从circular_buf_put()
的原型来看,我觉得你用错了
/// Put version 1 continues to add data if the buffer is full
/// Old data is overwritten
/// Requires: cbuf is valid and created by circular_buf_init
void circular_buf_put(cbuf_handle_t cbuf, uint8_t data);
看来 circular_buf_put()
一次记录一个字节。您代码中的这一行仅将 log_data
的一个字节放入缓冲区 - 它恰好是 log_data
.
的最后一个字节
circular_buf_put(klog_cbuf, log_data[MAX_LOGDATA_SIZE - 1]);
也许你应该将 log_data
的 每个 字节放入缓冲区,就像这样。
int log_data_length = vsnprintf(log_data,MAX_LOGDATA_SIZE - 1, format, args);
for (int index = 0, ((index < log_data_length) && (index < MAX_LOGDATA_SIZE )), ++index)
{
circular_buf_put(klog_cbuf, log_data[index]);
}
因此,我正在尝试为我的嵌入式系统编写自己的记录器 API 库。嵌入式系统正在使用裸机编程,没有任何 OS。因此,记录器库是一个静态库。该项目正在使用 CMake 构建。
记录器的第一个目标是将日志消息打印到控制台。它完成了。没有任何问题。它按预期工作。
该项目的第二个目标是将日志消息保存到循环缓冲区中。这是因为如果我的嵌入式设备未连接到计算机,我想使用循环(环形)缓冲区将这些日志消息存储在内存中,以便稍后当嵌入式设备连接到我的计算机时打印出来。这是我遇到的麻烦。
当我尝试在 main.c 文件中对其进行测试时,似乎在控制台中没有从实施循环(环形)缓冲区中打印出任何内容。
我对记录器库的意图就是这样。用户可以使用 main.c 中的任何字符串调用“log_print_buf” API,API 会将字符串保存到环形缓冲区。例如:log_print_buf(“为什么会出错”)。 我正在尝试同时使用 variadic c 宏和环形缓冲区。但是,有人有更好的想法或建议吗?
我选择的circular(ring)缓冲库来自Embedded Artistry网站。这是文章的 link 及其在 GitHub 上的代码:https://embeddedartistry.com/blog/2017/05/17/creating-a-circular-buffer-in-c-and-c/
圆形(环形)缓冲区 GitHub : https://github.com/embeddedartistry/embedded-resources/tree/master/examples/c/circular_buffer
非常欢迎和赞赏任何建议。谢谢
这是我的记录器实现代码:
------------- log.h ------------------
#ifndef LOG_H
#define LOG_H
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <stdarg.h>
#include "cbuf.h"
int log_cbuf_init();
void log_print_cbuf(char *format, ...);
void log_read_cbuf();
#endif // __LOG_H_
-------- log.c ------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "log.h"
#include "cbuf.h"
#define MAX_CBUFFER_SIZE 512
#define MAX_LOGDATA_SIZE 128
cbuf_handle_t klog_cbuf;
int log_cbuf_init(){
buffer = malloc(sizeof(uint8_t) *MAX_CBUFFER_SIZE);
klog_cbuf = circular_buf_init(buffer, MAX_CBUFFER_SIZE);
return 0;
}
void log_print_cbuf(char *format, ...){
char log_data[MAX_LOGDATA_SIZE];
va_list args;
va_start(args, format);
vsnprintf(log_data,MAX_LOGDATA_SIZE - 1, format, args);
va_end(args);
circular_buf_put(klog_cbuf, log_data[MAX_LOGDATA_SIZE - 1]);
return 0;
}
void log_read_cbuf(){
uint8_t data;
while(!circular_buf_empty(klog_cbuf)){
circular_buf_get(klog_cbuf, &data);
printf("%c", data);
}
}
------------ main.c ------------------
#include <stdio.h>
#include <stdlib.h>
#include <log.h>
#include "cbuf.h"
int main(){
klog_cbuf_init();
log_print_cbuf("Hello World\n");
log_read_cbuf();
return 0;
}
----------------结束----------------
我对这个循环缓冲库不熟悉。但是从circular_buf_put()
的原型来看,我觉得你用错了
/// Put version 1 continues to add data if the buffer is full
/// Old data is overwritten
/// Requires: cbuf is valid and created by circular_buf_init
void circular_buf_put(cbuf_handle_t cbuf, uint8_t data);
看来 circular_buf_put()
一次记录一个字节。您代码中的这一行仅将 log_data
的一个字节放入缓冲区 - 它恰好是 log_data
.
circular_buf_put(klog_cbuf, log_data[MAX_LOGDATA_SIZE - 1]);
也许你应该将 log_data
的 每个 字节放入缓冲区,就像这样。
int log_data_length = vsnprintf(log_data,MAX_LOGDATA_SIZE - 1, format, args);
for (int index = 0, ((index < log_data_length) && (index < MAX_LOGDATA_SIZE )), ++index)
{
circular_buf_put(klog_cbuf, log_data[index]);
}