RT-Thread 内核学习–信号量的初步使用

关于信号量的简单实践使用

	关于一个信号量的使用,主要有三步:
	①创建一个信号量sem。
	②释放一个信号量sem。
	③捕获到一个信号量sem 。

①信号量的创建

	函数:rt_sem_init(rt_sem_t    sem,
					  const char    *name,
						rt_uint32_t value,
						rt_uint8_t  flag)
	sem 是struct   rt_semaphore    sem结构体所定义的信号量,name可以根据开发者的需求取名,value一般取0即可,
	flag一般按照RT_IPC_FLAG_FIFO(队列即可)。
//举例代码 
//第一步
struct   rt_semaphore    sem_syq;
rt_sem_init(&sem, "xxx", 0, RT_IPC_FLAG_FIFO);

②信号量的释放

函数:rt_sem_release(rt_sem_t sem);
sem就是刚才创建的信号量名称;
//第二步
#define Normal 0x01; 
if(syq.phase == Normal )
{
	rt_sem_release(sem_syq)}

③信号量的捕获

函数:rt_sem_take(rt_sem_t sem, rt_int32_t time);
sem的名称仍然保持不变,time表示等待信号量释放所等待的时间。

①当time为RT_TICK_PER_SECOND*2(2秒),2秒内未捕获到信号量的释放,则return -RT_ETIMEOUT;当捕获到信号量时,return RT_EOK,并且下次调用rt_sem_take函数时,time仍然为2秒;
②当time为RT_WAITING_FOREVER,则说明一直在捕获信号量。当无法捕获到信号量时,则一直等待;

①当time为1000时(默认单位为ms);

if((rt_sem_take(sem_syq,1000)) == RT_EOK)			//如果没有捕获到信号量,可能是因为线程阻塞的原因。
{
	rt_kprintf("take sem_syq successfully !!! \r\n") //做出相应的处理
}
else
{
	rt_kprintf("take sem_syq unsuccessfully !!! \r\n") //做出相应的处理
}

②当time为RT_WAITING_FOREVER时;

if((rt_sem_take(sem_syq,RT_WAITING_FOREVER)) == RT_EOK)			//如果没有捕获到信号量,可能是因为线程阻塞的原因。
{
	rt_kprintf("take sem_syq successfully !!! \r\n") //做出相应的处理
}

小结

当使用信号量时,开发者需清除信号量所应用的范围。
一般情况下,信号量的创建在初始化的阶段,而信号量则是在某个数据传输完毕后或者某个状态达到进行释放后,在另一端
去捕获,从而做出相应的处理。
09-02 15:40