BLOG記事用論壇

 找回密碼
 註冊
搜索
熱搜:
查看: 908|回復: 0

OSSemCreate(), OSTaskCreate()

[複製鏈接]
發表於 2023-6-5 14:30:23 | 顯示全部樓層 |閱讀模式

OSSemCreate()
OSSemCreate(INT16U cnt): 此函數用於創建一個新的信號量,並返回一個指向該信號量的指針。cnt 參數指定信號量的初始值。在µC/OS-II中,此函數返回一個指向 OS_EVENT 結構的指針,此結構包含有關該信號量的所有信息。

在應用於互斥鎖模式時,這個信號量通常被初始化為二進制信號量,即其值只能為0或1。值為1表示資源可用,而值為0表示資源被佔用。這種模式稱為互斥鎖(Mutual Exclusion,縮寫為Mutex),用於確保任何時間只有一個任務可以訪問特定的共享資源。

在你的例子中,這個信號量被用來保護 C 標準庫中的 random() 函數。random() 函數通常使用一種稱為線性同餘生成器(Linear Congruential Generator,LCG)的算法來生成隨機數。此算法使用一個全局變量作為內部狀態,並在每次調用時對該變量進行更新。因此,如果多個任務同時調用 random() 函數,可能會導致不正確的結果。為了防止這種情況,可以使用一個信號量來確保任何時候只有一個任務能夠調用 random() 函數。

OSTaskCreate()
OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio): 這個函數接受四個參數:任務函數的指針、傳遞給任務函數的參數的指針、任務堆棧的頂部的指針,以及任務的優先級。這個函數將創建一個新的任務並使其變為“就緒”狀態,這意味著它現在可以被調度器選擇來執行了。

µC/OS-II允許創建最多62個任務。這些任務的優先級由0到61,其中0表示最高優先級,61表示最低優先級。在任何調度點(例如時鐘tick、中斷返回、信號量操作等),µC/OS-II都會選擇當前最高優先級的就緒任務來執行。

當 OSTaskCreate() 被調用時,它首先為新的任務創建一個任務控制塊(Task Control Block,TCB)。TCB是一個結構,其中包含了一些有關任務的信息,如任務的優先級、任務堆棧的指針、任務的狀態等。然後,這個函數將任務的狀態設置為“就緒”,並將其加入到就緒任務列表中。最後,這個函數返回,新的任務現在已經創建並準備好運行了。

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|綜合討論區

GMT+8, 2026-6-24 18:39 , Processed in 0.067632 second(s), 8 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表