申请信号量 tx_sg.c

UINT  _tx_semaphore_get(

        TX_SEMAPHORE *semaphore_ptr

        ULONG wait_option);

局部变量:

        

1.如果信号量计数器tx_semaphore_count不为0,就减一,返回申请成功。

2.如果信号量计数器tx_semaphore_count为0,说明资源都被占用,挂起当前线程到suspension list的尾部,后续恢复时按FIFO


流程:

1.禁止中断

2.若count不为0  //还有信号量资源

        (1) count--

        (2) 设置status为success

3.若count为0 //没有信号量资源

        (1) wait_option不为0

                1) 由于获取不到信号量而挂起,所以设置清除函数为信号量相关的函数tx_semaphore_cleanup,当定时器超时或线程中止时,回调这个函数,释放清除和信号量相关数据,比如从tx_semaphore_suspension_list队列移除线程

                2) 挂起线程

                3) suspended count++

                4) 设置state为semaphore susp

                5) 设置suspending flag

                6) 禁止抢占

                7) 设置timer

                8) 恢复中断

                9) 若wait_option不为forever,开启timer

                10) _tx_thread_suspend( )

                11) 返回status

        (2) wait_option为0

                status为no_instance

4.恢复中断

5.返回status

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值