用消息队列作信号量

  1. 在消息队列初始化时,可以将消息队列中的多个指针设为非NULL值(如void* 1),来实现计数信号量的功能。这里,初始化为非NULL值的指针数就是可用的资源数。系统中的任务可以通过OSQPend()来请求“信号量”,然后通过调用OSQPost()来释放“信号量”,如程序清单 L6.28。如果系统中只使用了计数信号量和消息队列,使用这种方法可以有效地节省代码空间。这时将OS_SEM_EN设为0,就可以不使用信号量,而只使用消息队列。值得注意的是,这种方法为共享资源引入了大量的指针变量。也就是说,为了节省代码空间,牺牲了RAM空间。另外,对消息队列的操作要比对信号量的操作慢,因此,当用计数信号量同步的信号量很多时,这种方法的效率是非常低的。  
  2.   
  3. 程序清单 L6.28 使用消息队列作为一个计数信号量  
  4. OS_EVENT *QSem;  
  5. void     *QMsgTbl[N_RESOURCES]  
  6.   
  7.   
  8. void main (void)  
  9. {  
  10.     OSInit();  
  11.     .    .  
  12.     QSem = OSQCreate(&QMsgTbl[0], N_RESOURCES);  
  13.     for (i = 0; i < N_RESOURCES; i++) {  
  14.         OSQPost(Qsem, (void *)1);  
  15.     }  
  16.     .  
  17.     .  
  18.     OSTaskCreate(Task1, .., .., ..);  
  19.     .  
  20.     .  
  21.     OSStart();  
  22. }  
  23.   
  24.   
  25. void Task1 (void *pdata)  
  26. {  
  27.     INT8U err;  
  28.   
  29.   
  30.     for (;;) {  
  31.         OSQPend(&QSem, 0, &err);         /* 得到对资源的访问权  */  
  32.         .  
  33.         .    /* 任务获得信号量,对资源进行访问  */  
  34.         .  
  35.         OSMQPost(QSem, (void*)1);       /* 释放对资源的访问权 */  
  36.     }  
  37. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值