1. 程式人生 > >使用一個訊息佇列作為計數訊號量

使用一個訊息佇列作為計數訊號量

在訊息佇列初始化時,可以將訊息佇列中的多個指標設為非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);       /* 釋放對資源的訪問權 */
    }
}