使用一個訊息佇列作為計數訊號量
阿新 • • 發佈:2019-02-17
在訊息佇列初始化時,可以將訊息佇列中的多個指標設為非NULL值(如void* 1),來實現計數訊號量的功能。這裡,初始化為非NULL值的指標數就是可用的資源數。系統中的任務可以通過OSQPend()來請求“訊號量”,然後通過呼叫OSQPost()來釋放“訊號量”,如程式清單 L6.28。如果系統中只使用了計數訊號量和訊息佇列,使用這種方法可以有效地節省程式碼空間。這時將OS_SEM_EN設為0,就可以不使用訊號量,而只使用訊息佇列。值得注意的是,這種方法為共享資源引入了大量的指標變數。也就是說,為了節省程式碼空間,犧牲了RAM空間。另外,對訊息佇列的操作要比對訊號量的操作慢,因此,當用計數訊號量同步的訊號量很多時,這種方法的效率是非常低的。 程式清單 L6.28 使用訊息佇列作為一個計數訊號量 OS_EVENT *QSem; void *QMsgTbl[N_RESOURCES] void main (void) { OSInit(); . . QSem = OSQCreate(&QMsgTbl[0], N_RESOURCES); for (i = 0; i < N_RESOURCES; i++) { OSQPost(Qsem, (void *)1); } . . OSTaskCreate(Task1, .., .., ..); . . OSStart(); } void Task1 (void *pdata) { INT8U err; for (;;) { OSQPend(&QSem, 0, &err); /* 得到對資源的訪問權 */ . . /* 任務獲得訊號量,對資源進行訪問 */ . OSMQPost(QSem, (void*)1); /* 釋放對資源的訪問權 */ } }