ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

环形队列 - stream_buffer

2022-05-17 11:32:39  阅读:167  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有