1. 程式人生 > >訊號量、郵箱、佇列與事件

訊號量、郵箱、佇列與事件

訊號量,郵箱,佇列的最大不同在於它們傳送的內容不同。

訊號量是一個觸發訊號,也是一個計數器,等待接收訊號的任務一般只有接收到訊號才可以執行,否則任務一直暫停。

郵箱是訊號量的擴充套件,相當於把一個指標定義的變數從一個任務傳遞到另一個或多個任務中去,這個指標是先發到郵箱,然後等待任務從郵箱裡提取指標,這也就傳遞了指標指向的具體變數值。  

佇列是多個郵箱的陣列,可以看做是個指標陣列,任務之間可以按照一定順序以指標定義的變數來傳遞,即是傳送一個個指標給任務,任務獲得指標,來處理指向的變數。這個方式有先進先出,先進後出。

訊號量就是給某個任務傳遞一個數值,基本作用是提示接收該訊號量的任務什麼時候可以執行。

訊息郵箱就是由某個任務傳遞一個指標(記憶體上指標指向的一片區域的變數型別基本相同)給一個或多個任務。

訊息佇列就是某個任務傳遞一堆指標(指標陣列,陣列中每個指標指向的變數型別可以不同)給一個或多個任務。

事件就是發生了一件事情,接下來要觸發某種動作。例如,收到了一個訊號量或訊息佇列,或者是定時任務到要觸發某種任務要執行。

在μC/OS-II中總共有34個,而且每種事件具有的管理函式數目不同。但是所有的事件都有類似的6個函式,它們是所有事件的基本功能,其函式名類似,使用方法也類似,詳細函式見下表。


任何一個事件,必須先建立後使用。建立事件是通過呼叫函式OS???Create()實現的,其中???為事件的型別。建立事件可以在main()函式中,但更多的是在任務初始化部分。使用方法如下:


嵌入式系統中,事件是靜態使用的,即建立後永遠不刪除。但有時候需要動態使用,即根據需要建立和刪除事件,此時建立事件就是在任務的事件執行程式碼中,使用方法如下:


要掌握事件函式在中斷服務程式中的呼叫規則,我們必須清楚中斷服務有哪些特點。


下面給出事件在中斷服務程式中使用方法,假設Task0任務接收ISR傳送的訊息,任務程式碼如下:


注意:

1.中斷服務程式一般不會呼叫建立和刪除事件函式,否則要麼沒有起到事件的作用,要麼程式很複雜;

2.中斷服務程式不能呼叫等待事件的函式,否則可能造成程式崩潰,可以呼叫無等待獲得事件函式獲得訊號,但事實上,在中斷中呼叫無等待獲得事件的情況都很少。

相關推薦

訊號郵箱佇列事件

訊號量,郵箱,佇列的最大不同在於它們傳送的內容不同。 訊號量是一個觸發訊號,也是一個計數器,等待接收訊號的任務一般只有接收到訊號才可以執行,否則任務一直暫停。 郵箱是訊號量的擴充套件,相當於把一個指標定義的變數從一個任務傳遞到另一個或多個任務中去,這個指標是先發到郵箱

(轉)ucos的事件 任務的通訊和同步 訊號 互斥 訊息郵箱 訊息佇列

()    使一個等待超時的任務進入就緒狀態  事件控制塊連結串列也有空和工作中的2種區分,類似於任務控制塊,就不多說了 七、訊號量詳細 重要組成:型別    cnt     訊號量指標為空     控制塊 1.建立訊號量 OSSemCreat(cnt)------------設定型別 設定初始化計數 設定指

【JavaScript高階】16執行緒機制事件機制筆記

執行緒與程序 程序: 程式的一次執行, 它佔有一片獨有的記憶體空間 可以通過windows工作管理員檢視程序 執行緒: 是程序內的一個獨立執行單元 是程式執行的一個完整流程 是CPU的最小的排

linux訊號程式設計semgetsemop

訊號量(訊號燈)與其他程序間訪問方式不同,它的用途主要是保護臨界資源。程序可以根據訊號量來判斷能否訪問某些共享資源,實際上它是一個整數,訊號量還可以用於程序的同步。 訊號量分為: 1、二值訊號燈:訊號燈只有0和1兩個值,類似互斥鎖。當兩者有不同:訊號燈強調共享資源,只要共享資源可用,其他程序同樣可

sql 實現用戶名郵箱手機號登錄

append nes class select logs lec email mobile () StringBuilder strSql = new StringBuilder(); strSql.Append("se

Linux c++,用訊號實現消費者生產者佇列(程式碼可直接通過編譯)

//用訊號量實現的一個消費者生產者佇列, #include <iostream> #include <pthread.h> #include <semaphore.h> #include <errno.h> #include <queue>

訊號解決程序的同步互斥

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

執行緒鎖 死鎖現象 遞迴鎖 訊號 條件定時器 佇列 執行緒池

鎖是用來做什麼的?    保證資料的安全的GIL是幹什麼的?      鎖執行緒有了GIL還要鎖幹啥?      有了GIL還是會出現資料不安全的現象,所以還是要用鎖 import time from threading import Thread,Lock n = 100 def func(lock

實現使用者名稱郵箱手機號三種都可以登入

登入會員名區分大小寫,郵箱不區分大小寫: 使用者名稱 手機號存在了 tb_user表 郵箱存在了comm_company表 在登入時把 登入名 (username)和密碼(password)帶到後臺,

使用者名稱郵箱手機號搭配密碼都可以實現登陸(2種方法)

這是我在藍橋班初學java做的第二個專案所遇到和解決的問題,寫下來紀念,順便供有緣人蔘考。 使用者名稱/手機號/郵箱+密碼登陸是當今最常用的登陸,對初學者而言這是必須掌握和精通的,這也是在我基礎薄弱的我堅持解決的動力,其中感謝隊友李青的大力協助。 前提: mod

怎麼實現使用手機號郵箱使用者名稱登入

測試的程式碼: public static void main(String[] args) { //String e = "[email protected]"; String e ="15315315326"; String em = "^\\w+([-+.]\\w+)*@\\w+([-.]\

[轉]常用正則表示式大全-----使用者名稱密碼郵箱等資料格式的校驗

正則表示式收集,供自己查閱之用 轉自:http://www.jb51.net/article/72867.htm 一、校驗數字的表示式 1 數字:^[0-9]*$  2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$  4 m-n位的數字:^

一起talk C栗子吧(第一百回:C語言例項--使用訊號進行程序間同步互斥一)

各位看官們,大家好,上一回中咱們說的是程序間同步與互斥的例子,這一回咱們說的例子是:使用訊號量進行程序間同步與互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧! 看官們,訊號量是由著名電腦科學家迪傑斯特拉(Dijkstra)提出的一種概念,專門用來

Android TextView通過Spannable識別超連結郵箱電話

現在有好多應用都能識別電話號碼、郵箱、超連結,點選電話號碼可以直接呼叫系統電話進行撥打,點選郵箱則呼叫系統郵箱或者第三方的郵箱,點選超連結則會進入瀏覽器,方便操作。現在經過簡單的封裝來實現這三個功能。 public class LinkifySpannable

Android 判斷字串是不是是身份證郵箱銀行卡手機號中文 1

Android 判斷字串是否是身份證、郵箱、銀行卡、手機號、中文 1.判斷字串是否是身份證:     /**       * 功能:身份證的有效驗證       *        * @param IDStr       *            身份證號       *

AND型訊號訊號集-----程序的同步互斥面向物件的解決方案(二)

AND型訊號量 上述的程序互斥問題,是針對各程序之間只共享一個臨界資源而言的。在有些應用場合,是一個程序需要先獲得兩個或更多的共享資源後方能執行其任務。假定現有兩個程序A和B,他們都要求訪問共享資料D和E。當然,共享資料都應作為臨界資源。為此,可為這兩個資料分別設定用於互斥

HTML中使用者名稱身份證號郵箱出生日期等的格式驗證

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表單驗證</title> //為了使頁面不是那麼

js 驗證手機號郵箱數字檔案字尾

// js 驗證檔案 /** * 驗證手機號碼格式 * @param {Object} id */ function checkMobile(id) { var val = $("#"

swift 手機號郵箱網址等正則表示式驗證

import Foundation enum Validate { case email(_: String) case phoneNum(_: String) case carNum(_: String) case username(_: String) case

Objective-C用正則表示式判斷字串是否為手機號郵箱身份證號

用正則表示式判斷字串是否為手機號: - (BOOL)isPhoneNumber:(NSString *)str { NSString * MOBILE = @"^1(3[0-9]|5[0-