1、UCOSIII任務間通信
1.1、任務間通信
一個任務或者中斷服務程序有時候需要和另一個任務交流信息,這個就是消息傳遞的過程就叫做任務間通信;任務間的消息傳遞可以通過2種途徑:一是通過全局變量,二是通過發布消息。
使用全局變量的時候每個任務或者中斷服務程序都必須保證其對全局變量的獨占訪問。消息也可以通過消息隊列作為中介發布給任務。
1.2 什么是消息?
消息包含一下幾個部分:指向數據的指針,數據的長度和記錄消息發布時刻的時間戳,指針指向的可以是一塊數據區域或者甚至是一個函數。 消息的內容必須一直保持可見性,可見性是指代表消息的變量必須在接收消息的任務代碼范圍內有效。這是因為發布的數據采用的是指針傳遞,也就是引用傳遞,并不是值傳遞。也就是說,發布的消息本身并不產生拷貝,我們可以使用動態內存分配的方式來給消息分配一個內存塊,或者,也可以傳遞一個指向全局變量、全局數據結構、全局數組或者函數的指針。
2、UCOSIII消息隊列
2.1消息隊列的操作:
中斷服務程序只能使用OSQPost()函數,在UCOSIII中對于消息隊列的讀取是先進先出FIFO,也可以后進先出LIFO的方式,采用后進先出的方式發布的消息會繞過其他所有位于消息隊列中的消息而最先傳遞給任務。
小沙漏表示任務指定一個超時時間,如果任務在這段時間內沒接收到消息就會喚醒任務,并返回錯誤碼告訴UCOIII任務是被超時而喚醒的不是因為接收到了消息。超時時間設置為0那任務就會一直等待下去,知道接收到消息。
消息隊列中有一個列表,就是消息隊列記錄了所有正在等待獲得消息的任務,當一則消息發布到隊列中時,最高優先級任務獲得該消息,發布方也可以向消息隊列中所有等待的任務廣播一則消息。
2.2 消息隊列是UCOSIII中的一個內核對象,為結構體OS_Q。
struct os_q {
OS_OBJ_TYPE Type;
CPU_CHAR *NamePtr;
OS_PEND_LIST PendList;
#if OS_CFG_DBG_EN > 0u
OS_Q *DbgPrevPtr;
OS_Q *DbgNextPtr;
CPU_CHAR *DbgNamePtr;
#endif
OS_MSG_Q MsgQ //消息列表
};
OS_MSG_Q也是一個結構體,如下:
struct os_msg_q {
OS_MSG *InPtr;
OS_MSG *OutPtr;
OS_MSG_QTY NbrEntriesSize;
OS_MSG_QTY NbrEntries;
OS_MSG_QTY NbrEntriesMax;
};
消息發布以后會被存放在OS_MSG類型的數據結構中,OS_MSG如下:
struct os_msg {
OS_MSG *NextPtr;
void *MsgPtr;
OS_MSG_SIZE MsgSize;
CPU_TS MsgTS;
};
2.3 消息隊列API函數
2.3.1 創建消息隊列
void OSQCreate (OS_Q *p_q, //指向一個消息隊列,采用OS_Q Msg_Que定//義一個消息隊列
CPU_CHAR *p_name, //消息隊列的名字
OS_MSG_QTY max_qty, //消息隊列的長度,必須大于0
OS_ERR *p_err) //保存錯誤碼
2.3.2 等待消息隊列
void *OSQPend (OS_Q *p_q,//指向一個消息隊列
OS_TICK timeout,//等待消息的超時時間
OS_OPT opt,//選擇是否使用阻塞模式,有2個選項
OS_MSG_SIZE *p_msg_size,//指向一個變量用來表示接收到消息長度
CPU_TS *p_ts,//指向一個時間戳,表明什么時候接收到消息
OS_ERR *p_err)
2.3.3 向消息隊列發送消息
void OSQPost (OS_Q *p_q,//指向一個消息隊列
void *p_void,//指向實際發送的內容
OS_MSG_SIZE msg_size,//設定消息的大小,字節數
OS_OPT opt,//選擇消息發送操作的類型,基本有四種也可結合
OS_ERR *p_err)
3、UCOSIII任務內建消息隊列
同任務內嵌信號量一樣,UCOSIII的每個任務中也有內建消息隊列。而且多個任務等待同一個消息隊列的應用很少見,UCOSIII中每個任務多有其內建消息隊列的話用戶可以不用通過外部的消息隊列而直接向任務發布消息。
如果需要使用任務內建消息隊列功能的時候需要將宏OS_CFG_TASK_Q_EN置1來使能相關的代碼。
任務內建消息隊列的函數在os_task.c中
3.1等待任務內建消息
void *OSTaskQPend (OS_TICK timeout,//等待消息的超時時間
OS_OPT opt,//是否使用阻塞模式
OS_MSG_SIZE *p_msg_size,//存放消息大小的變量
CPU_TS *p_ts,//時間戳
OS_ERR *p_err)
3.2 發送任務內建消息
void OSTaskQPost (OS_TCB *p_tcb,//指向接收消息任務的TCB
void *p_void,//發送給一個任務的消息
OS_MSG_SIZE msg_size,//消息的大小
OS_OPT opt,//發送操作類型:LIFO和FIFO
OS_ERR *p_err)
上一篇:UCOSIII事件標志組和同時等待多個內核對象
下一篇:UCOSIII中斷和時間管理
推薦閱讀
史海拾趣
在20世紀中葉,西鐵城公司迎來了一次重要的技術突破。1956年,公司成功研制出防震手表,并通過了空中墜表實驗,這一創新轟動了整個行業。防震手表的推出不僅提升了西鐵城產品的品質,也進一步鞏固了其在全球腕表市場中的地位。這一技術的成功應用,也顯示了西鐵城在精密加工和測量技術方面的實力。
隨著國內市場的飽和,EOZ Secme開始積極尋求海外市場的拓展。公司制定了詳細的國際化戰略,通過參加國際展會、建立海外銷售渠道等方式,逐步打開了國際市場的大門。同時,EOZ Secme還積極與國際知名企業開展合作,共同研發新產品,拓展業務領域。這些努力使得EOZ Secme在國際市場上的影響力不斷增強。
Advance Tapes公司創立于1963年,當時電子工業正處于起步階段,膠帶作為電子元器件生產中的重要輔助材料,市場需求日益增長。然而,初創的Advance Tapes面臨著資金短缺、技術落后和市場競爭激烈等挑戰。公司創始人憑借對電子行業的敏銳洞察力和對膠帶技術的深入研究,帶領團隊不斷研發新產品,提高產品質量,逐漸在市場中站穩腳跟。
隨著公司實力的不斷增強,恒連電子開始積極拓展國內外市場。在國內市場,公司通過與各大電商平臺合作,加大品牌宣傳力度,提高產品的知名度和美譽度。同時,公司還積極參與各類行業展會和論壇活動,與同行交流學習,提升公司的行業影響力。在國際市場方面,恒連電子通過與國外知名企業的合作,引進先進的技術和管理經驗,提升公司的國際化水平。此外,公司還積極開拓海外市場,將產品出口到多個國家和地區。
在恒連電子的發展歷程中,技術突破和產品創新始終是公司發展的核心動力。公司投入大量資金和資源進行技術研發,不斷推出具有競爭力的新產品。其中,一款具有自主知識產權的智能芯片成為了公司的明星產品,不僅提升了產品的整體性能,還為公司帶來了可觀的利潤。此外,恒連電子還注重產品的多元化發展,不斷拓展產品線,滿足市場的多樣化需求。
隨著國內市場的逐漸飽和,Cogent_Computer_Systems公司開始將目光投向海外市場。公司制定了一系列國際化戰略,包括參加國際電子展會、建立海外銷售網絡、拓展國際合作伙伴等。這些舉措使得公司的產品和服務逐漸走向全球,贏得了更多國際客戶的認可。國際化戰略的實施不僅拓寬了公司的市場版圖,也提升了公司的品牌影響力和國際競爭力。
目錄: 第1章 51單片機的基本端口操作 1.1 點亮最簡單的單片機系統 1.2 更加明亮的小燈 1.3 定時亮滅的小燈 1.4 小燈亮滅的人工控制 1.5 典型外部ROM和RAM器件的使用 1.6 串口電平轉換電路 1.7 單片機系統開發經驗(1) ...… 查看全部問答∨ |
|
我在wince6.0下添加Hiv注冊表時,系統運行完OEMInit系統就停止了,起不來。 我添加了以下組件: 1. Hiv-based Registry 2. Binary Rom Image File System 3. exFAT File System 4. FAT File System 5. Slient FAT File System U ...… 查看全部問答∨ |
WINCE6.0用系統自帶的“Bluetooth設備屬性”可以找到搜索到我的手機,但是怎么傳輸文件或上網? 1,WINCE6.0 三星6410處理器,在選擇“Bluetooth設備屬性”后,能掃描到我的手機,但是怎么進行文件傳輸? 用系統自帶的PROFILES,選擇了全部組件,手機發送給開發板,都說連接錯了。。 我想是不是要自己加驅動? 2,WINCE下怎么通過與手機藍牙 ...… 查看全部問答∨ |
比如程序中有 main.c lib.c 兩個文件。而main.c中有兩個函數,init() 和 main() 函數,lib.c 中 有delay() 函數。 且在main.c中,由main函數做為程序入口,由main函數來調用init()函數,來完成一些初始化工作。那么,根據C語言的規則。 ...… 查看全部問答∨ |
各位XDJM們, 有沒有開發zigbee產品的呢? 我現在想將一個uint16(unsigned short)類型的數字發送到串口, 有沒有參考程序啊 我使用的是無線龍的套件 謝謝… 查看全部問答∨ |
最近要用NRF9E5模塊,其中用到了EEPROM25AA320,不知道要用什么型號的燒寫器才能將程序下載到芯片中?麻煩大家給推薦一個便宜適用的燒寫器型號,謝謝! 另外,編程器和仿真器的作用分別是什么?單獨用燒寫器是不是能實現從電腦上將程序燒寫到芯片 ...… 查看全部問答∨ |
請教各位: 觸摸屏和電源管理中用到同一個AD,這樣當觸摸屏操作的時候,電源管理的采樣就會出現問題 有人說看看是否在這兩個驅動中實現同步 請問怎么做才算實現同步????… 查看全部問答∨ |
#include <stdio.h> char * str_index( char *string, char letter){ while ((*string != letter) && (*string)) string++; if(*string==\'\\0\') & ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析