标签:sz off stream buffer write 队列 sb buf uint32
环形队列是一种线性空间的FIFO数据结构,能实现个任务之间的快速数据通信,通常应用于uart、usb等通信中。
环形队列是将数组空间的最后一个元素和第一个元素链接起来的一种环形结构,即数据到达最后一个元素时,就跳转至第一个元素。
环形队列判断空和满的方法:
a.附加一个标志位tag
- 当head赶上tail,队列空,则令tag=0
-
当tail赶上head,队列满,则令tag=1
b.限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。
- 队列空: head==tail
- 队列满: (tail+1) % size==head
代码实现:
stream_buffer.h
1 #ifndef __STREAM_BUFFER_H 2 #define __STREAM_BUFFER_H 3 #include "def.h" 4 5 typedef struct { 6 uint8_t *buf; 7 uint32_t size; 8 uint32_t read_off; 9 uint32_t write_off; 10 } StreamBuffer; 11 12 int sbInit(StreamBuffer *sb, uint8_t *buf, uint32_t sz); 13 uint32_t sbRead(StreamBuffer *sb, uint8_t *buf, uint32_t sz); 14 uint32_t sbWrite(StreamBuffer *sb, uint8_t *buf, uint32_t sz); 15 uint32_t sbGetAvailableBytes(StreamBuffer *sb); 16 void sbReset(StreamBuffer *sb); 17 18 #endif
stream_buffer.c
1 #include "stream_buffer.h" 2 3 int 4 sbInit(StreamBuffer *sb, uint8_t *buf, uint32_t sz) 5 { 6 if(buf == NULL || sz <= 1) { 7 return EC_FAIL; 8 } 9 10 sb->size = sz; 11 sb->buf = buf; 12 sb->read_off = 0; 13 sb->write_off = 0; 14 return EC_OK; 15 } 16 17 uint32_t 18 sbRead(StreamBuffer *sb, uint8_t *buf, uint32_t sz) 19 { 20 uint32_t request_sz = sz; 21 uint32_t read_sz = 0; 22 23 while(request_sz) { 24 if(sb->read_off == sb->write_off) { 25 break; 26 } 27 *buf ++ = sb->buf[sb->read_off ++]; 28 sb->read_off %= sb->size; 29 request_sz --; 30 read_sz ++; 31 } 32 return read_sz; 33 } 34 35 uint32_t 36 sbWrite(StreamBuffer *sb, uint8_t *buf, uint32_t sz) 37 { 38 uint32_t post_sz = sz; 39 uint32_t write_sz = 0; 40 41 while(post_sz) { 42 if(sb->read_off == ((sb->write_off + 1) % sb->size)) { 43 break; 44 } 45 sb->buf[sb->write_off ++] = *buf ++; 46 sb->write_off %= sb->size; 47 post_sz --; 48 write_sz ++; 49 } 50 return write_sz; 51 } 52 53 uint32_t 54 sbGetAvailableBytes(StreamBuffer *sb) 55 { 56 if(sb->write_off >= sb->read_off) { 57 return sb->write_off - sb->read_off; 58 } 59 return sb->size - (sb->read_off - sb->write_off); 60 } 61 62 void 63 sbReset(StreamBuffer *sb) 64 { 65 sb->read_off = 0; 66 sb->write_off = 0; 67 }
标签:sz,off,stream,buffer,write,队列,sb,buf,uint32 来源: https://www.cnblogs.com/ivan0512/p/16280126.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。