木子剑
生命不熄,学习不止!

什么是环形缓存,有什么作用。这些概念性的认知请在网上了解决,网上比较多的描述。

在contiki-ng-release-v4.6\os\lib下的ringbuf.h;   ringbuf.c。实现了环形缓存

直接上.h头文件内容:

#ifndef RINGBUF_H_
#define RINGBUF_H_

#include "contiki.h"

/**
 * \brief      Structure that holds the state of a ring buffer.
 *             保存环缓冲区状态的结构。
 */
struct ringbuf {
  uint8_t *data;
  uint8_t mask;

  /* XXX these must be 8-bit quantities to avoid race conditions. */
  uint8_t put_ptr, get_ptr;
};


/**
 * \brief      Initialize a ring buffer 初始化环形缓冲区
 */
void    ringbuf_init(struct ringbuf *r, uint8_t *a,
             uint8_t size_power_of_two);


/**
 * \brief      Insert a byte into the ring buffer 将字节插入环形缓冲区
 */
int     ringbuf_put(struct ringbuf *r, uint8_t c);



/**
 * \brief      Get a byte from the ring buffer 从环形缓冲区获取字节
 */
int     ringbuf_get(struct ringbuf *r);


/**
 * \brief      Get the size of a ring buffer 获取环形缓冲区的大小
 */
int     ringbuf_size(struct ringbuf *r);


/**
 * \brief      Get the number of elements currently in the ring buffer
 *             获取环形缓冲区中当前的元素数
 */
int     ringbuf_elements(struct ringbuf *r);

#endif /* RINGBUF_H_ */    

 有时间再测试一下它们的使用方法,应该不会太难的。 

 

时间:2021-01-18

这方面的应用,在网上  在资料上找不到相关应用,还得是靠自己研究,少说费话,直接上测试源码:

/*------------------------环形缓存应用----------------------------------------*/
#include "lib/ringbuf.h" //加载lib环形缓存库
#define maxBUF  128

PROCESS(ringbuf_process, "ringbuf process");
PROCESS_THREAD(ringbuf_process, ev, data)
{
  struct ringbuf buf01;
  uint8_t buf[maxBUF];
  ringbuf_init(&buf01, buf, maxBUF);

  PROCESS_BEGIN();

  ringbuf_put(&buf01, 0X11);   //存一个值
  ringbuf_put(&buf01, 0X12);   //存一个值
  ringbuf_put(&buf01, 0X13);   //存一个值
  printf("ringbuf_elements1:%d\n", ringbuf_elements(&buf01)); //存多少个元素在BUF里面?

  while(1) {
    printf("buf01:0x%x\n", ringbuf_get(&buf01)); //取一个值
    printf("buf01:0x%x\n", ringbuf_get(&buf01)); //取一个值
    printf("buf01:0x%x\n", ringbuf_get(&buf01)); //取一个值

    printf("ringbuf_elements2:%d\n", ringbuf_elements(&buf01)); //还有多少个元素在BUF里面?
    printf("ringbuf_ringbuf_size:%d\n", ringbuf_size(&buf01)); //这个BUF有多少个字节??

    printf("ringbuf process exit!!\n\n");
    PROCESS_EXIT(); //退出进程,释放资源

  }
  PROCESS_END();
}

/*------------------------所有自启动的测试PROCESSES---------------------------*/
AUTOSTART_PROCESSES(
                      &ringbuf_process
                    );

在IAR上的执行效果:

 

 哈哈,看来完全是正确的,和我想的一模一样.

------------

posted on 2021-01-14 08:41  木子剑  阅读(406)  评论(0编辑  收藏  举报