type
status
password
date
slug
summary
category
URL
tags
icon
1. 计数信号量的原理与创建
1.1 概述
信号量简而言之就是一个带事件控制块的计数器,在其上定义了三个操作,
- 可以用一个非负数初始化
- wait操作:若计数值为0,则执行操作的任务进入等待状态;否则将计数值减1。
多次等待操作,才将任务加入等待队列
- notify操作:查看事件控制块上是否有任务等待,如果有,则唤醒等待队列中的首个任务;如果没有,则将计数值加1
1.2 设计原理
计数信号量由计数器 + 事件控制块构成。其中,1、计数器负责计数控制;2、事件控制块用于控制任务的等待与唤醒
1.3 设计实现
1.3.1 定义信号量
说明:关于maxCount
maxCount用于设置资源数量或事件发生次数的上限,如果将maxCount设置为0,表示不限制count的数量
1.3.2 添加tSemInit函数
为初始化计数信号量,首先新增事件控制块类型用于初始化计数信号量类型中的事件控制块
2. 计数信号量的获取与释放
2.1 设计原理
2.1.1 信号量的获取
2.1.2 信号量的释放
2.2 设计实现
2.2.1 添加tSemWait函数
说明:任务再次被调度运行时有2种情况,
- 有任务释放信号量,被当前任务获取
- 等待信号量超时(此时调用tSemWait函数的waitTicks参数必须大于0)
补充:这里其实有一个隐含前提,就是tTaskSched调用成功进行了任务切换,但是如果此时由于某些原因(e.g. 调度锁被上锁)调度失败,则会立即运行到return语句,但该任务已被加入信号量的等待队列
当然,这些更复杂的情况就不是本门课程能解决的问题了,需要研究一款实际的RTOS
2.2.2 添加tSemNoWaitGet函数
信号量的无等待获取
2.2.3 添加tSemNotify函数
说明:RTOS实时性的体现
当被唤醒的任务优先级高于当前任务时,就触发调度,运行优先级更高的任务。从计算机性能的角度分析,RTOS优先考虑响应时间而非吞吐量
应用
3. 计数信号量的删除与状态查询
3.1 信号量删除原理
由于目前没有涉及内存管理的相关操作,所以删除信号量的删除就是将等待队列中的所有任务移除,并将计数器清零
3.2 设计实现
3.2.1 添加tSemDestroy函数
说明:注意销毁信号量时传递的等待结果为tErrorDel,可以据此判断tSemWait函数的返回值,以确定任务被唤醒的原因(e.g. 资源就绪 / 延时超时 / 信号量被删除),而不是任务被唤醒后立即进行相关资源的操作
3.2.2 添加tSemGetInfo函数
为了获取信号量的状态,首先定义用于保存信号量信息的结构