liteos實時作業系統之訊號量

2021-08-28 05:10:50 字數 3279 閱讀 5738

訊號量(semaphore)是一種實現任務間通訊的機制,實現任務之間同步或臨界資源的互斥訪問。常用於協助一組相互競爭的任務來訪問臨界資源。

在多工系統中,各任務之間需要同步或互斥實現臨界資源的保護,訊號量功能可以為使用者提供這方面的支援。

通常乙個訊號量的計數值用於對應有效的資源數,表示剩下的可被占用的互斥資源數。其值的含義分兩種情況:

以同步為目的的訊號量和以互斥為目的的訊號量在使用有如下不同:

訊號量控制塊

/**

* @ingroup los_sem

* semaphore control structure.

*/typedef struct

sem_cb_s;

訊號量初始化,為配置的n個訊號量申請記憶體(n值可以由使用者自行配置,受記憶體限制),並把所有的訊號量初始化成未使用,並加入到未使用鍊錶中供系統使用。

訊號量建立,從未使用的訊號量鍊錶中獲取乙個訊號量資源,並設定初值。

訊號量申請,若其計數器值大於0,則直接減1返回成功。否則任務阻塞,等待其它任務釋放該訊號量,等待的超時時間可設定。當任務被乙個訊號量阻塞時,將該任務掛到訊號量等待任務佇列的隊尾。

訊號量釋放,若沒有任務等待該訊號量,則直接將計數器加1返回。否則喚醒該訊號量等待任務佇列上的第乙個任務。

訊號量刪除,將正在使用的訊號量置為未使用訊號量,並掛回到未使用鍊錶。

訊號量允許多個任務在同一時刻訪問同一資源,但會限制同一時刻訪問此資源的最大任務數目。訪問同一資源的任務數達到該資源的最大數量時,會阻塞其他試圖獲取該資源的任務,直到有任務釋放該訊號量。

訊號量是一種非常靈活的同步方式,可以運用在多種場合中,實現鎖、同步、資源計數等功能,也能方便的用於任務與任務,中斷與任務的同步中。

功能huawei liteos 系統中的訊號量模組為使用者提供下面幾種功能。

功能分類

介面名描述

訊號量的建立和刪除

los_semcreate

建立訊號量

los_semdelete

刪除指定的訊號量

訊號量的申請和釋放

los_sempend

申請指定的訊號量

los_sempost

釋放指定的訊號量

建立訊號量los_semcreate。

申請訊號量los_sempend。 訊號量有三種申請模式:無阻塞模式、永久阻塞模式、定時阻塞模式

釋放訊號量los_sempost。

刪除訊號量los_semdelete。

例項描述

本例項實現如下功能;

測試任務example_taskentry建立乙個訊號量,鎖任務排程,建立兩個任務example_semtask1、example_semtask2,example_semtask2優先順序高於example_semtask1,兩個任務中申請同一訊號量,解鎖任務排程後兩任務阻塞,測試任務example_taskentry釋放訊號量。

example_semtask2得到訊號量,被排程,然後任務休眠20tick,example_semtask2延遲,example_semtask1被喚醒。

example_semtask1定時阻塞模式申請訊號量,等待時間為10tick,因訊號量仍被example_semtask2持有,example_semtask1掛起,10tick後仍未得到訊號量,example_semtask1被喚醒,試圖以永久阻塞模式申請訊號量,example_semtask1掛起。

20tick後example_semtask2喚醒, 釋放訊號量後,example_semtask1得到訊號量被排程執行,最後釋放訊號量。

example_semtask1執行完,40tick後任務example_taskentry被喚醒,執行刪除訊號量,刪除兩個任務。

/*測試任務優先順序*/

#define task_prio_test 5

/*任務pid*/

static uint32 g_testtaskid01,g_testtaskid02;

/*訊號量結構體id*/

static uint32 g_ussemid;

static void example_semtask1(void)

/*定時時間到,未申請到訊號量*/

if(los_errno_sem_timeout == uwret)

return;}}

return;

}static void example_semtask2(void)

/*任務休眠20 tick*/

los_taskdelay(20);

dprintf("example_semtask2 post sem g_ussemid .\n");

/*釋放訊號量*/

los_sempost(g_ussemid);

return;

}uint32 example_semphore(void)

/*建立任務2*/

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

sttask2.pfntaskentry = (tsk_entry_func)example_semtask2;

sttask2.pcname = "mutextsk2";

sttask2.uwstacksize = loscfg_base_core_tsk_idle_stack_size;

sttask2.ustaskprio = (task_prio_test - 1);

uwret = los_taskcreate(&g_testtaskid02, &sttask2);

if(uwret != los_ok)

return los_nok;

}/*解鎖任務排程*/

los_taskunlock();

uwret = los_sempost(g_ussemid);

/*任務休眠40 tick*/

los_taskdelay(40);

/*刪除訊號量*/

los_semdelete(g_ussemid);

/*刪除任務1*/

if(los_ok != los_taskdelete(g_testtaskid01))

/*刪除任務2*/

if(los_ok != los_taskdelete(g_testtaskid02))

return uwret;

}

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

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

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

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

實時作業系統之任務

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