大家好,欢迎来到IT知识分享网。
一、概念
所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
有些数据在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便。
C语言又提供了一种数据结构称为位域(位段)
二、定义
typedef union { struct { unsigned index : 7 ; }bit; uint16_t max; }index_128_t;
上述代码中,在联合体union中就定义拉一个位域bit,占用7个位,最大可以表示为2^7-1 = 127。这一特性可以很好的使用在循环缓冲区中,上述最大为127,则可以定义一个128字节的缓冲区,定义一个读指针,一个写指针。写指针一直向前加,加到127后自动重置为0,很是方便。同理读指针也是一样的。
三、循环缓冲区使用
循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,工作原理就像内存是连续的且可循环的一样。在生成和使用内存时,不需将原来的数据全部重新清理掉,只要调整read/write 指针即可。当添加数据时,writer指针前进。当使用数据时,read指针向前移动。当到达缓冲区的尾部时,指针又回到缓冲区的起始位置。
先定义一个位段,缓冲区的大小设定在2048字节。
typedef union { struct { unsigned index : 11 ; }bit; uint16_t max; }index_2048_t;
循环缓冲区数据结构定义:
typedef union { struct { unsigned index : 11 ; }bit; uint16_t max; }index_2048_t;
循环缓冲区相关的API定义:
void ring_buffer_2048_init(ring_buffer_2048_t * rb,unsigned char * buffer); unsigned int ring_buffer_2048_write_char(ring_buffer_2048_t * rb,unsigned char data); unsigned int ring_buffer_2048_write(ring_buffer_2048_t * rb ,unsigned char * data,uint16_t len); unsigned int ring_buffer_2048_read(ring_buffer_2048_t *rb,unsigned char * rev,uint16_t revLen); void ring_buffer_2048_clr(ring_buffer_2048_t *rb); unsigned int ring_buffer_2048_len(ring_buffer_2048_t *rb); unsigned char ring_buffer_2048_front(ring_buffer_2048_t * rb); unsigned char ring_buffer_2048_rear(ring_buffer_2048_t * rb);
循环缓冲区相关代码截图:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/163886.html