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") //做出相应的处理
}
小结
当使用信号量时,开发者需清除信号量所应用的范围。
一般情况下,信号量的创建在初始化的阶段,而信号量则是在某个数据传输完毕后或者某个状态达到进行释放后,在另一端
去捕获,从而做出相应的处理。