Nuttx 操作系统信号量Semaphore
Nuttx系统中采用信号量来同步线程,保护临界资源。与linux系统中对信号的使用方法类似,
Nuttx系统中对信号量的操作包括以下几种:
- sem_init
- sem_wait
- sem_post
- sem_trywait
- sem_timedwait
- sem_getvalue
sem_destory
上面的方法是对信号量操作的基本方法。Nuttx系统还提供了对”有名”信号量操作的额
外函数:- sem_open
- sem_close
sem_unlink
“有名”信号量在系统中创建了一个inode与之关联,操作相对于“匿名”信号量相对
复杂。本节内容只说明“无名”信号量。
Nuttx内核中Semaphore的数据结构
/* This is the generic semaphore structure. */
struct sem_s
{
volatile int16_t semcount; /* >0 ->Num counts available */
/* <0 ->Num tasks waiting for semaphore */
/* If priority inheritance is enabled, then we have to keep track of which
* tasks hold references to the semaphore.
*/
#ifdef CONFIG_PRIORITY_INHERITANCE
uint8_t flags; /* See PRIOINHERIT_FLAGS_* definitions */
# if CONFIG_SEM_PREALLOCHOLDERS > 0
FAR structsemholder_s *hhead; /* List of holders of semaphore counts */
# else
structsemholder_s holder; /* Single holder */
# endif
#endif
};
为了容易理解在Nuttx系统中对信号的操作,假设没有定义宏
CONFIG_PRIORITY_INHERITANCE 和 CONFIG_SEM_PREALLOCHOLDERS 为 0.
数据结构struct sem_s的第一个变量为semcount, 它有两层含义,当其>0时,表示该
信号量可用数,也就是当有线程调用sem_wait()时无须等待。当该值<0时,表示有多
少线程等待该信号量。当每次调用sem_wait()时,信号量的sem_count减1,当调用
sem_post()时,信号量的sem_count加1.
sem_init
sem_init()函数初始化信号量,设置该信号量的sem_count值为初始值。一般地,将
信号量的初始值初始化为0,表示该信号量目前不可使用。如果用信号量表示初始时
刻可用的资源数,初始化时刻将该信号量的值初始化为>0的数值。
比如,老师有某一个教室门的钥匙2个,那么同时最多可以给两个同学使用,此时,
可以将该信号量的值初始化为2,第一个同学领走一个后剩余一个,第二个同学领走
后剩余0个,第三个同学来领钥匙的时候,钥匙数量为-1,表示有一个同学在等待其
他同学还回钥匙。
sem_wait
在企图占有信号量时,使用sem_wait()来获取信号量,如果信号量可用,即信号量
的sem_count>0,那么该函数将该信号量的sem_count减1,然后立即返回。
if (sem->semcount >