开发指导
使用场景
在多任务系统中,信号量是一种非常灵活的同步方式,可以运用在多种场合中,实现锁、同步、资源计数等功能,也能方便的用于任务与任务,中断与任务的同步中。信号量常用于协助一组相互竞争的任务访问共享资源。
功能
Huawei LiteOS 的信号量模块为用户提供下面几种功能,接口详细信息可以查看API参考。
功能分类 |
接口名 |
描述 |
---|---|---|
创建/删除信号量 |
LOS_SemCreate |
创建信号量,返回信号量ID |
LOS_BinarySemCreate |
创建二值信号量,其计数值最大为1 |
|
LOS_SemDelete |
删除指定的信号量 |
|
申请/释放信号量 |
LOS_SemPend |
申请指定的信号量,并设置超时时间 |
LOS_SemPost |
释放指定的信号量 |
信号量有三种申请模式:无阻塞模式、永久阻塞模式、定时阻塞模式。
- 无阻塞模式:即任务申请信号量时,入参timeout等于0。若当前信号量计数值不为0,则申请成功,否则立即返回申请失败。
- 永久阻塞模式:即任务申请信号量时,入参timeout等于0xFFFFFFFF。若当前信号量计数值不为0,则申请成功。否则该任务进入阻塞态,系统切换到就绪任务中优先级最高者继续执行。任务进入阻塞态后,直到有其他任务释放该信号量,阻塞任务才会重新得以执行。
- 定时阻塞模式:即任务申请信号量时,0<timeout<0xFFFFFFFF。若当前信号量计数值不为0,则申请成功。否则,该任务进入阻塞态,系统切换到就绪任务中优先级最高者继续执行。任务进入阻塞态后,超时前如果有其他任务释放该信号量,则该任务可成功获取信号量继续执行,若超时前未获取到信号量,接口将返回超时错误码。
信号量错误码
对存在失败可能性的操作返回对应的错误码,以便快速定位错误原因。
序号 |
定义 |
实际数值 |
描述 |
参考解决方案 |
---|---|---|---|---|
1 |
LOS_ERRNO_SEM_NO_MEMORY |
0x02000700 |
初始化信号量时,内存空间不足 |
调整OS_SYS_MEM_SIZE以确保有足够的内存供信号量使用,或减小系统支持的最大信号量数LOSCFG_BASE_IPC_SEM_LIMIT |
2 |
LOS_ERRNO_SEM_INVALID |
0x02000701 |
信号量ID不正确或信号量未创建 |
传入正确的信号量ID或创建信号量后再使用 |
3 |
LOS_ERRNO_SEM_PTR_NULL |
0x02000702 |
传入空指针 |
传入合法指针 |
4 |
LOS_ERRNO_SEM_ALL_BUSY |
0x02000703 |
创建信号量时,系统中已经没有未使用的信号量 |
及时删除无用的信号量或增加系统支持的最大信号量数LOSCFG_BASE_IPC_SEM_LIMIT |
5 |
LOS_ERRNO_SEM_UNAVAILABLE |
0x02000704 |
无阻塞模式下未获取到信号量 |
选择阻塞等待或根据该错误码适当处理 |
6 |
LOS_ERRNO_SEM_PEND_INTERR |
0x02000705 |
中断期间非法调用LOS_SemPend申请信号量 |
中断期间禁止调用LOS_SemPend |
7 |
LOS_ERRNO_SEM_PEND_IN_LOCK |
0x02000706 |
任务被锁,无法获得信号量 |
在任务被锁时,不能调用LOS_SemPend申请信号量 |
8 |
LOS_ERRNO_SEM_TIMEOUT |
0x02000707 |
获取信号量超时 |
将时间设置在合理范围内 |
9 |
LOS_ERRNO_SEM_OVERFLOW |
0x02000708 |
信号量计数值已达到最大值,无法再继续释放该信号量 |
根据该错误码适当处理 |
10 |
LOS_ERRNO_SEM_PENDED |
0x02000709 |
等待信号量的任务队列不为空 |
唤醒所有等待该信号量的任务后,再删除该信号量 |
11 |
LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK |
0x0200070a |
在系统任务中获取信号量,如idle和软件定时器 |
不要在系统任务中获取信号量 |
错误码定义见错误码简介。8~15位的所属模块为信号量模块,值为0x07。
开发流程
信号量的开发典型流程:
- 执行make menuconfig命令,进入Kernel ---> Enable Sem菜单,完成信号量的配置。
配置项
含义
取值范围
默认值
依赖
LOSCFG_BASE_IPC_SEM
信号量模块裁剪开关
YES/NO
YES
无
LOSCFG_BASE_IPC_SEM_LIMIT
系统支持的信号量最大数
[0, 65535]
1024
无
- 创建信号量LOS_SemCreate,若要创建二值信号量则调用LOS_BinarySemCreate。
- 申请信号量LOS_SemPend。
- 释放信号量LOS_SemPost。
- 删除信号量LOS_SemDelete。
平台差异性
无。