uC/OS-II訊息佇列及操作
事件控制元件塊成員OSEventPtr指向一個叫做佇列控制塊(OS_Q)的結構,該結構管理著一個數組MsgTb1[],該陣列中的元素都是指向訊息的指標。
一. 訊息佇列的操作
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)傳遞指向一個數據的指標,就是傳遞多個數據。 經驗小結如下: 一、資料存放,存放單個數據 郵箱可以傳遞任