因此,我正在尝试为我的嵌入式系统编写我自己的记录器API库。嵌入式系统在没有任何操作系统的情况下使用裸机编程。因此,记录器库是一个静态库。该项目正在使用CMake进行构建。
记录器的第一个目标是将日志消息打印到控制台。它完成了。没有任何问题。它正在按预期工作。
该项目的第二个目标是将日志消息保存到循环(环形(缓冲区。这是因为,如果我的嵌入式设备未连接到计算机,我希望使用环形缓冲区将这些日志消息存储在内存中,以便在嵌入式设备连接到我的计算机时打印出来。这就是我遇到麻烦的地方。
当我试图在主.c文件中测试它时,控制台中似乎没有从循环(环形(缓冲区的实现中打印出任何内容。
我对记录器库的意图是这样的。用户可以调用";log_print_buf";API与main.c和API中的任何字符串一起将字符串保存到环形缓冲区。例如:log_print_buf("为什么会出错"(。我正在尝试同时使用可变c宏和环形缓冲区。但是,有人有更好的想法或建议吗?
我选择的环形缓冲库来自Embedded Artistry网站。以下是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 Worldn");
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]);
}