Autosar事件機制——摘自百度文庫
摘自https://wenku.baidu.com/view/19b75a8ff18583d04864591b.html,感謝原作者!
AUTOSAR事件機制
作者:鄧孔宏
1.1 事件
事件是由操作系統管理的對象。事件機制只提供給拓展的任務,它開始任務到waiting和去到waiting狀態的轉換,是一種同步的方法。
每個任務有一個確切數量的事件集。這個任務被稱作那些事件的所有者。一個個別的事件被識別通過它的所有者和它的名稱(或掩碼)。事件可以被用來傳達二進制信息到(事件分配到的)拓展的任務。
有多種可用的選項去操作事件,依據事件的所有者是專用的任務還是另一個(不一定要是一個拓展的任務的)任務。所有的任務可以設置任何不是
任何的任務或者第二類中斷可以設置一個事件給一個非suspended任務,這樣通過這個事件通知這個拓展的任務關於任何狀態的改變。
任何情況下一個事件的接收者是一個拓展的任務。因此,不可能一個中斷服務程序或一個基礎的任務等待一個事件。一個事件只能被該事件的所有者任務清除。
如果至少一個任務正等待的事件已經發生,該處於waiting狀態的拓展的任務被釋放到ready狀態。如果一個拓展的任務試圖等待一個事件,而這個事件已經發生,該任務繼續在running狀態。
1.2 事件控制
StatusType SetEvent(
輸入參數:TaskID 指的是要被設置一個或幾個事件的任務
Mask 要被設置的事件的掩碼
返回的Status值:
標準的: · 沒有錯誤,E_OK
拓展的: · 任務<TaskID>是無效的,E_OS_ID
· 涉及的任務不是拓展的任務,E_OS_ACCESS
· 事件被能被設置因為涉及的任務處於suspended狀態,E_OS_STATE
一致性類別:ECC1,ECC2
該服務可能在一個中斷服務程序和任務層被調用,但是不是在
任務<TaskID>的事件被設置根據事件掩碼<MASK>。如果任務<TaskID>在等待至少一個在<MASK>裏規定的事件,調用SetEvent導致任務被轉換到ready狀態。
在事件掩碼裏沒有被設置的事件維持不變。
StatusType ClearEvent(EventMaskType <Mask>)
輸出參數:MASK 要被清除的事件的掩碼
返回的Status值
標準的: · 沒有錯誤,E_OK
· 不是來自拓展任務的調用,E_OS_ACCESS
· 調用在中斷層,E_OS_CALLEVEL
一致性類別:ECC1,ECC2
拓展任務的事件通過調用ClearEvent被清除根據事件掩碼<Mask>。
系統服務ClearEvent僅限於擁有該事件的拓展的任務。
StatusType GetEvent(TaskType <TaskID>,EventMaskRefType <Event>)
輸入參數:TaskID 所有的事件掩碼要被返回的任務
輸出參數:指向返回數據的內存
返回的狀態值
標準的: · 沒有錯誤,E_OK
拓展的: · 任務<TaskID>無效,E_OS_ID
· 涉及的任務<TaskID>不是一個拓展的任務,E_OS_ACCESS
· 涉及的任務<TaskID>處於suspended狀態,E_OS_STATE
一致性類別:ECC1,ECC2
該服務返回任務<TaskID>當前的所有的事件二進制數字。
服務可能在中斷服務程序,任務層和一些hook程序被調用。
任務<TaskID>的事件掩碼的當前的狀態被復制到<Event>。
涉及的任務應該是一個拓展的任務。
StatusType WaitEvent(EventMaskType <Mask>)
輸入參數:Mask 等待的事件的掩碼
返回的Status值:
標準的: · 沒有錯誤,E_OK
拓展的: · 調用任務不是拓展的任務,E_OS_ACCESS
· 調用任務占據資源,E_OS_RESOURCE
· 調用在中斷層,E_OS_CALLEVEL
一致性類別:ECC1,ECC2
調用任務被設置成waiting,除非規定在<Mask>裏的至少一個事件已經發生。
如果等待的條件發生,這個調用強制重調度。如果重調度發生,任務的內部的資源被釋放當任務處於waiting狀態的時候。
該服務只能被擁有該事件的拓展的任務調用。
聲明:本文主要內容從OSEK OS標準規範文件os223.pdf翻譯而來,並結合AUTOSAR OS規範進行了部分調整。文件公開,用於研究和探討,作者不承擔引用本文而造成的任何後果。未經作者同意不允許用於任何商業用途。
Autosar事件機制——摘自百度文庫