RT thread 信号量操作

信号量控制

在RT-Thread 中,信号量控制块是操作系统用于管理信号量的一个数据结构。

struct rt_semaphore
{
struct rt_ipc_object parent; /**<inherit from ipc_object*/
rt_uint16_t value; /**<value of semaphore.*/
}
  • 定义静态信号量:struct rt_semaphore static_sem
  • 定义动态信号量:rt_sem_t dynamic_sem

1.初始化与脱离

rt_err_t rt_sem_init(rt_sem_t sem, const char *name,rt_uint32_t value,rt_uint8_t flag)
rt_err_t rt_sem_detach(rt_sem_t sem)//释放信号量的API

2.创建与删除

rt_sem_t rt_sem_create(const char *name,rt_uint32_t value, rt_uint8_t flag) 
//flag的选择 1.RT_IPC_FLAG_FIFO 2.RT_IPC_FLAG_PRIO
rt_err_t rt_sem_delete(rt_sem_t sem)

1.RT_IPC_FLAG_FIFO 等待的线程按照先进先出的方式排队
2.RT_IPC_FLAG_PRIO 等待的线程将按照优先级高的线程

3.获取信号量

rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)//RT_WAITING_FOREVER=-1

rt_err_t rt_sem_trytake(rt_sem_t sem)
  • 当信号量大于0时线程将成功获得信号量 获得后成功返回 同时将信号量的值返回
    同时rt_uint16_t value; 的值成功-1
  • 在time 以系统滴答时钟为基础单位 若系统滴答时钟单位为10ms time 设置为5 就50sm后返回
    若time参数为负数 线程则会一直在信号线上等待

rt_err_t rt_sem_trytake(rt_sem_t sem) 函数就是尝试获取信号量
获取不到就会返回 -RT_ETimeout

注意:rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time) 不可再ISR中断中调用
ISR为快进快出 若调用 会永远挂起导致永远得不到反馈

4.释放信号量

rt_err_t rt_sem_release(rt_sem_t sem)

  • 同时rt_uint16_t value; 的值成功 +1
    若有线程被该信号量挂起 则会的到唤醒
  • rt_err_t rt_sem_release(rt_sem_t sem) 可以在ISR中断里 挂起
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值