计数信号量的获取与释放
发布日期:2021-07-01 04:26:13
浏览次数:3
分类:技术文章
本文共 3129 字,大约阅读时间需要 10 分钟。
文章目录
1 计数信号量的获取与释放
1.1 设计实现
信号量的wait:
信号量的notify: 信号量的无等待获取:/************************************************************************************************************ Function name : tSemWait** Descriptions : 等待信号量** parameters : sem 等待的信号量** parameters : waitTicks 当信号量计数为0时,等待的ticks数,为0时表示永远等待** Returned value : 等待结果,tErrorResourceUnavaliable.tErrorNoError,tErrorTimeout***********************************************************************************************************/uint32_t tSemWait (tSem * sem, uint32_t waitTicks){ uint32_t status = tTaskEnterCritical(); // 首先检查信号量计数是否大于0 if (sem->count > 0) { // 如果大于0的话,消耗掉一个,然后正常退出 --sem->count; tTaskExitCritical(status); return tErrorNoError; } else { // 然后将任务插入事件队列中 tEventWait(&sem->event, currentTask, (void *)0, tEventTypeSem, waitTicks); tTaskExitCritical(status); // 最后再执行一次事件调度,以便于切换到其它任务 tTaskSched(); // 当由于等待超时或者计数可用时,执行会返回到这里,然后取出等待结构 return currentTask->waitEventResult; }}/************************************************************************************************************ Function name : tSemNoWaitGet** Descriptions : 获取信号量,如果信号量计数不可用,则立即退回** parameters : sem 等待的信号量** Returned value : 获取结果, tErrorResourceUnavaliable.tErrorNoError,tErrorTimeout***********************************************************************************************************/uint32_t tSemNoWaitGet (tSem * sem){ uint32_t status = tTaskEnterCritical(); // 首先检查信号量计数是否大于0 if (sem->count > 0) { // 如果大于0的话,消耗掉一个,然后正常退出 --sem->count; tTaskExitCritical(status); return tErrorNoError; } else { // 否则,返回资源不可用 tTaskExitCritical(status); return tErrorResourceUnavaliable; } }/************************************************************************************************************ Function name : tSemNotify** Descriptions : 通知信号量可用,唤醒等待队列中的一个任务,或者将计数+1** parameters : sem 操作的信号量** Returned value : 无***********************************************************************************************************/void tSemNotify (tSem * sem){ uint32_t status = tTaskEnterCritical(); // 检查是否有任务等待 if (tEventWaitCount(&sem->event) > 0) { // 如果有的话,则直接唤醒位于队列首部(最先等待)的任务 tTask * task = tEventWakeUp(&sem->event, (void *)0, tErrorNoError ); // 如果这个任务的优先级更高,就执行调度,切换过去 if (task->prio < currentTask->prio) { tTaskSched(); } } else { // 如果没有任务等待的话,增加计数 ++sem->count; // 如果这个计数超过了最大允许的计数,则递减 if ((sem->maxCount != 0) && (sem->count > sem->maxCount)) { sem->count = sem->maxCount; } } tTaskExitCritical(status);}
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/105066246 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月22日 08时32分21秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01
当博士进入币圈会怎么样
2019-05-01
《增长黑客》(肖恩·艾利斯)学习笔记——第二部分 实战
2019-05-01
python使用HTMLTestRunner查看运行函数
2019-05-01
python的ImportError
2019-05-01
linux下安装jenkins+git+python
2019-05-01
解决uiautomatorviewer中添加xpath的方法
2019-05-01
性能测试的必要性评估以及评估方法
2019-05-01
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
使用redis实现订阅功能
2019-05-01
对称加密整个过程
2019-05-01
java内存模型
2019-05-01
volatile关键字
2019-05-01