常州哪些网站公司做的好处,对搜索引擎优化的认识,网站开发会计分录,万能浏览器有哪些环形缓冲区的必要性串口发收数据会存在丢字符的情况#xff0c;使用一个新的内存来存放接收到的数据#xff0c;则会保证cpu有足够的时间处理下一帧数据。环形缓冲区实现ringbuffer.h#ifndef __RINGBUFFER8_H #define __RINGBUFFER8_H#include stdbool.h #include typedef struct ringbuffer8 *ringbuffer8_t; ringbuffer8_t rb8_new(uint8_t *buff, uint32_t length); bool rb8_empty(ringbuffer8_t rb); bool rb8_full(ringbuffer8_t rb); bool rb8_put(ringbuffer8_t rb, uint8_t data); bool rb8_puts(ringbuffer8_t rb, uint8_t *data, uint32_t size); bool rb8_get(ringbuffer8_t rb, uint8_t *data); bool rb8_gets(ringbuffer8_t rb, uint8_t *data, uint32_t size); #endif /* __RINGBUFFER8_H */ringbuffer.c#include stdlib.h #include string.h #include ringbuffer8.h #define rbb_len rb-length struct ringbuffer8 { uint32_t tail; uint32_t head; uint32_t length; uint8_t buffer[]; }; ringbuffer8_t rb8_new(uint8_t *buff, uint32_t length) { ringbuffer8_t rb (ringbuffer8_t)buff; //实际缓冲区的长度是总长-ringbuffer控制块长度 rb-length length - sizeof(struct ringbuffer8); return rb; } //若没超过缓冲区的数据边界就加1否则索引置0 static inline uint16_t next_head(ringbuffer8_t rb) { return rb-head 1 rbb_len ? rb-head 1 : 0; } static inline uint16_t next_tail(ringbuffer8_t rb) { return rb-tail 1 rbb_len ? rb-tail 1 : 0; } bool rb8_empty(ringbuffer8_t rb) { return rb-head rb-tail; } bool rb8_full(ringbuffer8_t rb) { return next_head(rb) rb-tail; } //数据放入环形缓冲区 bool rb8_put(ringbuffer8_t rb, uint8_t data) { //先判满 if (next_head(rb) rb-tail) return false; rb-buffer[rb-head] data; rb-head next_head(rb); return true; } bool rb8_puts(ringbuffer8_t rb, uint8_t *data, uint32_t size) { bool ret true; for (uint16_t i 0; i size ret; i) { ret rb8_put(rb, data[i]); } return ret; } //数据从环形缓冲区中拿出 bool rb8_get(ringbuffer8_t rb, uint8_t *data) { //先判空 if (rb-head rb-tail) return false; *data rb-buffer[rb-tail]; rb-tail next_tail(rb); return true; } bool rb8_gets(ringbuffer8_t rb, uint8_t *data, uint32_t size) { bool ret true; for (uint16_t i 0; i size ret; i) { ret rb8_get(rb, data[i]); } return ret; }