信号量
开发指导
接口说明
功能分类
|
接口名
|
描述
|
创建/删除信号量
|
LOS_SemCreate
|
创建信号量,返回信号量ID
|
LOS_BinarySemCreate
|
创建二值信号量,其计数值最大为1
|
LOS_SemDelete
|
删除指定的信号量
|
申请/释放信号量
|
LOS_SemPend
|
申请指定的信号量,并设置超时时间
|
LOS_SemPost
|
释放指定的信号量
|
开发流程
- 创建信号量LOS_SemCreate,若要创建二值信号量则调用LOS_BinarySemCreate。
- 申请信号量LOS_SemPend。
- 释放信号量LOS_SemPost。
- 删除信号量LOS_SemDelete。
说明: 由于中断不能被阻塞,因此不能在中断中使用阻塞模式申请信号量。
编程实例
实例描述
本实例实现如下功能:
- 测试任务ExampleSem创建一个信号量,锁任务调度,创建两个任务ExampleSemTask1、ExampleSemTask2, ExampleSemTask2优先级高于ExampleSemTask1,两个任务中申请同一信号量,解锁任务调度后两任务阻塞,测试任务ExampleSem释放信号量。
- ExampleSemTask2得到信号量,被调度,然后任务休眠20Tick,ExampleSemTask2延迟,ExampleSemTask1被唤醒。
- ExampleSemTask1定时阻塞模式申请信号量,等待时间为10Tick,因信号量仍被ExampleSemTask2持有,ExampleSemTask1挂起,10Tick后仍未得到信号量,ExampleSemTask1被唤醒,试图以永久阻塞模式申请信号量,ExampleSemTask1挂起。
- 20Tick后ExampleSemTask2唤醒, 释放信号量后,ExampleSemTask1得到信号量被调度运行,最后释放信号量。
- ExampleSemTask1执行完,40Tick后任务ExampleSem被唤醒,执行删除信号量。
示例代码
示例代码如下:
结果验证
编译运行得到的结果为: