在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    41

    瀏覽量

    12283
  • RTOS
    +關注

    關注

    24

    文章

    845

    瀏覽量

    120939
  • FreeRTOS
    +關注

    關注

    12

    文章

    492

    瀏覽量

    64048
  • Queue
    +關注

    關注

    0

    文章

    16

    瀏覽量

    7406
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RTOS的本地存儲指針使用

    本地存儲指針是RTOS的一個重要特性,增強了任務管理和數據處理能力。在RTOS上下文中,本地存儲是指存儲在本地的特定任務或對象的數據。通常與任務本地存儲(Task Local Storage,TLS)有關,其中數據存儲在任務控
    的頭像 發表于 02-28 16:33 ?891次閱讀
    <b class='flag-5'>RTOS</b><b class='flag-5'>中</b>的本地存儲指針使用

    RTOS如何在FX3工作

    大家好, 我正在使用 FX3 進行一個項目。 我想知道 RTOS 調度是如何工作的。 我知道調用“CyU3PKernelEntry();”后 RTOS 就會開始工作。 如果我只注冊
    發表于 05-06 13:20

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

    太陽工作原理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

    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 ?6236次閱讀
    隊列<b class='flag-5'>Queue</b>的常用方法有哪些

    什么是queue

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

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

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

    詳解RTOS的Hook函數

    Hook函數是RTOS的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?334次閱讀
    主站蜘蛛池模板: 欧美在线免费 | 91中文字幕视频 | 99久久久精品免费观看国产 | 天天曰天天干 | 色涩在线 | 四虎comwww最新地址 | 精品视频在线观看视频免费视频 | 色成人亚洲 | 亚洲一区在线视频观看 | 国产精品乱码高清在线观看 | 国产午夜一区二区在线观看 | 四虎美女 | 五月婷六月 | 国产乱人视频在线看 | 久久精品最新免费国产成人 | 乱码精品一区二区三区 | jiucao在线观看精品 | 欧美1314www伊人久久香网 | 久久综合一 | 天天做天天添婷婷我也去 | 手机成人在线视频 | 91精品久久国产青草 | 免费的黄色大片 | 特黄特黄一级高清免费大片 | 中文字幕在线观看一区 | 在线视频免费视频网站 | 亚洲热热久久九九精品 | 2019天天操天天干天天透 | 扒开末成年粉嫩的小缝强文 | 欧美1819| 清冷双性被cao的合不拢腿 | 在线成人免费 | www.xxx.国产 | 爽死你个放荡粗暴小淫视频 | 亚偷熟乱区视频在线观看 | 日本不卡在线播放 | 国产精品vv在线 | 日本欧美一区二区三区免费不卡 | 老师今晚让你爽个够 | 亚洲人成网站色7799在线播放 | 亚洲人成电影院 |