使用圆形(环形)缓冲区实现的嵌入式系统的 C 中的记录器库在主文件中不起作用



因此,我正在尝试为我的嵌入式系统编写我自己的记录器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]);
}

最新更新