liteos實時作業系統之event操作解析

2021-08-28 02:44:57 字數 3403 閱讀 3776

事件是一種實現任務間通訊的機制,可用於實現任務間的同步,但事件通訊只能是事件型別的通訊,無資料傳輸。乙個任務可以等待多個事件的發生:可以是任意乙個事件發生時喚醒任務進行事件處理;也可以是幾個事件都發生後才喚醒任務進行事件處理。事件集合用32位無符號整型變數來表示,每一位代表乙個事件。

多工環境下,任務之間往往需要同步操作,乙個等待即是乙個同步。事件可以提供一對多、多對多的同步操作。一對多同步模型:乙個任務等待多個事件的觸發;多對多同步模型:多個任務等待多個事件的觸發。

任務可以通過建立事件控制塊來實現對事件的觸發和等待操作。huawei liteos的事件僅用於任務間的同步,不提供資料傳輸功能。

huawei liteos提供的事件具有如下特點:

/**

* @ingroup los_event

* event control structure

*/typedef struct tagevent

event_cb_s, *pevent_cb_s;

uweventid:用於標識該任務發生的事件型別,其中每一位表示一種事件型別(0表示該事件型別未發生、1表示該事件型別已經發生),一共31種事件型別,第25位系統保留。

在讀事件時,可以選擇讀取模式。讀取模式如下:

所有事件(los_waitmode_and):讀取掩碼中所有事件型別,只有讀取的所有事件型別都發生了,才能讀取成功。

任一事件(los_waitmode_or): 讀取掩碼中任一事件型別,讀取的事件中任意一種事件型別發生了,就可以讀取成功。

清除事件(los_waitmode_clr):los_waitmode_and| los_waitmode_clr或 los_waitmode_or| los_waitmode_clr 時表示讀取成功後,對應事件型別位會自動清除。

讀事件時,可以根據入參事件掩碼型別uweventmask讀取事件的單個或者多個事件型別。事件讀取成功後,如果設定los_waitmode_clr會清除已讀取到的事件型別,反之不會清除已讀到的事件型別,需顯式清除。可以通過入參選擇讀取模式,讀取事件掩碼型別中所有事件還是讀取事件掩碼型別中任意事件。

寫事件時,對指定事件寫入指定的事件型別,可以一次同時寫多個事件型別。寫事件會觸發任務排程。

清除事件時,根據入參事件和待清除的事件型別,對事件對應位進行清0操作。

事件可應用於多種任務同步場合,能夠一定程度替代訊號量。

huawei liteos系統中的事件模組為使用者提供下面幾個介面。

功能分類

介面名描述

事件初始化

los_eventinit

初始化乙個事件控制塊

讀事件los_eventread

寫事件los_eventwrite

寫指定的事件型別

清除事件

los_eventclear

清除指定的事件型別

校驗事件掩碼

los_eventpoll

根據使用者傳入的事件值、事件掩碼及校驗模式,返回使用者傳入的事件是否符合預期

銷毀事件

los_eventdestroy

銷毀指定的事件控制塊

使用事件模組的典型流程如下:

呼叫事件初始化los_eventinit介面,初始化事件等待佇列。

寫事件los_eventwrite,配置事件掩碼型別。

讀事件los_eventread,可以選擇讀取模式。

清除事件los_eventclear,清除指定的事件型別。

示例中,任務example_taskentry建立乙個任務example_event,example_event讀事件阻塞,example_taskentry向該任務寫事件。

在任務example_taskentry建立任務example_event,其中任務example_event優先順序高於example_taskentry。

在任務example_event中讀事件0x00000001,阻塞,發生任務切換,執行任務example_taskentry。

在任務example_taskentry向任務example_event寫事件0x00000001,發生任務切換,執行任務example_event。

example_event得以執行,直到任務結束。

example_taskentry得以執行,直到任務結束。

/*任務pid*/

static uint32 g_testtaskid;

//static lite_os_sec_bss uint32 g_uweventtaskid;

/*事件控制結構體*/

static event_cb_s example_event;

/*等待的事件型別*/

#define event_wait 0x00000001

/*用例任務入口函式*/

void example_event(void)

}else

}return;

}uint32 example_sndrcvevent(void)

/*建立任務*/

memset(&sttask1, 0, sizeof(tsk_init_param_s));

sttask1.pfntaskentry = (tsk_entry_func)example_event;

sttask1.pcname = "eventtsk1";

sttask1.uwstacksize = loscfg_base_core_tsk_default_stack_size;

sttask1.ustaskprio = 5;

uwret = los_taskcreate(&g_testtaskid, &sttask1);

if(uwret != los_ok)

/*寫用例任務等待的事件型別*/

dprintf("example_taskentry_event write event .\n");

uwret = los_eventwrite(&example_event, event_wait);

if(uwret != los_ok)

/*清標誌位*/

dprintf("eventmask:%d\n",example_event.uweventid);

los_eventclear(&example_event, ~example_event.uweventid);

dprintf("eventmask:%d\n",example_event.uweventid);

/*刪除任務*/

uwret = los_taskdelete(g_testtaskid);

if(uwret != los_ok)

return los_ok;

}

liteos實時作業系統之訊號量

訊號量 semaphore 是一種實現任務間通訊的機制,實現任務之間同步或臨界資源的互斥訪問。常用於協助一組相互競爭的任務來訪問臨界資源。在多工系統中,各任務之間需要同步或互斥實現臨界資源的保護,訊號量功能可以為使用者提供這方面的支援。通常乙個訊號量的計數值用於對應有效的資源數,表示剩下的可被占用的...

liteos實時作業系統之時間管理

基本概念 時間管理以系統時鐘為基礎。時間管理提供給應用程式所有和時間有關的服務。系統時鐘是由定時 計數器產生的輸出脈衝觸發中斷而產生的,一般定義為整數或長整數。輸出脈衝的週期叫做乙個 時鐘滴答 系統時鐘也稱為時標或者tick。乙個tick的時長可以靜態配置。使用者是以秒 毫秒為單位計時,而晶元cpu...

實時作業系統之任務

任務可以以下列狀態之一存在 有效的任務狀態轉換 任務優先順序 每個任務都分配了乙個從0到 configmax priorities 1 的優先順序,其中configmax priorities在freertosconfig.h中定義。如果正在使用的埠實現了使用 計數前導零 型別指令 用於在單條指令中...