1. 程式人生 > >uC/OS-II訊息佇列及操作

uC/OS-II訊息佇列及操作

使用訊息佇列可在任務之間傳遞多條訊息,訊息佇列由三部分組成:事件控制塊、訊息佇列和訊息。

事件控制元件塊成員OSEventPtr指向一個叫做佇列控制塊(OS_Q)的結構,該結構管理著一個數組MsgTb1[],該陣列中的元素都是指向訊息的指標。

一. 訊息佇列的操作

1. 建立訊息佇列
OS_EVENT  *OSQCreate (void **start, INT16U size);
start為存放訊息緩衝區指標陣列的地址;size為該陣列的大小;函式的返回值為訊息佇列的指標。

2. 請求訊息佇列
void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
也就是從訊息佇列中取訊息,返回值為訊息指標,也就是MsgTb1[]中的內容


3. 向訊息佇列傳送訊息
//以FIFO(先進先出)的方式組織訊息佇列
INT8U  OSQPost (OS_EVENT *pevent, void *msg);

//以LIFO(後進先出)的方式組織訊息佇列
INT8U  OSQPostFront (OS_EVENT *pevent, void *msg);

也就是往MsgTb1[]中新增資料。

4. 清空訊息佇列

INT8U  OSQFlush (OS_EVENT *pevent);
5. 刪除訊息佇列
OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err);

二. 例子

//主要往訊息佇列中發訊息
void  StartTask(void *pdata)
{
    OSStatInit();             /* 初始化ucos的統計任務 */
        OSTaskCreate(MyTask,
                (void*)0,
                &MyTaskStk[TASK_STK_SIZE - 1],
                3);

        OSTaskCreate(YouTask,
                (void*)0,
                &YouTaskStk[TASK_STK_SIZE - 1],
                4);
    
    s = "How many times can receive this string?";
    
    OSQPostFront(Str_Q, s);    //send message LIFO
                
    for (;;)
    {
          if(OSTimeGet()>100 && OSTimeGet()<500)
          {
              s100 = "Now, OSTime value between 100 to 500";
              OSQPostFront(Str_Q, s100);                        //send message
              
              s = "Which Task receive this string?";
              OSQPostFront(Str_Q, s);                                //send message
                      
          }
          
          if(OSTimeGet()>5000 && OSTimeGet()<5500)
          {
              s500 = "Now, OSTime value between 5000 to 5500";
              OSQPostFront(Str_Q, s500);                        //send message
          }

         OSTimeDlyHMSM(0,0,1,0); /* 等待1S */
    }
}

//從訊息佇列中取訊息
void  MyTask(void *pdata)
{
    for (;;)
    {
        PC_DispStr(0, ++y,"MyTask", DISP_BGND_BLACK+DISP_FGND_WHITE);
        
        ss = OSQPend(Str_Q, 0, &err); //request message queue
                    
        PC_DispStr(10,y, ss,DISP_BGND_BLACK+DISP_FGND_WHITE);
        
        OSTimeDlyHMSM(0,0,1,0); /* 等待1s */
    }
}

//從訊息佇列中取訊息
void  YouTask(void *pdata)
{
    for (;;)
    {
        PC_DispStr(0, ++y,"YouTask", DISP_BGND_BLACK+DISP_FGND_WHITE);
        
        ss = OSQPend(Str_Q, 0, &err);//request message queue    
            
        PC_DispStr(10, y, ss, DISP_BGND_BLACK+DISP_FGND_WHITE);

            OSTimeDlyHMSM(0,0,1,0); /* 等待1s */
        
    }
}

這個例子是:StartTask往訊息佇列裡發資料,而MyTask、YouTask不停的從佇列中取資料。

現象如下:

從現象可以看出:

1. 在MyTask取出How many times can receive this string? 後,MyTask和YouTask都處於了等待狀態。

2. 一段時間後(OSTime >5000),來資料了,MyTask先獲得了資料。

3. 當資料取完後,MyTask和YouTask還是都處於了等待狀態。


相關推薦

uC/OS-II訊息佇列操作

使用訊息佇列可在任務之間傳遞多條訊息,訊息佇列由三部分組成:事件控制塊、訊息佇列和訊息。 事件控制元件塊成員OSEventPtr指向一個叫做佇列控制塊(OS_Q)的結構,該結構管理著一個數組MsgTb1[],該陣列中的元素都是指向訊息的指標。一. 訊息佇列的操作 1. 建立

uc/os-ii訊息佇列

使用訊息佇列可以在任務之間傳遞多條訊息。訊息佇列由三個部分組成:事件控制塊、訊息佇列和訊息。 訊息佇列的資料結構如下圖所示。從圖中可以看到,訊息佇列相當於一個共用一個任務等待列表的訊息郵箱陣列,事件控制塊成員OSEventPtr指向了一個叫做佇列控制塊(OS_

UC/OS II 訊息佇列

訊息郵箱只能儲存一條訊息,訊息佇列沒有這一侷限,可以容納多條資訊佇列,按照先進先出(FIFO)的原則傳送和接受訊息。 訊息佇列的實體不是作業系統提供的,而是由使用者任務提供的。作業系統提供的是對其進行管理的程式。 1:訊息佇列的資料結構 訊息佇列的資料結構主要包括訊息佇列、

uC/OS訊息佇列——uC/OS學習筆記(七)

1.訊息佇列的介紹     使用訊息佇列可在任務之間傳遞多條訊息。訊息佇列相當於訊息郵箱集合,一個郵箱只能在任務間傳遞一條訊息,而訊息佇列則可以傳遞多條訊息。訊息佇列由三部分組成:事件控制塊、訊息佇列和訊息。 2.訊息佇列的操作    a)建立訊息佇列:QSQCreate

uc/os-ii訊息郵箱

訊息郵箱是一種通訊機制,它能使任務或中斷服務向另一個任務傳送一個指標型的變數,這個指標指向一個包含指定“訊息”的資料結構。訊息郵箱傳送的不是訊息本身,而是訊息的地址指標。使用訊息郵箱之前,必須先建立訊息郵箱,並且要指定指標的初始值。一般情況下,這個初始值是NUL

uC/OS-II 學習筆記之:訊息佇列

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

uC/OS-II 最簡單的訊息佇列

 #define MESSAGES_MAX_SIZE 1000   /*訊息佇列緩衝區的大小*/ void  *MsgGrp[MESSAGES_MAX_SIZE];     /*訊息陣列,訊息陣列存放著各訊息的指標*/  OS_EVENT *StrQueue;     

UC/OS-II學習筆記之訊息佇列使用

對訊息佇列的學習理解有點難,對技術來說,一本好的書一般是原理和例子相結合的,可惜我找到的很少。書上說訊息佇列實際上是多個郵箱組成的陣列,是一個列表。這個陣列其實是個指標陣列,裡面每個指標可以指向不同型別的變數,通過傳遞一個個指標,我們可以做到傳遞指標所指向的一個個變數。(順便複習下,一個郵箱只能傳遞一個指標,

uC/OS-II 學習筆記:訊息佇列

二、訊息佇列的操作函式: (1)建立訊息佇列函式:OS_EVENT OSQCreate(void **start, INT16U size) (2)請求訊息佇列函式:void *OSQPend(OS_EVENT *pEvent, INI16U timeout, INT8U *err) (3)向訊息佇列傳送訊息

uC/OS-II學習筆記 訊息佇列

對訊息佇列的學習理解有點難,對技術來說,一本好的書一般是原理和例子相結合的,可惜我找到的很少。書上說訊息佇列實際上是多個郵箱組成的陣列,是一個列表。這個陣列其實是個指標陣列,裡面每個指標可以指向不同型別的變數,通過傳遞一個個指標,我們可以做到傳遞指標所指向的一個個變數。(順便

嵌入式實時作業系統uc/os-ii 原理應用 讀書筆記

對任務就緒表的操作理解: 將優先級別為prio的任務置為就緒狀態,可使用如下程式碼 OSRdyGrp |= OSMapTbl[prio >>3];//將prio任務所在的組狀態置為1,表示該組有任務就緒。 OSRdyTbl[prio>>3] |= O

uC/OS-II任務排程之就緒表最高優先順序任務判定演算法

uC/OS-II是Jean J. Labrosse設計的完整的、可移植、可固化、可裁剪的搶佔式實時多工核心,絕大部分程式碼都是用標準的C語言編寫的,開源、規模不大,比較適合初次接觸嵌入式作業系統的人員

uC/OS-II 學習筆記之:訊息郵箱

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

嵌入式實時作業系統uc-os-ii原理應用 第三章 uc/os-ii中的任務

3.1-3.4.3  印象比較深的點在作業系統中程式叫做程序或執行緒。系統任務:空閒任務和統計任務。不同處理器,堆疊的增長方向不同。實時作業系統,時間操作必須為常量,所以不能用for,配合break或continue。不然每個任務執行時間不同。

uC/OS II 函式說明之與訊號量操作相關的六個函式

    if (OSIntNesting > 0) {                           /* ISR中,不允許此操作                           */        *err = OS_ERR_PEND_ISR;                        

java併發包訊息佇列在開源軟體中的應用

1.BlockingQueue的常用方法 BlockingQueue也是java.util.concurrent下的主要用來控制執行緒同步的工具。 主要的方法是:put、take一對阻塞存取;add、poll一對非阻塞存取。          插入:        1

訊息佇列常見訊息佇列介紹

一、訊息佇列(MQ)概述 訊息佇列(Message Queue),是分散式系統中重要的元件,其通用的使用場景可以簡單地描述為: 當不需要立即獲得結果,但是併發量又需要進行控制的時候,差不多就是需要使用訊息佇列的時候。 訊息佇列主要解決了應用耦合、

淺談訊息佇列常見的訊息中介軟體

前言 訊息佇列 已經逐漸成為企業應用系統 內部通訊 的核心手段。它具有 低耦合、可靠投遞、廣播、流量控制、最終一致性 等一系列功能。 當前使用較多的 訊息佇列 有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分 資

uc/os-ii任務排程的鎖定與解鎖

排程器上鎖函式OSSchedlock()的功能是用於禁止任務排程,使任務保持對CPU的控制權。排程器開鎖函式OSSchedUnlock()的功能是解除對任務排程的禁止。 排程器上鎖和開鎖的實現原理是:對全域性變數鎖定巢狀計數器OSLockNesting進行操作

uC/OS訊息郵箱使用經驗

uC/OS下任務之間通訊的方式之一有訊息郵箱,使用訊息郵箱有兩種方式: (1)資料的存放 (2)傳遞指向一個數據的指標,就是傳遞多個數據。  經驗小結如下: 一、資料存放,存放單個數據 郵箱可以傳遞任