複用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函數。