打印

信号量的使用方法

[复制链接]
3766|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
y607|  楼主 | 2011-12-11 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚刚接触Rt-thread操作系统,新建的几个线程通过系统休眠可以同时运行,之后想要信号量来对进程进行管理,可只能运行一个进程,
while(rt_sem_take(&led_turn_sem,RT_WAITING_FOREVER) == RT_EOK) 信号量没有得到,想请大侠们请教一下信号量的使用方法。
信号量可以设定一个值,允许最多又几个任务同时去访问共享资源。比如我给他设定一个5,那么对多就有5个任务能同时访问共享资源。每个任务获得信号量的时候就把信号量计数器减去1,这样,再第五个任务获取后,计数器是0.当第六个任务要去访问的时候申请信号量就只能等待了,等到之前的任务发一个信号出来,这样第六个任务才能去
这个信号量的值是怎么设置的?
沙发
y607|  楼主 | 2011-12-11 18:10 | 只看该作者
请大虾指导。  是不是多个线程只需要设置一个信号量(led2_sem),用这个信号量来确定只执行当前
while (1)
{
           rt_sem_take(&led2_sem,RT_WAITING_FOREVER);
          Led_Part_ON(1);
           rt_kprintf("led2 off\r\n");
           rt_sem_release(&led2_sem);
           rt_thread_delay(10);    //还有此处是不是必须有系统休眠,其他的进程才会得到运行??
}
有没有必要将每个线程都设置一个信号量 如(相对应三个线程)
rt_sem_init(&led1_sem,"led1_sem",1,RT_IPC_FLAG_FIFO);                  
rt_sem_init(&led2_sem,"led2_sem",1,RT_IPC_FLAG_FIFO);               
rt_sem_init(&led_turn_sem,"led_turn_sem",1,RT_IPC_FLAG_FIFO);       
对使用信号量的方式理解是不是出现问题,请指教。

使用特权

评论回复
板凳
李富贵| | 2011-12-11 18:46 | 只看该作者
具体问题具体分析,没有一定之规的。

使用特权

评论回复
地板
sjl2006| | 2011-12-11 19:21 | 只看该作者
楼主说的信号量led_turn_sem应该是个计数器类型的,你要查一下led_turn_sem初始化对不对。比如,rt_sem_init的第三个参数是不是计数器数目?如果是,那么应该是5。
多个线程只需要有一个调用初始化接口就够了,所有与其相关的线程只需要take它即可。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

1

粉丝