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

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TencentOS-tiny中環(huán)形隊列的實現(xiàn)

strongerHuang ? 來源:Mculover666 ? 作者:Mculover666 ? 2021-10-08 16:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 什么是隊列隊列(queue)是一種只能在一端插入元素、在另一端刪除元素的數(shù)據(jù)結構,遵循「先入先出」(FIFO)的規(guī)則。

隊列中有兩個基本概念:

隊頭指針(可變):永遠指向此隊列的第一個數(shù)據(jù)元素;

隊尾指針(可變):永遠指向此隊列的最后一個數(shù)據(jù)元素;

隊列中的數(shù)據(jù)存儲方式有兩種:

① 基于靜態(tài)連續(xù)內存(數(shù)組)存儲,如圖:② 基于動態(tài)內存(鏈表節(jié)點)存儲,如圖:

?

后續(xù)都使用基于靜態(tài)內存存儲的隊列講解。

?隊列提供兩個統(tǒng)一的操作:

「入隊(enqueue)」

入隊將一個元素添加到隊尾,并將隊尾指針+1后移,如圖:

「出隊(dequeue)」

出隊將從隊頭中取出一個元素,并將隊頭指針+1后移,如圖:

2. 環(huán)形隊列2.1. 環(huán)形隊列的特點

普通隊列的入隊操作將隊尾指針后移+1,出隊操作將隊頭指針后移+1,操作幾次之后會發(fā)現(xiàn)隊頭指針和隊尾指針都跑到緩沖區(qū)的尾部去了:這就導致了前面的內存空間全被浪費,如果要重新恢復使用,則需要進行元素和指針的移動:顯然這種隊列使用方式太不方便了,所以就誕生了環(huán)形隊列:「不用搬移元素和指針,一直可以重復利用這段內存空間」。

2.2. 環(huán)形隊列的實現(xiàn)

TencentOS-tiny中環(huán)形隊列的實現(xiàn)在tos_ring_queue.h和tos_ring_queue.c中。

typedef struct k_ring_queue_st {

knl_obj_t knl_obj;

uint16_t head; //隊頭指針

uint16_t tail; //隊尾指針

size_t total; //記錄隊列中元素的個數(shù)

uint8_t *pool; //隊列底層的存儲結構(一個數(shù)組)

size_t item_size; //隊列中每個元素的大小,單位:字節(jié)

size_t item_cnt; //隊列中可以容納的元素數(shù)量

} k_ring_q_t;

環(huán)形隊列初始化,將隊頭指針和隊尾置0:

__API__ k_err_t tos_ring_q_create(k_ring_q_t *ring_q, void *pool, size_t item_cnt, size_t item_size)

{

//省略了參數(shù)合法性檢查代碼

ring_q-》head = 0u;

ring_q-》tail = 0u;

ring_q-》total = 0;

ring_q-》pool = (uint8_t *)pool;

ring_q-》item_size = item_size;

ring_q-》item_cnt = item_cnt;

return K_ERR_NONE;

}

判斷環(huán)形隊列是否為滿或者為空:

__API__ int tos_ring_q_is_empty(k_ring_q_t *ring_q)

{

TOS_CPU_CPSR_ALLOC();

int is_empty = K_FALSE;

//省略了參數(shù)合法性檢查代碼

TOS_CPU_INT_DISABLE();

is_empty = (ring_q-》total == 0 ? K_TRUE : K_FALSE);

TOS_CPU_INT_ENABLE();

return is_empty;

}

__API__ int tos_ring_q_is_full(k_ring_q_t *ring_q)

{

TOS_CPU_CPSR_ALLOC();

int is_full = K_FALSE;

//省略了參數(shù)合法性檢查代碼

TOS_CPU_INT_DISABLE();

is_full = (ring_q-》total == ring_q-》item_cnt ? K_TRUE : K_FALSE);

TOS_CPU_INT_ENABLE();

return is_full;

}

環(huán)形隊列入隊操作的API如下:

__API__ k_err_t tos_ring_q_enqueue(k_ring_q_t *ring_q, void *item, size_t item_size);

在此API中,入隊操作的實現(xiàn)如下:

__STATIC_INLINE__ void ring_q_item_increase(k_ring_q_t *ring_q)

{

ring_q-》tail = RING_NEXT(ring_q, ring_q-》tail);

++ring_q-》total;

}

環(huán)形隊列出隊操作的API如下:

__API__ k_err_t tos_ring_q_dequeue(k_ring_q_t *ring_q, void *item, size_t *item_size);

在此API中,出隊操作的實現(xiàn)如下:

__STATIC_INLINE__ void ring_q_item_decrease(k_ring_q_t *ring_q)

{

ring_q-》head = RING_NEXT(ring_q, ring_q-》head);

--ring_q-》total;

}

在入隊和出隊操作的時候都使用了 RING_NEXT 宏,用來獲取在環(huán)形隊列中的下一個位置:

#define RING_NEXT(ring_q, index) ((index + 1) % ring_q-》item_cnt)

2.3. 環(huán)形隊列使用Demo

編寫如下的測試代碼:

#include 《tos_k.h》typedef struct item_st {

int a;

int b;

int c;

} item_t;

#define RING_QUEUE_ITEM_MAX 5uint8_t ring_q_buffer[RING_QUEUE_ITEM_MAX * sizeof(item_t)];

k_ring_q_t ring_q;

void entry_task_demo(void *arg)

{

k_err_t err;

int i;

item_t item;

size_t item_size;

//創(chuàng)建環(huán)形隊列

tos_ring_q_create(&ring_q, ring_q_buffer, RING_QUEUE_ITEM_MAX, sizeof(item_t));

//數(shù)據(jù)入隊

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

{

item.a = i;

item.b = i;

item.c = i;

err = tos_ring_q_enqueue(&ring_q, &item, sizeof(item_t));

if(err == K_ERR_NONE)

{

printf(“enqueue a item: %d %d %d

”, item.a, item.b, item.c);

}

else

{

printf(“ring queue enqueue fail,err = %d

”, err);

}

}

//隊列滿之后,繼續(xù)入隊

err = tos_ring_q_enqueue(&ring_q, &item, sizeof(item_t));

if(err == K_ERR_RING_Q_FULL)

{

printf(“ring queue is full: %s

”, tos_ring_q_is_full(&ring_q) ? “TRUE” : “FALSE”);

}

else

{

printf(“ring queue enqueue fail,err = %d

”, err);

}

//數(shù)據(jù)出隊

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

{

err = tos_ring_q_dequeue(&ring_q, &item, &item_size);

if(err == K_ERR_NONE)

{

printf(“dequeue a item(%d bytes): %d %d %d

”, item_size, item.a, item.b, item.c);

}

else

{

printf(“ring queue dequeue fail,err = %d

”, err);

}

}

//沒有數(shù)據(jù)后繼續(xù)出隊

err = tos_ring_q_dequeue(&ring_q, &item, &item_size);

if(err == K_ERR_RING_Q_EMPTY)

{

printf(“ring queue is empty: %s

”, tos_ring_q_is_empty(&ring_q) ? “TRUE” : “FALSE”);

}

else

{

printf(“ring queue dequeue fail,err = %d

”, err);

}

}

運行結果如下:

3. 優(yōu)先級隊列3.1. 優(yōu)先級隊列的特點

優(yōu)先級隊列也是一種基于隊列的數(shù)據(jù)結構,但是它「不遵循FIFO」,而是按照每個元素的優(yōu)先級進行出隊:「最高優(yōu)先級的先出隊」。

3.2. 優(yōu)先級隊列的實現(xiàn)

TencentOS-tiny中環(huán)形隊列的實現(xiàn)在tos_prio_queue.h和tos_prio_queue.c中。

優(yōu)先級隊列在數(shù)據(jù)入隊的時候,會按照入隊元素的優(yōu)先級進行一次排序,「將優(yōu)先級值最小(優(yōu)先級最高的元素)放在隊頭」,出隊的時候只需要取第一個元素即可。

正是因為這種特性,優(yōu)先級隊列的底層存儲結構不能使用數(shù)組(排序太麻煩),而是使用了二項堆的數(shù)據(jù)結構。

?

二項堆是一種二叉樹集合的數(shù)據(jù)結構,在本文中不再深入講解,有興趣的讀者可以自己搜索閱讀。

?下面只給出優(yōu)先級隊列的API,「理解其規(guī)則,會用即可」。

創(chuàng)建優(yōu)先級隊列

__API__ k_err_t tos_prio_q_create(k_prio_q_t *prio_q, void *mgr_array, void *pool, size_t item_cnt, size_t item_size);

參數(shù)描述

prio_q優(yōu)先級隊列控制塊指針

mgr_array提供一塊緩沖區(qū)用于內部管理

pool隊列的緩沖區(qū)

item_cnt隊列可容納的元素數(shù)量

item_size每個元素的大小,單位字節(jié)

其中用于內部管理的緩存區(qū)大小可以使用宏定義來計算,比如有5個元素的管理緩沖區(qū)大?。?/p>

uint8_t mgr_pool[TOS_PRIO_Q_MGR_ARRAY_SIZE(5)];

元素入隊

__API__ k_err_t tos_prio_q_enqueue(k_prio_q_t *prio_q, void *item, size_t item_size, k_prio_t prio);

其中優(yōu)先級的值遵循:數(shù)值越小,優(yōu)先級越高。

元素出隊

__API__ k_err_t tos_prio_q_dequeue(k_prio_q_t *prio_q, void *item, size_t *item_size, k_prio_t *prio);

其中prio需要傳入一個地址,用于記錄出隊元素的優(yōu)先級。

3.3. 優(yōu)先級隊列使用Demo

#include 《tos_k.h》typedef struct item_st {

int a;

int b;

int c;

} item_t;

#define PRIO_QUEUE_ITEM_MAX 5uint8_t prio_q_buffer[PRIO_QUEUE_ITEM_MAX * sizeof(item_t)];

uint8_t mgr_pool[TOS_PRIO_Q_MGR_ARRAY_SIZE(PRIO_QUEUE_ITEM_MAX)];

k_prio_q_t prio_q;

void entry_task_demo(void *arg)

{

k_err_t err;

int i;

item_t item;

size_t item_size;

k_prio_t item_prio;

//創(chuàng)建優(yōu)先級隊列

tos_prio_q_create(&prio_q, mgr_pool, prio_q_buffer, PRIO_QUEUE_ITEM_MAX, sizeof(item_t));

//數(shù)據(jù)入隊

for(i = PRIO_QUEUE_ITEM_MAX;i 》 0; i--)

{

item.a = i;

item.b = i;

item.c = i;

err = tos_prio_q_enqueue(&prio_q, &item, sizeof(item), i);

if(err == K_ERR_NONE)

{

printf(“enqueue a item: %d %d %d

”, item.a, item.b, item.c);

}

else

{

printf(“prio queue enqueue fail,err = %d

”, err);

}

}

//隊列滿之后,繼續(xù)入隊

err = tos_prio_q_enqueue(&prio_q, &item, sizeof(item_t), i);

if(err == K_ERR_PRIO_Q_FULL)

{

printf(“prio queue is full: %s

”, tos_prio_q_is_full(&prio_q) ? “TRUE” : “FALSE”);

}

else

{

printf(“prio queue enqueue fail,err = %d

”, err);

}

//數(shù)據(jù)出隊

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

{

err = tos_prio_q_dequeue(&prio_q, &item, &item_size, &item_prio);

if(err == K_ERR_NONE)

{

printf(“dequeue a item[piro %d]: %d %d %d

”, item_prio, item.a, item.b, item.c);

}

else

{

printf(“prio queue dequeue fail,err = %d

”, err);

}

}

//沒有數(shù)據(jù)后繼續(xù)出隊

err = tos_prio_q_dequeue(&prio_q, &item, &item_size, &item_prio);

if(err == K_ERR_PRIO_Q_EMPTY)

{

printf(“prio queue is empty: %s

”, tos_prio_q_is_empty(&prio_q) ? “TRUE” : “FALSE”);

}

else

{

printf(“prio queue dequeue fail,err = %d

”, err);

}

}

4. 總結① 普通隊列是一種只能在一端入隊,在一端出隊的數(shù)據(jù)結構,規(guī)則:FIFO。

② 環(huán)形隊列對內存空間的利用率最高,使用最多,規(guī)則:FIFO。

③ 優(yōu)先級隊列不遵循FIFO,每個元素都有自己的優(yōu)先級,規(guī)則:優(yōu)先級最高的元素先出隊。

責任編輯:haq

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

    關注

    8

    文章

    7314

    瀏覽量

    93907
  • 存儲
    +關注

    關注

    13

    文章

    4686

    瀏覽量

    89529
  • TencentOS
    +關注

    關注

    0

    文章

    8

    瀏覽量

    7525

原文標題:TencentOS-tiny中隊列、環(huán)形隊列、優(yōu)先級隊列的實現(xiàn)及使用

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    優(yōu)先級隊列介紹

    隊列(Queue)的知識點:「概念」:隊列是一種先進先出(FIFO)的數(shù)據(jù)結構,類似于排隊的概念?!富静僮鳌梗篹nqueue(item): 將元素添加到隊列的末尾。dequeue(): 從
    發(fā)表于 11-26 07:56

    基于環(huán)形隊列的UART收發(fā)回顯實驗

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

    【RA4M2-SENSOR】—— 13.串口實現(xiàn)循環(huán)隊列

    上節(jié)我已經講解并實現(xiàn)了使用串口實現(xiàn)不定長度數(shù)據(jù)的接收,本篇帖子我來采用環(huán)形隊列實現(xiàn)不定長度數(shù)據(jù)的接收和發(fā)送。 循環(huán)
    發(fā)表于 09-01 11:46

    NVMe IP高速傳輸卻不依賴XDMA設計之九:隊列管理模塊(上)

    這是采用PCIe設計NVMe,并非調用XDMA方式,后者在PCIe4.0時不大方便,故團隊直接采用PCIe設計,結合UVM驗證加快設計速度。 隊列管理模塊采用隊列的存儲與控制分離的設計結構。
    的頭像 發(fā)表于 08-04 09:53 ?581次閱讀
    NVMe IP高速傳輸卻不依賴XDMA設計之九:<b class='flag-5'>隊列</b>管理模塊(上)

    NVMe高速傳輸之擺脫XDMA設計九:隊列管理模塊設計(上)

    條目,一個提交隊列管理單元用于實現(xiàn)提交隊列存儲地址空間的管理和門鈴控制。在提交隊列管理單元中,構建一個admin提交隊列表單和N個I/O提交
    發(fā)表于 07-27 17:41

    RabbitMQ消息隊列解決方案

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

    JCMsuite應用:光學環(huán)形諧振腔模擬

    本案程演示了環(huán)形諧振腔的模擬。這種類型的集成光子器件,例如用作升/降濾波器或在傳感應用中,當物質或粒子附著在環(huán)上時,通過測量其共振頻率的位移來檢測: 對于集成光子電路中的無源光器件,s矩陣通常是
    發(fā)表于 06-11 08:46

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現(xiàn)了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。
    發(fā)表于 05-03 20:19

    NVME控制器之隊列管理模塊

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

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

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

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

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

    將Yolo V3-Tiny模型轉換為IR格式遇到錯誤怎么解決?

    將Yolo V3-Tiny 模型轉換為 IR 格式。 遇到錯誤: Error: Exception occurred during running replacer \"
    發(fā)表于 03-05 09:57

    JCMsuite應用:光學環(huán)形諧振腔模擬

    本案程演示了環(huán)形諧振腔的模擬。這種類型的集成光子器件,例如用作升/降濾波器或在傳感應用中,當物質或粒子附著在環(huán)上時,通過測量其共振頻率的位移來檢測: 對于集成光子電路中的無源光器件,s矩陣通常是
    發(fā)表于 02-20 08:55

    TCL中環(huán)榮獲標普全球“行業(yè)最佳進步企業(yè)”表彰

    近日,全球知名評級機構標普全球S&P Global正式發(fā)布了《可持續(xù)發(fā)展年鑒2025》。在該年鑒中,TCL中環(huán)憑借其在環(huán)境、社會及公司治理(ESG)領域的卓越成就和顯著進步,成功入選并榮獲了“行業(yè)
    的頭像 發(fā)表于 02-13 14:30 ?931次閱讀

    助力AIoT應用:在米爾FPGA開發(fā)板上實現(xiàn)Tiny YOLO V4

    Only Look Once)是一種實時物體檢測模型,它通過一次性掃描整個圖像,實現(xiàn)高效的對象識別。而其簡化版 Tiny YOLO V4 更適合嵌入式設備,具有較少的層數(shù)和參數(shù)。其輕量化特性更適合在資源
    發(fā)表于 12-06 17:18