单片机知识1(环形缓存区)

环形缓冲区

环形缓冲区是一种常见的缓存数据的数据结构,也称为环形队列,其特点是在存储空间的结尾处和开始处相连,可以循环利用空间。这种数据结构通常用于数据流的缓冲区,例如串口通信、音频数据等场景,可以将数据存储在环形缓冲区中,然后再按照一定规则进行处理。 环形缓冲区的实现方式有多种,其中比较常见的是使用两个指针来标识缓冲区的起始位置和结束位置。当数据被写入缓冲区时,将其存储在当前结束位置,并将结束位置指针向后移动一位;当数据被读出缓冲区时,将其从当前起始位置读取,并将起始位置指针向后移动一位。当结束指针指向缓冲区末尾时,需要将其设置为缓冲区的起始位置,以实现循环利用。

#define BUFFER_SIZE 10 //环形缓冲区大小

typedef struct {
    char buffer[BUFFER_SIZE];
    int head;	//读指针
    int tail;	//写指针
} CircularBuffer;

void buffer_init(CircularBuffer* buffer) {
    buffer->head = 0;
    buffer->tail = 0;
}	//读写指针初始化

int buffer_is_full(CircularBuffer* buffer) {
    return (buffer->tail + 1) % BUFFER_SIZE == buffer->head;
}	//判断缓存区是否已满

int buffer_is_empty(CircularBuffer* buffer) {
    return buffer->head == buffer->tail;
}	//

int buffer_push(CircularBuffer* buffer, char data) {
    if (buffer_is_full(buffer)) {
        return 0;
    }

    buffer->buffer[buffer->tail] = data;
    buffer->tail = (buffer->tail + 1) % BUFFER_SIZE;

    return 1;
}

int buffer_pop(CircularBuffer* buffer, char* data) {
    if (buffer_is_empty(buffer)) {
        return 0;
    }

    *data = buffer->buffer[buffer->head];
    buffer->head = (buffer->head + 1) % BUFFER_SIZE;

    return 1;
}


void main()
{
	CircularBuffer my_buffer;
	buffer_init(&my_buffer);

	buffer_push(&my_buffer, 'a');
	buffer_push(&my_buffer, 'b');

	char data;
	buffer_pop(&my_buffer, &data);
	printf("%c\n", data); // 输出'a'

	buffer_push(&my_buffer, 'c');

	buffer_pop(&my_buffer, &data);
	printf("%c\n", data); // 输出'b'

	buffer_pop(&my_buffer, &data);
	printf("%c\n", data); // 输出'c'

	buffer_pop(&my_buffer, &data); // 这次调用会返回 0,说明缓冲区已经为空
}

#单片机

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值