CMSIS-RTOS 複用Multiplex

複用Multiplex

複用是用來限制訪問臨界代碼區的線程個數,舉個例子,對於存儲空間的訪問僅僅可能只支持幾個受限的調用。

osSemaphoreId multiplex;
osSemaphoreDef(multiplex);
void thread1 (void)
{
    multiplex =osSemaphoreCreate(osSemaphore(multiplex), FIVE_TOKENS); 
    while(1) { 
        osSemaphoreWait(multiplex,osWaitForever)
        ProcessBuffer(); 
        osSemaphoreRelease(multiplex); 
    }
}

在這個例子中,我們給複用信號量初始化了5個令牌,當一個線程要調用ProcessBuffer()函數時,就必須首先獲取信號量令牌,一旦此函數結束,令牌必須歸還給信號量。如果超過5個線程試圖調用ProcessBuffer()函數,第六個線程就必須等待其中一個線程完成ProcessBuffer()函數,並歸還令牌。就這樣,複用信號量確保了最多隻能有5個線程可以“同時”調用ProcessBuffer()函數。

練習:複用

在這個練習中,我們將學習如何通過創建複用信號量來控制對一個函數的訪問。

打開Pack Installer,選擇“Ex 12 Multiplex”,然後install到你的指定路徑

這個工程創建了一個名叫semMultiplex的信號量,並擁有一個令牌,下一步創建一個擁有6個實例化的線程,並在該線程裏創建一個信號量複用。

編譯工程,並啓動仿真環境

打開Peripherals->General Purpose IO->GPIOB window

運行代碼,並觀察線程是怎樣設置管腳狀態的

由於同一時間只有一個線程可以訪問LED函數,所以同一時間只有一個管腳被設置。

退出仿真環境,在創建複用信號量的位置,增加令牌的數量

semMultiplex = osSemaphoreCreate(osSemaphore(semMultiplex), 3);

編譯工程,並啓動仿真環境

運行代碼,並觀察GPIOB管腳狀態

可以看到,此時有3個線程可以“同時”訪問LED函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章