Nuttx操作系统信号量Semaphore

本文详细介绍了Nuttx操作系统中信号量Semaphore的使用,包括sem_init、sem_wait、sem_post等基本操作,并探讨了数据结构struct sem_s的sem_count字段的含义。此外,文章提到了Nuttx内核如何处理线程等待信号量的情况,以及sem_timedwait的超时机制和sem_destroy的功能。文章最后预告了优先级继承在信号量中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 > 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值