您的位置:首页 > 其它

使用一个消息队列作为计数信号量

2017-04-18 08:58 190 查看
在消息队列初始化时,可以将消息队列中的多个指针设为非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);       /* 释放对资源的访问权 */
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: