【STM32 CubeMX】学STM必会的数据结构——环形缓冲区

这篇具有很好参考价值的文章主要介绍了【STM32 CubeMX】学STM必会的数据结构——环形缓冲区。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在嵌入式系统开发中,经常需要处理数据的缓存和传输,而环形缓冲区是一种常见且有效的数据结构,特别适用于处理实时数据流或者在有限的内存资源下高效地管理数据。在STM32微控制器的开发中,使用CubeMX工具可以方便地配置和生成环形缓冲区的代码,从而加速开发过程并提高代码的可维护性。本文将介绍STM32 CubeMX中环形缓冲区的使用方法以及其在嵌入式系统开发中的重要性。


一、环形缓冲区是什么

当我们处理数据时,有时候需要一个地方来临时存储它们,就好像我们用盘子装菜一样。但是,内存有限,如果盘子装满了就得从头开始放菜,这样效率不高。环形缓冲区就像是一个环形的菜盘,当盘子满了,就会从一端开始取走菜,同时从另一端继续放新的菜,这样就能不停地装菜,而且效率很高。

现在,让我们画一个简单的图来演示一下:

[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]
 ^                           ^
 |                           |
取走                        放入

stm32环形缓冲区,从0带你学会如何像人类一样写STM32程序,stm32,数据结构,嵌入式硬件,c,c++,单片机

这里,我们有一个有8个位置的环形缓冲区,用方括号表示每个位置。现在,我们从左边取走了一个数据,然后从右边放入了一个新的数据。这样,缓冲区就像一个环,数据可以不停地在其中循环。

这种数据结构适合一方读buf,一方写buf的情节

二、实现环形缓冲区

实现分析

我们需要定义存储区buf

char buf[100];

我们还需要定义读位置为0,写位置为0
后面我们通过这两个变量来操作读和写

int r,w = 0;

那么怎么写入数据和读数据呢?
读:
首先肯定要有数据我们才能读吧,那么怎么判断有没有数据呢?
当我们的r = w时,他是空的,如果是空,我们肯定不能读,如果是有数据,直接返回对应下标即可

写:
首先我们要知道,如果buf满了,肯定是不能把原来的数据给干掉的,那么我们怎么判断他有没有满呢,如果直接使用r = w来判断,那就和判断空是一样的了,我们可以使用w+1 = r来判断,因为如果没满,我写一个进去,他肯定不等于r,如果满了我写一个进去他等于r就是满了,我们使用w+1来模拟写入后的w状态即可

如果读和写超过了这个buf的原始大小,因为他是环形缓冲区,所以需要把下标取余个buf的size

2.1 环形缓冲区初始化

首先声明一个结构体,这个结构体存储着缓冲区buf,读r和写w

typedef struct
{
	int *buf;
	int len;
	int r;
	int w;
}CircleBuf,*p_CircleBuf;

接下来声明一个函数进行init操作

void CircleBufInit(p_CircleBuf pbuf,int* buf ,int len)
{
	pbuf->r = pbuf->w = 0;
	pbuf->buf = buf;
	pbuf->len = len;
}

对于这个函数,你可以从外部传入buf进行缓冲区的初始化,也可以使用malloc进行内存的分配初始化

2.2 写buf

我们需要实现下面这个函数来进行写buf

void CircleBufWrite(p_CircleBuf pCircleBuf, int val);

首先我们需要先定义一个变量存储w的下一个下标,并且如果下一个下标超出len,需要变成0,实现环形

int nextW = pCircleBuf->w + 1;
nextW %= pCircleBuf->len;

接下来,我们需要去判断nextW是否等于r,如果不等于,代码没有满

if (pCircleBuf->r != nextW)

如果没有满,我们需要把对应的w下标赋值成val
然后w下标++,再对w进行取余len,如果下标超出len,需要变成0,实现环形

pCircleBuf->buf[pCircleBuf->w] = val;
pCircleBuf->w++;
pCircleBuf->w %= pCircleBuf->len;

2.3 读buf

我们需要实现下面这个函数来进行读buf

void CircleBufRead(p_CircleBuf pCircleBuf, int* val);

首先我们先要判断r !=w才能进行读操作

if (pCircleBuf->r != pCircleBuf->w)

如果不等于
我们可以把r对应的下标给val
然后r读下标++
因为可能存在读完的情况所以我们需要进行取余操作

*val = pCircleBuf->buf[pCircleBuf->r];
pCircleBuf->r++;
pCircleBuf->r %= pCircleBuf->len;

如果等于,我们可以把val的值变成NULL

else
{
	val = NULL;
}

2.4 测试

我们可以先写入一部分数据,然后,我们可以使用CircleBufRead读出来,读出来之后立马进行写,我们可以通过下面这种方法进行缓冲区的测试:

CircleBuf cBuf;
int buf[100] = { 0 };
CircleBufInit(&cBuf,&buf,100);

for (int i = 0; i < 100; i++)
{
	CircleBufWrite(&cBuf, i);
}

int i = 100;
while (1)
{
	int temp = -1;
	CircleBufRead(&cBuf, &temp);
	printf("%d ", temp);

	CircleBufWrite(&cBuf, i);
	i++;

	Sleep(10);
}

三、代码总况

//Circle.c
#include "circleBuf.h"
#include <memory.h>

void CircleBufInit(p_CircleBuf pbuf,int* buf ,int len)
{
	pbuf->r = pbuf->w = 0;
	pbuf->buf = buf;
	pbuf->len = len;
}

void CircleBufRead(p_CircleBuf pCircleBuf, int* val)
{
	if (pCircleBuf->r != pCircleBuf->w)
	{
		*val = pCircleBuf->buf[pCircleBuf->r];
		pCircleBuf->r++;
		pCircleBuf->r %= pCircleBuf->len;
	}
	else
	{
		val = NULL;
	}
}

void CircleBufWrite(p_CircleBuf pCircleBuf, int val)
{
	int nextW = pCircleBuf->w + 1;
	nextW %= pCircleBuf->len;
	if (pCircleBuf->r != nextW)
	{
		pCircleBuf->buf[pCircleBuf->w] = val;
		pCircleBuf->w++;
		pCircleBuf->w %= pCircleBuf->len;
	}
}
//Circle.h
#pragma once

typedef struct
{
	int *buf;
	int len;
	int r;
	int w;
}CircleBuf,*p_CircleBuf;

void CircleBufInit(p_CircleBuf pbuf, int*buf ,int len);

void CircleBufRead(p_CircleBuf pCircleBuf, int* val);

void CircleBufWrite(p_CircleBuf pCircleBuf, int val);
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "circleBuf.h"
#include <Windows.h>

int main()
{
	CircleBuf cBuf;
	int buf[100] = { 0 };
	CircleBufInit(&cBuf,&buf,100);

	for (int i = 0; i < 100; i++)
	{
		CircleBufWrite(&cBuf, i);
	}

	int i = 100;
	while (1)
	{
		int temp = -1;
		CircleBufRead(&cBuf, &temp);
		printf("%d ", temp);

		CircleBufWrite(&cBuf, i);
		i++;

		Sleep(10);
	}

	system("pause>0");
	return 0;
}

总结

环形缓冲区是嵌入式系统开发中常用的数据结构之一,具有高效、可靠的特性。通过STM32 CubeMX工具,我们可以轻松地配置和生成环形缓冲区的代码,从而简化开发流程并提高代码的可维护性。掌握环形缓冲区的原理和使用方法,对于STM32微控制器的开发者来说是必不可少的技能。希望本文能够帮助读者更好地理解和应用环形缓冲区,从而更加高效地开发嵌入式系统。文章来源地址https://www.toymoban.com/news/detail-849267.html

到了这里,关于【STM32 CubeMX】学STM必会的数据结构——环形缓冲区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [数据结构-1]:环形buffer以及读写同步

    目录 一、什么是环形buffer 二、环形buffer的优点与使用场合 三、环节buffer的读写同步 3.1 基本原理 3.2 代码示例 环形缓冲区(Circular Buffer)也被称为环形队列(Circular Queue)或循环缓冲区,是一种数据结构,用于在固定大小的缓冲区中存储和处理数据。 环形缓冲区的特点是首

    2024年03月11日
    浏览(53)
  • 【数据结构OJ题】环形链表II

    原题链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 如果有小伙伴不了解环形链表,可以先看看这篇文章: https://blog.csdn.net/m0_62531913/article/details/132352203?spm=1001.2014.3001.5502 我们来看下图:  我们根据这个结论就可以做出这道题目了!

    2024年02月12日
    浏览(44)
  • C语言每日一题:13《数据结构》环形链表。

    题目链接: 使用快慢指针利用相对移动的思想: 1,令快指针(fast)速度为2. 2.慢指针(slow)速度为1. 3.以慢指针进入环中开始。 4。假设slow刚刚进入环中fast与它相距N。 如图所示: 1,令快指针(fast)速度为3.M 2.慢指针(slow)速度为1. 3.以慢指针进入环中开始。 4。假设slow刚

    2024年02月14日
    浏览(46)
  • 万字精讲——数据结构栈与队列必会OJ练习

    W...Y的主页 💕 代码库分享 😊 在之前的博客中,我们学习了栈与队列的基本内容,并且实现了栈与队列。今天我们进行刷题训练,走进栈与队列的世界中去感受一番!!! 目录 括号匹配问题  使用队列实现栈 用栈实现队列 设计循环队列 给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{

    2024年02月10日
    浏览(47)
  • 从零开始学习数据结构—【链表】—【探索环形链的设计之美】

    双向环形链表带哨兵,这个时候的 哨兵 , 可以当头,也可做尾 带哨兵双向循环链表:结构稍微复杂,实现简单。一般用来单独存储数据,实际中使用的链表数据结构都是带头双向链表。另外,这个结构虽然结构复杂,但是使用代码实现后会发现结构会带来很多优势。 双向

    2024年02月22日
    浏览(43)
  • 【STM32 CubeMX】SPI层次结构SPI协议与SPI控制器结构

    随着嵌入式系统的迅猛发展,STM32系列微控制器在各种应用中得到广泛应用。在嵌入式系统设计中,串行外设接口(SPI)是一种常见且重要的通信协议。为了更便捷地配置和使用SPI,STMicroelectronics提供了一款强大的工具——STM32 CubeMX。本文将着重介绍STM32 CubeMX中SPI的层次结构

    2024年02月20日
    浏览(46)
  • 【STM32 CubeMX】I2C层次结构、I2C协议

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于连接各种外设和传感器。理解I2C的层次结构、协议和硬件结构对于STM32微控制器的开发至关重要。通过STM32 CubeMX提供的图形化配置工具,我们能够更轻松地理解和配置I2C通信,同时深入了解

    2024年02月22日
    浏览(80)
  • 【数据结构】LeetCode升级版的环形链表,复制带随机指针的链表

              1、题目说明           2、题目解析           1、题目说明           2、题目解析      1、题目说明 题目链接: 升级版的环形链表  给定一个链表的头节点 head ,返回链表开始入环的第一个节点。  如果链表无环,则返回NULL。 如果链表中有某个节点,可以通

    2024年01月16日
    浏览(62)
  • 最详细STM32,cubeMX串口发送,接收数据

    这篇文章将详细介绍 串口 发送数据,接受数据。 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。 实验:串口发送数据点亮 led。 如果想了解串口的基础知识可以参考我之前的文章: STM32Cube串口USART发送

    2024年02月04日
    浏览(73)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)

    目录 一.前言  二.leetcode160. 相交链表  1.问题描述 2.问题分析与求解 三.leetcode141. 环形链表 1.问题描述 2.代码思路  3.证明分析  下一题会用到的重要小结论: 四.leetcode142. 环形链表 II 1.问题描述 2.问题分析与求解 Judgecycle接口: 方法一: 方法二:  单链表和带环单链表

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包