精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

RTOS中Queue的工作原理

冬至子 ? 來源:ITRelief ? 作者:Sachefgh Xu ? 2023-07-25 15:45 ? 次閱讀

Queue概述

Queue即消息隊列是通過RTOS內核提供的一種服務。它是一種線程間同步數據的安全方法。

隊列(Queue)是與棧對應的概念;棧是FILO結構,而隊列是FIFO結構。FreeRTOS原生的隊列支持從高位添加新數據,但CMSIS簡化刪去了這一功能,即只能從隊列底部推入數據并且對數據類型有限制,這一簡化一般不影響使用。

圖片

  • API Description:
    1.使用**osMessageQueueNew() 創建隊列
    該函數會涉及
    osMessageQueueAttr_t **配置結構體;主要用于配置Control Block和名稱;一旦使用該結構體將導致只能使用靜態方式創建隊列;一般傳入NULL即可
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);/*
創建新的Queue隊列
@retval    -隊列地址(Queue Identifier)
@param     msg_count -隊列可容納的消息(變量)數量
@param     msg_size  -消息(變量)占用的空間[通常用sizeof()填入]
@param     *attr     -配置結構體對象,一般為NULL。 當傳入NULL時,僅使用xQueueCreate()動態創建對應大小、數量的隊列;
*/

2.使用**osMessageQueueDelete() **刪除隊列

該函數能釋放隊列占用的空間并清除其中內容和任務規劃。隊列刪除后可通過**osMessageQueueNew() **重新創建。

osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id);/*刪除隊列
@retval     -osOK: the message queue object has been deleted.
            -osErrorParameter: parameter mq_id is NULL or invalid.
            -osErrorResource: the message queue is in an invalid state.
            -osErrorISR: osMessageQueueDelete cannot be called from interrupt service routines.
*/

3.獲取隊列配置信息

uint32_t osMessageQueueGetCapacity (osMessageQueueId_t  mq_id );
/*獲取隊列可容納的消息(變量)數量; []
*/
uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t  mq_id );
/* 獲取消息(變量)占用的空間 [單位byte]
*/
uint32_t osMessageQueueGetSpace (osMessageQueueId_t  mq_id );/*
  查詢隊列中空位(未填入變量)的數量
*/
uint32_t osMessageQueueGetCount (osMessageQueueId_t  mq_id );/*
  查詢隊列中已寫入的消息(變量)數量
*/

4.※ 讀取(取出)/寫入隊列

關于阻塞超時時間:

①讀取(取出)阻塞超時:當任務讀一個消息隊列時,可通過osMessageQueueGet()設置阻塞超時時間。在這段時間中,如果隊列為空(無變量),該任務將保持BLOCK狀態以等待隊列數據有效。在此期間當任務檢測到其等待的隊列中寫入了數據時,將自動由BLOCK態轉移為READY態。當等待的時間超過了指定的阻塞時間,即使隊列中尚無數據,任務也會自動從阻塞態轉移為READY態。此時程序會返回osErrorTimeout錯誤。若沒有設置阻塞超時且參數正確,返回osErrorResource錯誤**。**

由于隊列可以被多個任務讀取,所以對單個隊列而言,也可能有多個任務處于BLOCK
狀態以等待隊列數據有效。這種情況下,一旦隊列數據有效,所有等待任務中優先級最高的任務被執行。而如果所有等待任務的優先級相同,那么被解除阻塞的任務將是等待最久的任務。

②寫入阻塞超時: 同讀隊列一樣,任務也可以在寫隊列時指定一個阻塞超時時間。這個時間是當被寫隊列已滿時,任務進入BLOCK態以等待隊列空間有效的最長時間。當等待的時間超過了指定的阻塞時間,即使隊列中尚無數據,任務也會自動從BLOCK態轉移為READY態。此時程序會返回osErrorTimeout錯誤。若沒有設置阻塞超時且參數正確,返回osErrorResource錯誤。由于隊列可以被多個任務寫入,所以對單個隊列而言,也可能有多個任務處于BLOCK
狀態以等待隊列空間有效。這種情況下,一旦隊列空間有效,所有等待任務中優先級最高的任務被執行。而如果所有等待任務的優先級相同,那么被解除阻塞的任務將是等待最久的任務。

阻塞超時時間(timeout 變量)有三種配置:

==  0U     //不設置阻塞超時時間,若出現上述隊列異常函數將直接報錯返回
 ==  osWaitForever  //任務將一直阻塞直到空隊列被寫入/滿隊列被取出數據
 ==  Ticks   //設置具體等待時間,單位為RTOS心跳數(Ticks)

①用 osMessageQueueGet() 取出數據**【※可在中斷中使用】**

osStatus_t osMessageQueueGet ( osMessageQueueId_t  mq_id,
void *  msg_ptr,       //儲存讀取結果的變量地址
uint8_t *  msg_prio,  // ==NULL
uint32_t  timeout    //阻塞超時時間
);

①用 osMessageQueuePut() 寫入**【※可在中斷中使用】**

osStatus_t osMessageQueuePut ( osMessageQueueId_t  mq_id,
const void *  msg_ptr,     //儲存寫入內容的變量地址
uint8_t  msg_prio,        //==0U
uint32_t  timeout         //阻塞超時時間
);

讀出/寫入的返回狀態值:

-osOK: 取出/寫入成功
-osErrorTimeout: the message could not be retrieved from/put into the queue in the given time (timed-wait semantics).
-osErrorResource: nothing to get from the queue or no space to push.
-osErrorParameter: parameter mq_id is NULL or invalid, non-zero timeout specified in an ISR.

5.清空隊列

osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id);/*
@retval:      -osOK: the message queue has been rest.
              -osErrorParameter: parameter mq_id is NULL or invalid.
              -osErrorResource: the message queue is in an invalid state.
              -osErrorISR: osMessageQueueReset cannot be called from interrupt service routines.
*/
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CMSIS
    +關注

    關注

    0

    文章

    39

    瀏覽量

    11826
  • RTOS
    +關注

    關注

    20

    文章

    804

    瀏覽量

    119120
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    61732
  • Queue
    +關注

    關注

    0

    文章

    16

    瀏覽量

    7246
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    5946
收藏 人收藏

    評論

    相關推薦

    感光太陽能燈工作原理。#工作原理大揭秘

    太陽工作原理DIY
    jf_24750660
    發布于 :2022年11月07日 22:26:04

    RTOS的定時功能

    RTOS
    橙群微電子
    發布于 :2023年02月27日 09:42:16

    【MiCOKit試用體驗】慶科MiCO系統篇(4)MiCO RTOS消息隊列

    對象的最大數量(2)OSStatus mico_rtos_push_to_queue(mico_queue_t* queue, void* message, uint32_t tim
    發表于 10-24 17:03

    Queue Management、Queue Proxy Regions和Queue Peek Region幾個寄存器的主要區別是什么?

    Queue Management、Queue Proxy Regions和Queue Peek Region幾個寄存器的主要區別是什么? 我看到手冊上介紹的 Queue N Regis
    發表于 06-19 04:28

    消息隊列Queue相關資料推薦

    消息隊列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_deletetx_queue_flushtx_qu
    發表于 02-22 06:53

    RT-Thread的data_queue是什么?怎樣去使用

    1. data_queue 是什么data_queue 直接翻譯過來是 數據隊列。這個名字和 消息隊列 很像。那么他們有什么區別呢?消息隊列:消息隊列能夠接收來自線程或中斷服務例程不固定
    發表于 04-15 15:56

    請問使用httpd_queue_work的目的是什么?

    您好,我正在查看 http 服務器組件并找到了這個函數:httpd_queue_work。追溯源碼發現,它只是要求http服務器線程立即調用工作回調。回調不會在獨立線程調用。我想知道使用這個功能
    發表于 03-02 08:28

    Linux之work_queue_share教程

    Linux之work_queue_share教程,很好的Linux資料,快來學習吧
    發表于 04-15 17:49 ?13次下載

    Linux之work_queue_custom教程

    Linux之work_queue_custom教程,很好的Linux自學資料,快來學習吧。
    發表于 04-15 17:49 ?8次下載

    Linux之work_queue_delay_work教程

    Linux之work_queue_delay_work教程,很好的Linux自學資料,快來學習吧。
    發表于 04-15 17:54 ?12次下載

    ThreadX(九)------消息隊列Queue

    消息隊列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_deletetx_queue_flushtx_qu
    發表于 12-28 19:35 ?2次下載
    ThreadX(九)------消息隊列<b class='flag-5'>Queue</b>

    隊列Queue的常用方法有哪些

    FIFO(先入先出)隊列Queue,LIFO(后入先出)隊列LifoQueue,和優先級隊列PriorityQueue。
    的頭像 發表于 08-19 10:24 ?5505次閱讀
    隊列<b class='flag-5'>Queue</b>的常用方法有哪些

    什么是queue

    queue 容器,又稱隊列容器,是簡單地裝飾deque容器而成為另外的一種容器。
    的頭像 發表于 02-27 15:43 ?1351次閱讀

    電源電容工作原理 電源設計的電容選用規則

    電源電容工作原理 電源設計的電容選用規則? 電源的電容器是電路設計不可缺少的元件之一。它在電源的
    的頭像 發表于 11-29 11:35 ?807次閱讀

    基于RTOS的應用進程的典型線程

    RTOS的關鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應速度或可預測性,而不是它在給定時間段內可以執行的工作量。
    發表于 03-05 09:32 ?416次閱讀
    基于<b class='flag-5'>RTOS</b>的應用進程<b class='flag-5'>中</b>的典型線程