计数信号量的获取与释放
发布日期: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秒