1、内核中信号量使用
struct semaphore stSem //lunux 中定义一个信号量
sema_init(&stSem, N) //初始化一个信号量; cnt > 0 表示同时被cnt个人使用;cnt=0用于同步,需要+1之后才能被使用。
up(&stSem) //释放资源,信号量的值cnt+1
down(&stSem) //获取信号量,如果信号量的cnt>0,则获取成功,获取成功后cnt-1。如果获取信号量失败则挂起进程。
down_trylock //和down大致功能一直,区别是down_trylock获取是被不会挂起,所以根据这个接口的返回值,要自己定义处理措施。
2、内核中等待队列
wait_queue_head_t stWaitq //定义一个等待队列
init_waitqueue_head(&stWaitq) //初始这个待队列
wake_up(stWaitq) //唤醒
wait_event_timeout(&stWaitq,flag,time) //获取消息队列,当flag=1是获取成功;当flag=0时,获取失败,进程阻塞,进过time时间后重新唤醒。
poll_wait(,&stWaitq,) //这个函数在.poll中使用,和wait_event_timeout差不多的效果 都需要被唤醒
3、应用
gstMemCB //共享内存控制块
{
strMenBuff //控制块.存储
{
strSem //控制块.存储.信号量
*pMenBuff //控制块.存储.内存地址
}
strMemDev //控制块.设备
{
u32UsrCnt //控制块.设备.计数
bReady //控制块.设备.准备就绪
strDevWaitQueue //控制块.设备.设备等待队列
strPollWaitQueue //控制块.设备.epll等待队列
Cdev //控制块.设备.正真设备
}
stSem //共享内存信号量
}