色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Events(事件)概述、配置及使用方法

832065824 ? 來源:CSDN技術社區 ? 2023-01-12 10:27 ? 次閱讀

1.概述

在《RTA-OS系列介紹-Task》部分我們介紹了任務分為基礎任務與擴展任務,兩者的主要區別為,擴展任務多了waiting狀態,那Waiting狀態等待的是什么呢?其實就是我們今天要介紹的Events(事件),當系統中的Task或ISR設置事件后,等待的任務將轉到Ready狀態。當它成為最高優先級就緒任務時,RTA-OS將選擇運行該Task。

8eb31b1e-84f2-11ed-bfe3-dac502259ad0.png

在AUTOSAR操作系統中,事件用于向任務發送信號信息,主要用于為擴展任務提供多個同步點。本文將對什么是事件,如何配置事件以及如何在運行時使用它們。Events的使用場景大致如下圖所示。

8ed3670c-84f2-11ed-bfe3-dac502259ad0.png

2. Events配置

正常在應用中可配置的Events的最大數量取決于硬件,而Events需要配置的內容包括:名字、至少一個Task使用及Event mask。

設置事件時,必須同時指定任務。因此,例如,如果為名為Task1的任務設置名為Event0的事件,則這對任務Task2的Event0沒有影響。

2.1 定義等待任務

在使用中,當我們聲明某個Task需要等待一個Event時,系統將默認該任務為擴展任務,等待事件的擴展任務通常會自動啟動(等待的時間滿足后),并且任務永遠不會終止。當任務開始執行時,RTA-OS將清除它擁有的所有事件。

3. 如何使用Event

3.1 等待事件

任務的等待事件需要調用WaitEvent(EventMask) API,具體等待的EventMask需要關聯到提前聲明的內容。

WaitEvent()將事件作為其唯一參數。執行調用時,有兩種可能:

1)事件暫未發生。這種情況下該Task會進入等待狀態,RTA-OS會運行Ready狀態中優先級最高的Task。

2)事件已經發生。在這種情況下,任務將保持在運行狀態,并將在WaitEvent()調用之后的語句中繼續執行。

3.1.1 等待單一事件

要等待單個事件,只需將事件掩碼名稱傳遞給API調用。下面示例顯示了任務如何使用等待事件。

#include  


TASK(ExtendedTask){
...
WaitEvent(Event1);/*TaskenterswaitingstateinAPIcallif
Event1hasnothappened*/
/*WhenEvent1isset,ExtendedTaskresumeshere*/
...
}

在AUTOSAR操作系統中,為處于掛起狀態的任務設置事件是非法的。實際上,這意味著等待事件的任務結構通常是一個等待事件的有限循。

3.1.2 等待多個事件

因為AUTOSAR OS事件只是一個位掩碼(Bit Mask),所以用戶可以通過按位設置一組位掩碼,同時等待多個事件。

當任務等待多個事件時,當等待的任何一個事件發生時,它將恢復。當從等待多個事件恢復時,將需要確定發生了哪些事件。

#include
TASK(ExtendedTask){
  EventMaskTypeWhatHappened;
while(true){
WaitEvent(Event1|Event2|Event3);
GetEvent(Task1,&WhatHappened);
if(WhatHappened&Event1){
  /*TakeactiononEvent1*/
    ...
}elseif(WhatHappened&Event2){
/*TakeactiononEvent2*/
    ...
}elseif(WhatHappened&Event3){
/*TakeactiononEvent3*/
...
}
  }
}

在AUTOSAR-OS中,提供了GetEvent()的API,我們可以通過該API獲知哪個事件已完成。

3.1.3 擴展任務的死鎖

雖然AUTOSAR操作系統在關鍵部分的資源互斥中提供了免于死鎖的自由,但在構建具有可能死鎖的事件的系統時,仍不會受到保護。如果我們有相互設置和等待事件集的擴展任務,則兩個(或更多)任務可能正在等待僅由其他正在等待的任務設置的事件。當然,即使存在死鎖擴展任務,系統中的基本任務也不可能死鎖。

下面的樣例展示了擴展任務的死鎖:

#include  
TASK(Task1)  {
  while  (1)  {
    WaitEvent(Ev1);
    /*  Never  reach  here  -  DEADLOCKED  with  Task2!  */
    SetEvent(Task2,Ev2);
  }
}


TASK(Task2)  {
    while  (1)  {
      WaitEvent(Ev2);
      /*  Never  reach  here  -  DEADLOCKED  with  Task1!  */
      SetEvent(Task1,Ev1);
    }
}

OS配置不獲取哪些任務或ISR設置了事件,只獲取哪些任務可以等待事件。因此,RTA-OS不可能靜態地確定擴展任務是否會死鎖。采用下面的設計方法可能會避免類似問題:

?僅使用基本任務;

?分析代碼,以表明在所有SetEvent()或WaitEvent()對的傳遞閉包上沒有循環等待事件。

3.2 設置事件

通過SetEvent() API 來設置事件。

SetEvent()調用有兩個參數,一個任務和一個事件掩碼。對于指定的任務,SetEvent()調用設置事件掩碼中指定的事件。該調用不會為共享事件的任何其他任務設置事件。

在調用SetEvent()時,可以按位或多個事件掩碼來同時為任務設置多個事件。

無法為處于掛起狀態的任務設置事件。因此,在設置事件之前,必須確保任務未掛起。您可以使用GetTaskState()API調用來實現這一點,但請注意,當為優先級高于調用方的任務調用此函數時,可能存在競爭條件。調用方可以在對API的調用和對結果的評估之間被搶占,并且被請求的任務的狀態在中間時間內可能已經改變。

當擴展任務正在等待的任何一個事件被設置時,擴展任務將從等待狀態移動到就緒狀態。

如下任務顯示了任務如何設置事件:

#include  
TASK(Task1)  {
  TaskStateType  TaskState;
  /*  Set  a  single  event  */
  SetEvent(Task2,  Event1);
  /*  Set  multiple  events  */
  SetEvent(Task3,  Event1  |  Event2  |  Event3);
  ...
  /*  Checking  for  the  suspended  state  */
  GetTaskState(Task2,&TaskState);
  if  (TaskState  !=  SUSPENDED)  {
    SetEvent(Task2,  Event1);
  }
  ...
  TerminateTask();
}

多個任務可以同時等待同一個事件,然而從上面例子可以看出,事件沒有廣播機制,換句話說,不能通過調用一個API告訴所有等待的任務該事件已經發生。

此外,也可以通過Alarms及調度表來設置事件。

3.2.1通過Alarm設置事件

Alarm可用于定期激活不終止的擴展任務。每次Alarm到期時,都會設置該事件。等待事件的任務隨后準備好運行。

3.2.2 通過帶有到期點的調度表設置事件

調度表上的到期點可用于編程(a)非終止狀態的擴展任務的定期激活。每次處理到期點時,都會設置事件。等待事件的任務隨后準備好運行。

3.3 清除Events

可以通過Task或者ISRs來設置Event,但是Event只能被其owner清除。

#include  
TASK(ExtendedTask){
  EventMaskType  WhatHappened;
  ...
  while(  WaitEvent(Event1|Event2|Event3)==E_OK  )  {
    GetEvent(Task1,  &  WhatHappened);
    if(WhatHappened  &  Event1  )  {
    ClearEvent(Event1);
    /*  Take  action  on  Event1  */
    ...
    }  else  if(  WhatHappened  &  (Event2  |  Event3  )  {
    ClearEvent(Event2  |  Event3);
    /*  Take  action  on  Event2  or  Event3*/
    ...
    }
  }
}

當某個任務等待某個事件,該事件發生,在后面時序再次對同一個事件調用WaitEvent()時,由于該事件仍處于Set狀態,會立即返回。因此,在再次調用等待事件前需要將之前已發生事件清除。

清除事件時調用ClearEvent API,被清除后的狀態必須與事件掩碼關聯起來。

當某個任務被掛起時,其所擁有的Event將被自動清除。

3.4 用基礎任務模擬擴展任務

基礎任務只能在任務執行的開始或結束時同步。

如還有其他同步節點需要時,可以通過event機制來實現。然而,擴展任務較基礎任務占用資源更多,在資源限制的系統中,只能通過使用基礎任務來進行 同步。

例如,如果任務構建為狀態機(例如,使用C switch語句),則可以設置狀態變量,發出TerminateTask()調用并等待重新激活。如下樣例代碼顯示了如何實現這一點。

#include  
/* Create  a  "State"  variable  that  remains  in  scope  between  task
activations  */
uint8  State;
TASK(Task1)  {
  switch  (State)  {
    case  0:
    /*  Synchronization  point  0.  */
    State  =  1;
    break;
    case  1:
    /*  Synchronization  point  1.  */
    State  =  2;
    break;
    case  2:
    /*  Synchronization  point  2.  */
    State  =  0;
    break;
  }
TerminateTask();
}

4.本文總結

Event是用于同步的實體,可用于擴展任務的等待內容;

同一個Event可被不同的Task引用;

Event不具有廣播機制,即無法將信息通知所有等待該Event中的任務;

Tasks,ISRs及調度表都可以設置Events。

如果時效性在系統中很重要,則所有擴展任務(任何等待事件的任務)的優先級必須低于基本任務。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    6856

    瀏覽量

    123437
  • AUTOSAR
    +關注

    關注

    10

    文章

    363

    瀏覽量

    21625
  • 事件
    +關注

    關注

    0

    文章

    12

    瀏覽量

    9945
  • ISR
    ISR
    +關注

    關注

    0

    文章

    38

    瀏覽量

    14451

原文標題:RTA OS系列介紹03-Event

文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    轉:Keil的使用方法 - 常用功能(二)

    Ⅰ、概述 上一篇文章是總結關于Keil使用方法-常用功能(一),關于(文件和編譯)工具欄每一個按鈕的功能描述和快捷鍵的使用。我將每一篇Keil使用方法的文章都匯總在一起,回顧前面的總結請點擊下面
    發表于 06-13 10:42

    分析模板和工具之Carbon Events工具設置概述

    INSTRUMENTS調試工具的使用(三十八) —— 分析模板和工具之Carbon Events工具(五)
    發表于 07-16 10:06

    MQTT軟件包的配置參數和使用方法

    MQTT使用說明MQTT軟件包的配置參數和使用方法
    發表于 03-30 08:10

    編寫點亮LED與打印輸出的示例來講解使用方法

    概述很多時候,應用場景,是需要分時處理各個事件。本文章就編寫點亮LED與打印輸出的示例來講解使用方法。在這直接進入正題。(在此不做創建項目的步驟介紹)1、STM32CubeIDE 配置LED管腳
    發表于 08-24 07:40

    介紹SPI的使用方法

    寫在最前使用RT-Thread Studio開發環境開發STM32單片機程序,與MDK使用env有一定的差別,對于剛開始使用的程序員來說,主要是找不到配置選項在哪里,上一篇介紹了TIM設備的使用方法
    發表于 02-17 06:32

    Gowin AEC IP的產品特點及使用方法

    Gowin AEC IP用戶指南主要包括產品概述、特征性能、功能描述、調用配置及參考設計,旨在幫助用戶快速了解 Gowin AEC IP 的產品特點及使用方法
    發表于 10-08 06:05

    Gowin ASRC IP的產品特點及使用方法

    Gowin ASRC IP 用戶指南主要包括產品概述、特征性能、功能描述、配置調用、參考設計等,旨在幫助用戶快速了解 Gowin ASRC IP 的產品特點及使用方法
    發表于 10-08 06:26

    P89LPC9251芯片上溫度傳感器的使用方法

    P89LPC9251芯片上溫度傳感器的使用方法   1 概述   隨著
    發表于 04-12 14:16 ?1478次閱讀
    P89LPC9251芯片上溫度傳感器的<b class='flag-5'>使用方法</b>

    示波器的使用方法

    數字萬用表使用方法和示波器的使用方法詳解。
    發表于 03-14 10:38 ?32次下載

    LINGO軟件的簡介和基本使用方法詳細中文概述

    本文檔的主要內容介紹的是LINGO軟件的簡介和基本使用方法詳細中文概述
    發表于 06-14 08:00 ?7次下載
    LINGO軟件的簡介和基本<b class='flag-5'>使用方法</b>詳細中文<b class='flag-5'>概述</b>

    示波器的使用方法(三):示波器的使用方法詳解

    示波器的使用方法并非很難,重點在于正確使用示波器的使用方法。往期文章中,小編對模擬示波器的使用方法和數字示波器的使用方法均有所介紹。為增進大家對示波器的
    的頭像 發表于 12-24 20:37 ?3318次閱讀

    在FPGA中配置PLL的步驟及使用方法

    在FPGA中配置PLL的步驟及使用方法
    發表于 05-28 10:01 ?21次下載

    exynos 4412 電源管理芯片PMIC 的配置使用方法

    ,就算是datasheet也很難下載得到,不知是何原因?我只能理解成這部分知識比較簡單,沒人愿意寫吧。但記錄一下原理和使用方法做為備忘,總歸沒有什么壞處。另外仍然需要提前聲明的是,這里只提供官方手冊推薦的配置方法,自由玩法不保證
    發表于 01-11 15:42 ?1次下載
    exynos 4412 電源管理芯片PMIC 的<b class='flag-5'>配置</b>及<b class='flag-5'>使用方法</b>

    交換機最基本的配置使用方法

    交換機最基本的配置使用方法
    的頭像 發表于 01-04 11:34 ?7420次閱讀

    Wakeup events framework同步問題

    Wakeup events framework 系統處于 suspend 狀態,可通過 wakeup events 喚醒。具體的 wakeup events 可以是按鍵按下,可以是充電器插入等。但是
    的頭像 發表于 09-11 16:17 ?509次閱讀
    主站蜘蛛池模板: 无罩看奶禁18| 曰产无码久久久久久精品| 爱看吧孕妇网| 色网址在线观看| 国产女人视频免费观看| 夜色私人影院永久入口| 免费可以看黄的视频s色| 粉嫩自拍 偷拍 亚洲| 亚洲人美女肛交真人全程| 伦理片午夜在线视频| 广播电台在线收听| 英国video性精品高清最新| 琪琪色在线播放| 极品色αv影院| yin荡体育课羞耻play双性| 亚洲高清在线精品一区| 暖暖 免费 高清 日本视频大全| 国产AV精品久久久免费看| 野花日本免费完整版高清版动漫| 欧美日韩午夜群交多人轮换| 国产人妻精品久久久久久很牛 | 国产老肥熟xxxx| 影音先锋xfplay影院av| 日韩精品欧美亚洲高清有无| 久久久黄色片| 国产精品一区二区三区免费| 18黄女脱内衣| 校园高h肉耽文| 欧美一区二区影院| 久cao在线香蕉| 国产盗摄TP摄像头偷窥| 99九九99九九九视频精品| 亚洲精品久久7777777| 日本xxxx96| 老师洗澡让我吃她胸的视频| 国产人妻XXXX精品HD电影| 草莓视频在线观看完整高清免费 | 高清不卡伦理电影在线观看| 4388成人| 一本大道手机在线看| 挺进绝色老师的紧窄小肉六|