国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32 CubeMX】學(xué)STM必會的數(shù)據(jù)結(jié)構(gòu)——環(huán)形緩沖區(qū)

這篇具有很好參考價值的文章主要介紹了【STM32 CubeMX】學(xué)STM必會的數(shù)據(jù)結(jié)構(gòu)——環(huán)形緩沖區(qū)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

在嵌入式系統(tǒng)開發(fā)中,經(jīng)常需要處理數(shù)據(jù)的緩存和傳輸,而環(huán)形緩沖區(qū)是一種常見且有效的數(shù)據(jù)結(jié)構(gòu),特別適用于處理實時數(shù)據(jù)流或者在有限的內(nèi)存資源下高效地管理數(shù)據(jù)。在STM32微控制器的開發(fā)中,使用CubeMX工具可以方便地配置和生成環(huán)形緩沖區(qū)的代碼,從而加速開發(fā)過程并提高代碼的可維護性。本文將介紹STM32 CubeMX中環(huán)形緩沖區(qū)的使用方法以及其在嵌入式系統(tǒng)開發(fā)中的重要性。


一、環(huán)形緩沖區(qū)是什么

當(dāng)我們處理數(shù)據(jù)時,有時候需要一個地方來臨時存儲它們,就好像我們用盤子裝菜一樣。但是,內(nèi)存有限,如果盤子裝滿了就得從頭開始放菜,這樣效率不高。環(huán)形緩沖區(qū)就像是一個環(huán)形的菜盤,當(dāng)盤子滿了,就會從一端開始取走菜,同時從另一端繼續(xù)放新的菜,這樣就能不停地裝菜,而且效率很高。

現(xiàn)在,讓我們畫一個簡單的圖來演示一下:

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

stm32環(huán)形緩沖區(qū),從0帶你學(xué)會如何像人類一樣寫STM32程序,stm32,數(shù)據(jù)結(jié)構(gòu),嵌入式硬件,c,c++,單片機

這里,我們有一個有8個位置的環(huán)形緩沖區(qū),用方括號表示每個位置。現(xiàn)在,我們從左邊取走了一個數(shù)據(jù),然后從右邊放入了一個新的數(shù)據(jù)。這樣,緩沖區(qū)就像一個環(huán),數(shù)據(jù)可以不停地在其中循環(huán)。

這種數(shù)據(jù)結(jié)構(gòu)適合一方讀buf,一方寫buf的情節(jié)

二、實現(xiàn)環(huán)形緩沖區(qū)

實現(xiàn)分析

我們需要定義存儲區(qū)buf

char buf[100];

我們還需要定義讀位置為0,寫位置為0
后面我們通過這兩個變量來操作讀和寫

int r,w = 0;

那么怎么寫入數(shù)據(jù)和讀數(shù)據(jù)呢?
讀:
首先肯定要有數(shù)據(jù)我們才能讀吧,那么怎么判斷有沒有數(shù)據(jù)呢?
當(dāng)我們的r = w時,他是空的,如果是空,我們肯定不能讀,如果是有數(shù)據(jù),直接返回對應(yīng)下標(biāo)即可

寫:
首先我們要知道,如果buf滿了,肯定是不能把原來的數(shù)據(jù)給干掉的,那么我們怎么判斷他有沒有滿呢,如果直接使用r = w來判斷,那就和判斷空是一樣的了,我們可以使用w+1 = r來判斷,因為如果沒滿,我寫一個進去,他肯定不等于r,如果滿了我寫一個進去他等于r就是滿了,我們使用w+1來模擬寫入后的w狀態(tài)即可

如果讀和寫超過了這個buf的原始大小,因為他是環(huán)形緩沖區(qū),所以需要把下標(biāo)取余個buf的size

2.1 環(huán)形緩沖區(qū)初始化

首先聲明一個結(jié)構(gòu)體,這個結(jié)構(gòu)體存儲著緩沖區(qū)buf,讀r和寫w

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

接下來聲明一個函數(shù)進行init操作

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

對于這個函數(shù),你可以從外部傳入buf進行緩沖區(qū)的初始化,也可以使用malloc進行內(nèi)存的分配初始化

2.2 寫buf

我們需要實現(xiàn)下面這個函數(shù)來進行寫buf

void CircleBufWrite(p_CircleBuf pCircleBuf, int val);

首先我們需要先定義一個變量存儲w的下一個下標(biāo),并且如果下一個下標(biāo)超出len,需要變成0,實現(xiàn)環(huán)形

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

接下來,我們需要去判斷nextW是否等于r,如果不等于,代碼沒有滿

if (pCircleBuf->r != nextW)

如果沒有滿,我們需要把對應(yīng)的w下標(biāo)賦值成val
然后w下標(biāo)++,再對w進行取余l(xiāng)en,如果下標(biāo)超出len,需要變成0,實現(xiàn)環(huán)形

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

2.3 讀buf

我們需要實現(xiàn)下面這個函數(shù)來進行讀buf

void CircleBufRead(p_CircleBuf pCircleBuf, int* val);

首先我們先要判斷r !=w才能進行讀操作

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

如果不等于
我們可以把r對應(yīng)的下標(biāo)給val
然后r讀下標(biāo)++
因為可能存在讀完的情況所以我們需要進行取余操作

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

如果等于,我們可以把val的值變成NULL

else
{
	val = NULL;
}

2.4 測試

我們可以先寫入一部分?jǐn)?shù)據(jù),然后,我們可以使用CircleBufRead讀出來,讀出來之后立馬進行寫,我們可以通過下面這種方法進行緩沖區(qū)的測試:

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;
}

總結(jié)

環(huán)形緩沖區(qū)是嵌入式系統(tǒng)開發(fā)中常用的數(shù)據(jù)結(jié)構(gòu)之一,具有高效、可靠的特性。通過STM32 CubeMX工具,我們可以輕松地配置和生成環(huán)形緩沖區(qū)的代碼,從而簡化開發(fā)流程并提高代碼的可維護性。掌握環(huán)形緩沖區(qū)的原理和使用方法,對于STM32微控制器的開發(fā)者來說是必不可少的技能。希望本文能夠幫助讀者更好地理解和應(yīng)用環(huán)形緩沖區(qū),從而更加高效地開發(fā)嵌入式系統(tǒng)。文章來源地址http://www.zghlxwxcb.cn/news/detail-849267.html

到了這里,關(guān)于【STM32 CubeMX】學(xué)STM必會的數(shù)據(jù)結(jié)構(gòu)——環(huán)形緩沖區(qū)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • [數(shù)據(jù)結(jié)構(gòu)-1]:環(huán)形buffer以及讀寫同步

    目錄 一、什么是環(huán)形buffer 二、環(huán)形buffer的優(yōu)點與使用場合 三、環(huán)節(jié)buffer的讀寫同步 3.1 基本原理 3.2 代碼示例 環(huán)形緩沖區(qū)(Circular Buffer)也被稱為環(huán)形隊列(Circular Queue)或循環(huán)緩沖區(qū),是一種數(shù)據(jù)結(jié)構(gòu),用于在固定大小的緩沖區(qū)中存儲和處理數(shù)據(jù)。 環(huán)形緩沖區(qū)的特點是首

    2024年03月11日
    瀏覽(15)
  • 【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表II

    【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表II

    原題鏈接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 如果有小伙伴不了解環(huán)形鏈表,可以先看看這篇文章: https://blog.csdn.net/m0_62531913/article/details/132352203?spm=1001.2014.3001.5502 我們來看下圖: ?我們根據(jù)這個結(jié)論就可以做出這道題目了!

    2024年02月12日
    瀏覽(19)
  • C語言每日一題:13《數(shù)據(jù)結(jié)構(gòu)》環(huán)形鏈表。

    C語言每日一題:13《數(shù)據(jù)結(jié)構(gòu)》環(huán)形鏈表。

    題目鏈接: 使用快慢指針利用相對移動的思想: 1,令快指針(fast)速度為2. 2.慢指針(slow)速度為1. 3.以慢指針進入環(huán)中開始。 4。假設(shè)slow剛剛進入環(huán)中fast與它相距N。 如圖所示: 1,令快指針(fast)速度為3.M 2.慢指針(slow)速度為1. 3.以慢指針進入環(huán)中開始。 4。假設(shè)slow剛

    2024年02月14日
    瀏覽(24)
  • 萬字精講——數(shù)據(jù)結(jié)構(gòu)棧與隊列必會OJ練習(xí)

    萬字精講——數(shù)據(jù)結(jié)構(gòu)棧與隊列必會OJ練習(xí)

    W...Y的主頁??? 代碼庫分享??? 在之前的博客中,我們學(xué)習(xí)了棧與隊列的基本內(nèi)容,并且實現(xiàn)了棧與隊列。今天我們進行刷題訓(xùn)練,走進棧與隊列的世界中去感受一番?。?! 目錄 括號匹配問題 ?使用隊列實現(xiàn)棧 用棧實現(xiàn)隊列 設(shè)計循環(huán)隊列 給定一個只包括? \\\'(\\\' , \\\')\\\' , \\\'{

    2024年02月10日
    瀏覽(21)
  • 從零開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)—【鏈表】—【探索環(huán)形鏈的設(shè)計之美】

    從零開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)—【鏈表】—【探索環(huán)形鏈的設(shè)計之美】

    雙向環(huán)形鏈表帶哨兵,這個時候的 哨兵 , 可以當(dāng)頭,也可做尾 帶哨兵雙向循環(huán)鏈表:結(jié)構(gòu)稍微復(fù)雜,實現(xiàn)簡單。一般用來單獨存儲數(shù)據(jù),實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu)都是帶頭雙向鏈表。另外,這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實現(xiàn)后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢。 雙向

    2024年02月22日
    瀏覽(32)
  • 【STM32 CubeMX】SPI層次結(jié)構(gòu)SPI協(xié)議與SPI控制器結(jié)構(gòu)

    【STM32 CubeMX】SPI層次結(jié)構(gòu)SPI協(xié)議與SPI控制器結(jié)構(gòu)

    隨著嵌入式系統(tǒng)的迅猛發(fā)展,STM32系列微控制器在各種應(yīng)用中得到廣泛應(yīng)用。在嵌入式系統(tǒng)設(shè)計中,串行外設(shè)接口(SPI)是一種常見且重要的通信協(xié)議。為了更便捷地配置和使用SPI,STMicroelectronics提供了一款強大的工具——STM32 CubeMX。本文將著重介紹STM32 CubeMX中SPI的層次結(jié)構(gòu)

    2024年02月20日
    瀏覽(28)
  • 【STM32 CubeMX】I2C層次結(jié)構(gòu)、I2C協(xié)議

    【STM32 CubeMX】I2C層次結(jié)構(gòu)、I2C協(xié)議

    在STM32 CubeMX環(huán)境中,I2C(Inter-Integrated Circuit)是一種常用的串行通信協(xié)議,廣泛應(yīng)用于連接各種外設(shè)和傳感器。理解I2C的層次結(jié)構(gòu)、協(xié)議和硬件結(jié)構(gòu)對于STM32微控制器的開發(fā)至關(guān)重要。通過STM32 CubeMX提供的圖形化配置工具,我們能夠更輕松地理解和配置I2C通信,同時深入了解

    2024年02月22日
    瀏覽(34)
  • 【數(shù)據(jù)結(jié)構(gòu)】LeetCode升級版的環(huán)形鏈表,復(fù)制帶隨機指針的鏈表

    【數(shù)據(jù)結(jié)構(gòu)】LeetCode升級版的環(huán)形鏈表,復(fù)制帶隨機指針的鏈表

    ? ? ? ? ? 1、題目說明 ? ? ? ? ? 2、題目解析 ? ? ? ? ??1、題目說明 ? ? ? ? ? 2、題目解析 ? ? ?1、題目說明 題目鏈接: 升級版的環(huán)形鏈表? 給定一個鏈表的頭節(jié)點 head ,返回鏈表開始入環(huán)的第一個節(jié)點。? 如果鏈表無環(huán),則返回NULL。 如果鏈表中有某個節(jié)點,可以通

    2024年01月16日
    瀏覽(102)
  • 最詳細STM32,cubeMX串口發(fā)送,接收數(shù)據(jù)

    最詳細STM32,cubeMX串口發(fā)送,接收數(shù)據(jù)

    這篇文章將詳細介紹 串口 發(fā)送數(shù)據(jù),接受數(shù)據(jù)。 實驗開發(fā)板:STM32F103C8T6。 所需軟件:keil5 , cubeMX 。 實驗?zāi)康模毫私?串口的基礎(chǔ)知識,掌握串口如何發(fā)送,接收數(shù)據(jù) 。 實驗:串口發(fā)送數(shù)據(jù)點亮 led。 如果想了解串口的基礎(chǔ)知識可以參考我之前的文章: STM32Cube串口USART發(fā)送

    2024年02月04日
    瀏覽(126)
  • 數(shù)據(jù)結(jié)構(gòu):帶環(huán)單鏈表基礎(chǔ)OJ練習(xí)筆記(leetcode142. 環(huán)形鏈表 II)(leetcode三題大串燒)

    數(shù)據(jù)結(jié)構(gòu):帶環(huán)單鏈表基礎(chǔ)OJ練習(xí)筆記(leetcode142. 環(huán)形鏈表 II)(leetcode三題大串燒)

    目錄 一.前言? 二.leetcode160.?相交鏈表? 1.問題描述 2.問題分析與求解 三.leetcode141.?環(huán)形鏈表 1.問題描述 2.代碼思路? 3.證明分析? 下一題會用到的重要小結(jié)論: 四.leetcode142.?環(huán)形鏈表 II 1.問題描述 2.問題分析與求解 Judgecycle接口: 方法一: 方法二:? 單鏈表和帶環(huán)單鏈表

    2023年04月08日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包