计数信号量的获取与释放
发布日期:2021-07-01 04:26:13
浏览次数:2
分类:技术文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月17日 05时07分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
四线触摸屏原理
2019-04-30
C/C++如何返回一个数组/指针
2019-04-30
腾讯AI语音识别API踩坑记录
2019-04-30
java.net.BindException: 无法指定被请求的地址
2019-05-01
svn服务器安装
2019-05-01
spark 笔记1
2019-05-01
shell dirname basename
2019-05-01
未来已至,5G加持下的云游戏将走向何方?
2019-05-01
计算机网络 —— 网络层 1.
2019-05-01
Android 之 ContentProvider 与 ContentResolver
2019-05-01
【接口自动化】
2019-05-01
推荐一位川大零基础转行 Python 的人生勇士
2019-05-01
Python解惑之:True与False
2019-05-01
你要的微信小程序终于来了
2019-05-01
有了这些 Chrome 插件,效率提升10倍(建议收藏)
2019-05-01
只有1%的程序员搞懂过浮点数陷阱
2019-05-01
一名 Google 工程师的大数据处理经验
2019-05-01
命名难,难于上青天
2019-05-01
没钱没公司,怎么做一款付费产品
2019-05-01