什么是环形缓存,有什么作用。这些概念性的认知请在网上了解决,网上比较多的描述。
在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上的执行效果:
哈哈,看来完全是正确的,和我想的一模一样.
------------