在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內(nèi)不再提示

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

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

1.概述

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

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

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

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

2. Events配置

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

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

2.1 定義等待任務

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

3. 如何使用Event

3.1 等待事件

任務的等待事件需要調(diào)用WaitEvent(EventMask) API,具體等待的EventMask需要關聯(lián)到提前聲明的內(nèi)容。

WaitEvent()將事件作為其唯一參數(shù)。執(zhí)行調(diào)用時,有兩種可能:

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

2)事件已經(jīng)發(fā)生。在這種情況下,任務將保持在運行狀態(tài),并將在WaitEvent()調(diào)用之后的語句中繼續(xù)執(zhí)行。

3.1.1 等待單一事件

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

#include  


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

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

3.1.2 等待多個事件

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

當任務等待多個事件時,當?shù)却娜魏我粋€事件發(fā)生時,它將恢復。當從等待多個事件恢復時,將需要確定發(fā)生了哪些事件。

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

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

#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不可能靜態(tài)地確定擴展任務是否會死鎖。采用下面的設計方法可能會避免類似問題:

?僅使用基本任務;

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

3.2 設置事件

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

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

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

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

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

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

#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();
}

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

此外,也可以通過Alarms及調(diào)度表來設置事件。

3.2.1通過Alarm設置事件

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

3.2.2 通過帶有到期點的調(diào)度表設置事件

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

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*/
    ...
    }
  }
}

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

清除事件時調(diào)用ClearEvent API,被清除后的狀態(tài)必須與事件掩碼關聯(lián)起來。

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

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

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

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

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

#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是用于同步的實體,可用于擴展任務的等待內(nèi)容;

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

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

Tasks,ISRs及調(diào)度表都可以設置Events。

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)

    關注

    37

    文章

    6889

    瀏覽量

    123641
  • AUTOSAR
    +關注

    關注

    10

    文章

    363

    瀏覽量

    21749
  • 事件
    +關注

    關注

    0

    文章

    12

    瀏覽量

    9956
  • ISR
    ISR
    +關注

    關注

    0

    文章

    38

    瀏覽量

    14461

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

    MQTT軟件包的配置參數(shù)和使用方法

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

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

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

    介紹SPI的使用方法

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

    Gowin AEC IP的產(chǎn)品特點及使用方法

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

    Gowin ASRC IP的產(chǎn)品特點及使用方法

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

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

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

    示波器的使用方法

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

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

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

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

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

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

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

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

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

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

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

    Wakeup events framework同步問題

    Wakeup events framework 系統(tǒng)處于 suspend 狀態(tài),可通過 wakeup events 喚醒。具體的 wakeup events 可以是按鍵按下,可以是充電器插入等。但是
    的頭像 發(fā)表于 09-11 16:17 ?527次閱讀
    主站蜘蛛池模板: 海棠高h粗暴调教双性男男 韩国韩宝贝2020vip福利视频 | 亚洲91| 97久久综合九色综合 | se视频在线观看 | 天天射夜夜操 | 国产美女主播在线观看 | 婷婷亚洲综合一区二区 | 天天操伊人 | 国产小视频免费 | 一女被多男玩很肉很黄文 | 夜夜天天 | 四虎影院在线网址 | 午夜日韩视频 | 福利在线播放 | 午夜视频在线免费播放 | 日本一区二区三区四区视频 | 亚洲福利在线视频 | 好吊色青青青国产在线观看 | 国模张文静啪啪私拍337p | 国产精品一级毛片不收费 | wwwww色| 日本不卡一区二区三区视频 | 欧美日韩精品一区二区在线线 | 欧美视频一区在线观看 | 国产成人1024精品免费 | 五月天婷婷久久 | 美女和帅哥在床上玩的不可描述 | 高清国产下药迷倒美女 | 天堂中文在线网 | 天堂影院jav成人天堂免费观看 | 色依依视频视频在线观看 | ccav在线永久免费看 | 日本黄色片黄色片 | 毛片视频免费网站 | 欧美色图888| 国产欧美一区二区日本加勒比 | 国产高清色播视频免费看 | 国产女人视频免费观看 | 亚洲人成亚洲人成在线观看 | 美女视频黄a视频免费全过程 | 天天干天天操天天干 |