OSSemCreate(), OSTaskCreate()
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是一個結構,其中包含了一些有關任務的信息,如任務的優先級、任務堆棧的指針、任務的狀態等。然後,這個函數將任務的狀態設置為“就緒”,並將其加入到就緒任務列表中。最後,這個函數返回,新的任務現在已經創建並準備好運行了。
頁:
[1]