天天看點

【LiteOS】LiteOS消息隊列

目錄

前言

連結

參考

筆錄草稿

基本概念

隊列運作機制

隊列運作原理

消息隊列傳輸方式

消息隊列的阻塞機制

出隊阻塞

入隊阻塞

任務相關函數

任務開發流程

注意事項 *

實戰

LiteOS源碼連結

常見問題

華為開發者社群

華為LiteOS官方教程

我的gitee-LiteOS-mcu

李柱明部落格:https://www.cnblogs.com/lizhuming/

本文連結:https://www.cnblogs.com/lizhuming/p/13944541.html

野火

上面連結

最近工作有點忙,遠嗎閱讀推遲了哈哈

隊列又稱消息隊列

是一種常用于任務間通信的資料結構

能接收來自任務或中斷的不固定長度的消息

根據不同的 API 選擇傳遞消息是否存放在自己空間

即是 傳資料 還是 傳位址

任務能夠從隊列裡面讀取消息

當隊列中的消息是空時

挂起讀取任務

當隊列中有新消息時

挂起的讀取任務被喚醒

并處理新消息。

LiteOS 隊列特性

消息以先進先出方式排隊(FIFO),支援異步讀寫工作方式

讀隊列和寫隊列都支援逾時機制

發送消息類型由通信雙方約定,可以允許不同長度(不超過隊列節點最大值)消息

一個任務能夠從任意一個消息隊列接收和發送消息

多個任務能夠從同一個消息隊列接收和發送消息

當隊列使用結束後,如果是動态申請的記憶體,需要通過釋放記憶體函數回收。

隊列控制塊

<code>usReadWriteableCnt</code> : 可讀或可寫的消息數量

<code>stReadWriteList</code> : 可讀或可寫的消息任務等待連結清單

<code>usQueueState</code> : 兩種狀态

OS_QUEUE_UNUSED : 未被使用

OS_QUEUE_INUSED : 已被使用

建立隊列

傳入隊列長度和消息節點大小

開辟相應的記憶體空間

傳回隊列ID。

隊列中消息頭節點 Head 和 消息尾節點 Tail

Head 表示隊列中被占用消息的起始位置

Tail 表示隊列中被空閑消息的起始位置

兩者均采用回卷方式

<code>usReadWriteableCnt[0]</code> 判斷是否可讀取

<code>usReadWriteableCnt[1]</code> 判斷是否可寫入

删除隊列時

根據傳入的隊列ID尋找到對應的隊列

把隊列狀态置為未使用

釋放原隊列所占的空間

對應的隊列控制頭置為初始狀态。

圖解:

【LiteOS】LiteOS消息隊列

LiteOS 的消息傳輸方式有兩種

傳位址方式

優點:效率高

缺點:修改源檔案,消息對應的内容也會被修改

拷貝方式

優點:資料安全,是直接拷貝内容到消息中

缺點:效率相對傳位址來說較低

使用者可以根據需求選擇不同的方式

主要參考 資料大小 及 資料重要性 來衡量

中斷中不允許使用帶有阻塞機制的 API,是以中斷中,阻塞值均取 0

LiteOS 已經實作了阻塞機制,使用者直接使用即可

三種方式:主要參考隊列裡面是否有消息

不等待:0

讀取消息時,隊列裡面

有消息,正常讀取

沒有消息,則不等待,直接執行後面代碼

限時等待:

在規定時間内,消息隊列裡面

有消息,正常讀取,

沒有消息,則等待

逾時

則直接執行後面代碼

永久等待:LOS_WAIT_FOREVER

讀取消息時

沒有消息,一直等待,直到隊列裡有消息

三種方式:主要參考隊列裡面的消息是否滿了

寫入消息時

隊列未滿,正常寫入

隊列已滿,則不等待,直接執行後面代碼

隊列已滿,限時等待,等待隊列未滿後并寫入

隊列已滿,一直等待,直到隊列未滿

接口名

描述

LOS_QueueCreate

建立一個消息

LOS_QueueRead

讀取指定隊列中的資料。(buff裡存放的是隊列節點的位址)

LOS_QueueWrite

向指定隊列寫資料。(寫入隊列節點中的是buff的位址)

LOS_QueueReadCopy

讀取指定隊列中的資料。(buff裡存放的是隊列節點中的資料)(預留接口)

LOS_QueueWriteCopy

向指定隊列寫資料。(寫入隊列節點中的是buff中的資料)(預留接口)

LOS_QueueWriteHead

向指定隊列的頭部寫資料

LOS_QueueDelete

删除一個指定的隊列

LOS_QueueInfoGet

擷取指定隊列資訊

各函數使用可以看源碼或者例程

非 copy 方式 ( copy 方式類同 )

建立消息隊列LOS_QueueCreate。

建立成功後,可以得到消息隊列的ID值。

寫隊列操作函數LOS_QueueWrite。

讀隊列操作函數LOS_QueueRead。

擷取隊列資訊函數LOS_QueueInfoGet。

删除隊列LOS_QueueDelete。

系統可配置的隊列資源個數

是指整個系統的隊列資源總個數

而非使用者能使用的個數。

例如:

系統軟體定時器多占用一個隊列資源

那麼系統可配置的隊列資源就會減少一個。

調用 LOS_QueueCreate 函數時所傳入的隊列名暫時未使用,作為以後的預留參數。

隊列接口函數中的入參數 uwTimeOut 是指相對時間。

LOS_QueueReadCopy 和 LOS_QueueWriteCopy 是一組接口

LOS_QueueRead 和 LOS_QueueWrite 是一組接口,兩組接口需要配套使用。

鑒于 LOS_QueueWrite 和 LOS_QueueRead 這組接口實際操作的是資料位址,使用者必須保證調用 LOS_QueueRead 擷取到的指針所指向記憶體區域在讀隊列期間沒有被異常修改或釋放,否則可能會導緻不可預知的後果。

采用位址方式時,必須保該位址内容沒有被修改,且不推薦使用局部變量

實戰位址

繼續閱讀