UCOS学习笔记——信号量

信号量

信号量的基本概念

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问。
信号量是一个“锁定机构”, 代码需要获得钥匙才可以访问共享资源。 占用该资源的任务不再使用该资源并释放资源时, 其它任务才能够访问这个资源 。
抽象的来讲信号量是一个非负整数,所有获取它的任务都会将该整数减一其值的含义分两种情况:
0:表示没有积累下来的释放信号量操作,且有可能有在此信号量上阻塞的任务。
正值:表示有一个或多个释放信号量操作。

信号量的类型

通常有两种类型的信号量:二值信号量和多值信号量。二值信号量的值只能是 0 或 1.多值信号量计数值可以是 0 到 4294967295(依赖于计数值是 8 位, 16 位或 32 位)。特别的, uC/OS-III 中的信号量计数值最大为 OS_SEM_CTR(见 OS_TYPE.H)。根据信号量计数值,uC/OS-III 可以知道有该信号量可以再被多少个任务获得。

二值信号量

二值信号量既可以用于临界资源访问也可以用于同步功能
用作同步时,信号量在创建后应被置为空,任务1获取信号量而进入阻塞,任务2在某种条件发生后,释放信号量,于是任务1获得信号量得以进入就绪态,如果任务1的优先级是最高的,那么就会立即切换任务,从而达到了两个任务间的同步。同样的,在中断服务函数中释放信号量,任务1也会得到信号量,从而达到任务与中断间的同步。

计数信号量

常将计数信号量用于事件计数与资源管理。每当某个事件发生时,任务或者中断将释放一个信号量(信号量计数值加1),当处理被事件时(一般在任务中处理),处理任务会取走该信号量(信号量计数值减1),信号量的计数值则表示还有多少个事件没被处理。
注意:只有任务才允许使用信号量,ISR是不允许的。

信号量应用场景及运作机制

应用场景

同步:任务与任务、中断与任务间同步
计数:用于资源统计,比如当前任务来了很多个消息,但是这些消息都放在缓冲区中,尚未处理,这时候就可以利用计数信号量对这些资源进行统计,每来一个消息就加一,每处理完一个消息就减一,这样子系统就知道有多少资源未处理的

运行机制

二值信号量运行机制:在这里插入图片描述
计数信号量运行机制:在这里插入图片描述

与信号量相关的API函数

当信号量被用于共享资源时,信号量相关函数只能被任务调用(绝不能被 ISR 调用)。但将信号量用于标记任务时可以被 ISR 调用
在这里插入图片描述
简单介绍:
OSSemCreate()创建一个信号量,将信号量地址传递给函数的第一个参数。信号量必须在创建后才能被其他任务使用

用OSSemPend()函数等待一个信号量。 任务必须指定所等待的信号量,且这个信号量之前已经被创建 。据信号量的创建结果 OSSemPend()返回一个错误代号。如果信号量创建成功, 错误代号为 OS_ERR_NONE。 如果创建失败,错误代号会包含错误的原因。 当 OSSemPend()正确返回时,任务就可以访问这个共享资源。

资源访问结束后, 任务调用 OSSemPost()释放这个信号量。 当信号量有效的时候,任务才能获取信号量,当任务获取了某个信号量的时候,该信号量的可用个数就减下,当它减到0的时候,任务就无法再获取了,并且获取的任务会进入阻塞态

发布了37 篇原创文章 · 获赞 92 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44895651/article/details/103644250