使用循环(环形)缓冲区实现的嵌入式系统的 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]);
}