chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言環(huán)形隊(duì)列的原理和特點(diǎn)

strongerHuang ? 來(lái)源:嵌入式Linux ? 作者:寫(xiě)代碼的籃球球癡 ? 2021-05-11 13:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是環(huán)形隊(duì)列?

環(huán)形緩沖區(qū)是一個(gè)非常典型的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)符合生產(chǎn)者,消費(fèi)者模型,可以理解它是一個(gè)水坑,生產(chǎn)者不斷的往里面灌水,消費(fèi)者就不斷的從里面取出水。

那就可能會(huì)有人問(wèn),既然需要灌水,又需要取出水,為什么還需要開(kāi)辟一個(gè)緩沖區(qū)內(nèi)存空間呢?直接把生產(chǎn)者水管的尾部接到消費(fèi)者水管的頭部不就好了,這樣可以省空間啊。

答案是不行的,生產(chǎn)者生產(chǎn)水的速度是不知道的,消費(fèi)者消費(fèi)水的速度也是不知道的,如果你強(qiáng)制接在一起,因?yàn)樯a(chǎn)和消費(fèi)的速度不同,就非??赡艽嬖谒鼙ǖ那闆r,你說(shuō)這樣危險(xiǎn)不危險(xiǎn)?

音頻系統(tǒng)框架下,alsa就是使用環(huán)形隊(duì)列的,在生產(chǎn)者和消費(fèi)者速度不匹配的時(shí)候,就會(huì)出現(xiàn)xrun的問(wèn)題。

環(huán)形隊(duì)列的特點(diǎn)

1、數(shù)組構(gòu)造環(huán)形緩沖區(qū)

假設(shè)我們用數(shù)組來(lái)構(gòu)造一個(gè)環(huán)形緩存區(qū),如下圖

59134ccc-b20d-11eb-bf61-12bb97331649.png

我們需要幾個(gè)東西來(lái)形容這個(gè)環(huán)形緩沖區(qū),一個(gè)的讀位置,一個(gè)是寫(xiě)位置,一個(gè)是環(huán)形緩沖區(qū)的長(zhǎng)度

5928e3fc-b20d-11eb-bf61-12bb97331649.png

從圖片看,我們知道,這個(gè)環(huán)形緩沖區(qū)的讀寫(xiě)位置是指向數(shù)組的首地址的,環(huán)形緩沖區(qū)的長(zhǎng)度是 5 。

那如何判斷環(huán)形緩沖區(qū)為空呢?

如果 R == W 就是讀寫(xiě)位置相同,則這個(gè)環(huán)形緩沖區(qū)為空

那如何判斷環(huán)形緩沖區(qū)滿(mǎn)了呢?

如果 (W - R )= Len ,則這個(gè)環(huán)形緩沖區(qū)已經(jīng)滿(mǎn)了。

2、向環(huán)形緩沖區(qū)寫(xiě)入 3個(gè)數(shù)據(jù)

寫(xiě)入 3 個(gè)數(shù)據(jù)后,W 的值等于 3 了,R 還是等于 0。

3個(gè)企鵝已經(jīng)排列

3、從環(huán)形緩沖區(qū)讀取2個(gè)數(shù)據(jù)

讀出兩個(gè)數(shù)據(jù)后,R = 2 了,這個(gè)時(shí)候,W還是等于 3,畢竟沒(méi)有再寫(xiě)過(guò)數(shù)據(jù)了。

4、再寫(xiě)入3個(gè)數(shù)據(jù)

如果 W 》 LEN 后,怎么找到最開(kāi)始的位置的呢?這個(gè)就需要進(jìn)行運(yùn)算了,W%LEN 的位置就是放入數(shù)據(jù)的位置 ,6%5 = 1。

5、再寫(xiě)入1個(gè)數(shù)據(jù)

這個(gè)時(shí)候環(huán)形隊(duì)列已經(jīng)滿(mǎn)了,要是想再寫(xiě)入數(shù)據(jù)的話(huà),就不行了,(W - R) = 5 == LEN

代碼實(shí)現(xiàn)

/* 實(shí)現(xiàn)的最簡(jiǎn)單的ringbuff 有更多提升空間,可以留言說(shuō)明 */

#include “stdio.h”

#include “stdlib.h”

#define LEN 10

/*環(huán)形隊(duì)列結(jié)構(gòu)體*/

typedef struct ring_buff{

int array[LEN];

int W;

int R;

}*ring;

/*環(huán)形隊(duì)列初始化*/

struct ring_buff * fifo_init(void)

{

struct ring_buff * p = NULL;

p = (struct ring_buff *)malloc(sizeof(struct ring_buff));

if(p == NULL)

{

printf(“fifo_init malloc error

”);

return NULL;

}

p-》W = 0;

p-》R = 0;

return p;

}

/*判斷環(huán)形隊(duì)列是否已經(jīng)滿(mǎn)了*/

int get_ring_buff_fullstate(struct ring_buff * p_ring_buff)

{

/*如果寫(xiě)位置減去讀位置等于隊(duì)列長(zhǎng)度,就說(shuō)明這個(gè)環(huán)形隊(duì)列已經(jīng)滿(mǎn)*/

if((p_ring_buff-》W - p_ring_buff-》R) == LEN)

{

return (1);

}

else

{

return (0);

}

}

/*判斷環(huán)形隊(duì)列為空*/

int get_ring_buff_emptystate(struct ring_buff * p_ring_buff)

{

/*如果寫(xiě)位置和讀的位置相等,就說(shuō)明這個(gè)環(huán)形隊(duì)列為空*/

if(p_ring_buff-》W == p_ring_buff-》R)

{

return (1);

}

else

{

return (0);

}

}

/*插入數(shù)據(jù)*/

int ring_buff_insert(struct ring_buff * p_ring_buff,int data)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_fullstate(p_ring_buff) == 1)

{

printf(“buff is full

”);

return (-2);

}

p_ring_buff-》array[p_ring_buff-》W%LEN] = data;

p_ring_buff-》W ++;

//printf(“inset:%d %d

”,data,p_ring_buff-》W);

return (0);

}

/*讀取環(huán)形隊(duì)列數(shù)據(jù)*/

int ring_buff_get(struct ring_buff * p_ring_buff)

{

int data = 0;

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_emptystate(p_ring_buff) == 1)

{

printf(“buff is empty

”);

return (-2);

}

data = p_ring_buff-》array[p_ring_buff-》R%LEN];

p_ring_buff-》R++;

return data;

}

/*銷(xiāo)毀*/

int ring_buff_destory(struct ring_buff * p_ring_buff)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

free(p_ring_buff);

return (0);

}

int main()

{

int i = 0;

/*定義一個(gè)環(huán)形緩沖區(qū)*/

ring pt_ring_buff = fifo_init();

/*向環(huán)形緩沖區(qū)中寫(xiě)入數(shù)據(jù)*/

for(i = 0;i《10;i++)

{

ring_buff_insert(pt_ring_buff,i);

}

/*從環(huán)形緩沖區(qū)中讀出數(shù)據(jù)*/

for(i = 0;i《10;i++)

{

printf(“%d ”,ring_buff_get(pt_ring_buff));

}

/*銷(xiāo)毀一個(gè)環(huán)形緩沖區(qū)*/

ring_buff_destory(pt_ring_buff);

return (1);

}

599cb322-b20d-11eb-bf61-12bb97331649.png

換一個(gè)寫(xiě)法,這個(gè)寫(xiě)法是各種大神級(jí)別的

/* 實(shí)現(xiàn)的最簡(jiǎn)單的ringbuff 有更多提升空間,可以留言說(shuō)明 */

#include “stdio.h”

#include “stdlib.h”

#define LEN 64

/*環(huán)形隊(duì)列結(jié)構(gòu)體*/

typedef struct ring_buff{

int array[LEN];

int W;

int R;

}*ring;

/*環(huán)形隊(duì)列初始化*/

struct ring_buff * fifo_init(void)

{

struct ring_buff * p = NULL;

p = (struct ring_buff *)malloc(sizeof(struct ring_buff));

if(p == NULL)

{

printf(“fifo_init malloc error

”);

return NULL;

}

p-》W = 0;

p-》R = 0;

return p;

}

/*判斷環(huán)形隊(duì)列是否已經(jīng)滿(mǎn)了*/

int get_ring_buff_fullstate(struct ring_buff * p_ring_buff)

{

/*如果寫(xiě)位置減去讀位置等于隊(duì)列長(zhǎng)度,就說(shuō)明這個(gè)環(huán)形隊(duì)列已經(jīng)滿(mǎn)*/

if((p_ring_buff-》W - p_ring_buff-》R) == LEN)

{

return (1);

}

else

{

return (0);

}

}

/*判斷環(huán)形隊(duì)列為空*/

int get_ring_buff_emptystate(struct ring_buff * p_ring_buff)

{

/*如果寫(xiě)位置和讀的位置相等,就說(shuō)明這個(gè)環(huán)形隊(duì)列為空*/

if(p_ring_buff-》W == p_ring_buff-》R)

{

return (1);

}

else

{

return (0);

}

}

/*插入數(shù)據(jù)*/

int ring_buff_insert(struct ring_buff * p_ring_buff,int data)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_fullstate(p_ring_buff) == 1)

{

printf(“buff is full

”);

return (-2);

}

//p_ring_buff-》array[p_ring_buff-》W%LEN] = data;

p_ring_buff-》array[p_ring_buff-》W&(LEN -1)] = data;

p_ring_buff-》W ++;

//printf(“inset:%d %d

”,data,p_ring_buff-》W);

return (0);

}

/*讀取環(huán)形隊(duì)列數(shù)據(jù)*/

int ring_buff_get(struct ring_buff * p_ring_buff)

{

int data = 0;

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

if(get_ring_buff_emptystate(p_ring_buff) == 1)

{

printf(“buff is empty

”);

return (-2);

}

//data = p_ring_buff-》array[p_ring_buff-》R%LEN];

data = p_ring_buff-》array[p_ring_buff-》R&(LEN -1)];

p_ring_buff-》R++;

return data;

}

/*銷(xiāo)毀*/

int ring_buff_destory(struct ring_buff * p_ring_buff)

{

if(p_ring_buff == NULL)

{

printf(“p null

”);

return (-1);

}

free(p_ring_buff);

return (0);

}

int main()

{

int i = 0;

/*定義一個(gè)環(huán)形緩沖區(qū)*/

ring pt_ring_buff = fifo_init();

/*向環(huán)形緩沖區(qū)中寫(xiě)入數(shù)據(jù)*/

for(i = 0;i《10;i++)

{

ring_buff_insert(pt_ring_buff,i);

}

/*從環(huán)形緩沖區(qū)中讀出數(shù)據(jù)*/

for(i = 0;i《10;i++)

{

printf(“%d ”,ring_buff_get(pt_ring_buff));

}

/*銷(xiāo)毀一個(gè)環(huán)形緩沖區(qū)*/

ring_buff_destory(pt_ring_buff);

return (1);

}

總結(jié)

環(huán)形隊(duì)列的使用場(chǎng)景非常多,安卓的音頻數(shù)據(jù)讀寫(xiě),很多都用到環(huán)形隊(duì)列,我們?cè)陂_(kāi)發(fā)過(guò)程中使用的環(huán)形隊(duì)列肯定比我上面的那個(gè)例子要復(fù)雜的多,我這里演示的是比較簡(jiǎn)單的功能,但是麻雀雖小,五臟俱全,希望這個(gè)麻雀讓你們了解這個(gè)數(shù)據(jù)結(jié)構(gòu)。在實(shí)際項(xiàng)目中大展身手。

原文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)環(huán)形隊(duì)列的原理和方法

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7315

    瀏覽量

    93988
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7642

    瀏覽量

    144625

原文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)環(huán)形隊(duì)列的原理和方法

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    為什么單片機(jī)還在用C語(yǔ)言編程?

    ,只是C語(yǔ)言是最適合單片機(jī)編程的高級(jí)語(yǔ)言。 一、單片機(jī)編程的特點(diǎn) 1.對(duì)單片機(jī)編程來(lái)說(shuō),我們首先要考慮的是單片機(jī)的程序空間和數(shù)據(jù)空間都是有限的,所以我們?cè)诰帉?xiě)程序時(shí)要盡量做到讓程
    發(fā)表于 11-28 07:37

    C語(yǔ)言特性

    1、高效性:直接操作硬件 C 語(yǔ)言代碼的執(zhí)行效率極高,這是其最為顯著的優(yōu)勢(shì)之一。它能夠直接訪問(wèn)硬件資源,與底層硬件進(jìn)行緊密交互,充分發(fā)揮硬件的性能潛力。在嵌入式開(kāi)發(fā)中,硬件資源往往十分有限,對(duì)程序
    發(fā)表于 11-24 07:01

    C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異

    單片機(jī)c語(yǔ)言相對(duì)于普通C語(yǔ)言增加了一些基本的指令,還有變量的賦值是16進(jìn)制,當(dāng)然單片機(jī)c語(yǔ)言只牽
    發(fā)表于 11-14 07:55

    基于環(huán)形隊(duì)列的UART收發(fā)回顯實(shí)驗(yàn)

    問(wèn)題。在本實(shí)驗(yàn)中,我們使用環(huán)形隊(duì)列來(lái)實(shí)現(xiàn)實(shí)驗(yàn)1的串口收發(fā)回顯,將串口接收到的數(shù)據(jù)暫存在隊(duì)列中,待完成一次接收后再將隊(duì)列中的數(shù)據(jù)全部發(fā)出去。
    的頭像 發(fā)表于 10-27 13:51 ?1703次閱讀
    基于<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊(duì)列</b>的UART收發(fā)回顯實(shí)驗(yàn)

    MiniVC6(C語(yǔ)言快速部署)資料

    MiniVC6(C語(yǔ)言快速部署)軟件,無(wú)需安裝。
    發(fā)表于 09-04 16:59 ?0次下載

    RabbitMQ消息隊(duì)列解決方案

    在現(xiàn)代分布式系統(tǒng)架構(gòu)中,消息隊(duì)列作為核心組件,承擔(dān)著系統(tǒng)解耦、異步處理、流量削峰等重要職責(zé)。RabbitMQ作為一款成熟的消息隊(duì)列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業(yè)的首選方案。本文將從運(yùn)維工程師的角度,詳細(xì)闡述RabbitMQ從單機(jī)部署到集群搭建的完
    的頭像 發(fā)表于 07-08 15:55 ?436次閱讀

    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 C 而不是 C++?

    在單片機(jī)的地界兒里,C語(yǔ)言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說(shuō)內(nèi)存這道坎兒。您當(dāng)stm32f4的
    的頭像 發(fā)表于 05-21 10:33 ?780次閱讀
    主流的 MCU 開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C</b>++?

    NVME控制器之隊(duì)列管理模塊

    隊(duì)列管理模塊是整個(gè)NVMe Host控制器的核心模塊,該模塊實(shí)現(xiàn)了提交隊(duì)列與完成隊(duì)列的管理,多隊(duì)列請(qǐng)求的仲裁判決等功能。隊(duì)列管理模塊中含有數(shù)
    的頭像 發(fā)表于 05-03 15:32 ?423次閱讀
    NVME控制器之<b class='flag-5'>隊(duì)列</b>管理模塊

    單片機(jī)c語(yǔ)言編程實(shí)例大全

    單片機(jī)c語(yǔ)言編程實(shí)例大全_18
    發(fā)表于 04-30 16:11 ?6次下載

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循環(huán)控制語(yǔ)句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?1738次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制

    淺談環(huán)形鐵心兼談環(huán)形變壓器

    近年來(lái),在電子市場(chǎng)上,環(huán)形變壓器已廣泛用于家庭影院和多種電子設(shè)備中,而繞制環(huán)形變壓器所用的鐵心即環(huán)形鐵心,可分A、B兩種系列,現(xiàn)介紹如下: 1. A系列環(huán)形鐵心 A系列
    發(fā)表于 04-16 15:04

    C語(yǔ)言的歷史及程序介紹

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言的歷史及程序介紹.pdf》資料免費(fèi)下載
    發(fā)表于 04-09 16:10 ?0次下載

    OptiSystem應(yīng)用:環(huán)形通量仿真

    環(huán)形通量,顧名思義就是描述了光纖內(nèi)部圓形半徑內(nèi)的通量。環(huán)繞通量通常被量化為從光纖中心開(kāi)始的半徑,該半徑需要環(huán)繞穿過(guò)光纖的25%到75%的光能。由環(huán)繞通量值描述的光纖的功率分布是確保千兆以太網(wǎng)系統(tǒng)中所
    發(fā)表于 04-09 08:47

    51單片機(jī)C語(yǔ)言學(xué)習(xí)筆記

    c51語(yǔ)言快速入門(mén)
    發(fā)表于 03-24 14:04 ?3次下載

    Triton編譯器支持的編程語(yǔ)言

    編寫(xiě)和優(yōu)化深度學(xué)習(xí)代碼。Python是一種廣泛使用的高級(jí)編程語(yǔ)言,具有簡(jiǎn)潔易讀、易于上手、庫(kù)豐富等特點(diǎn),非常適合用于深度學(xué)習(xí)應(yīng)用的開(kāi)發(fā)。 二、領(lǐng)域特定語(yǔ)言(DSL) Triton也提供了一種針對(duì)深度學(xué)習(xí)領(lǐng)域的特定編程
    的頭像 發(fā)表于 12-24 17:33 ?1469次閱讀