链接复制成功!
开发指导
使用场景
多任务环境下往往存在多个任务竞争同一临界资源的应用场景,互斥锁可以提供任务间的互斥机制,防止两个任务在同一时刻访问相同的临界资源,从而实现独占式访问。
功能
Huawei LiteOS 的互斥锁模块为用户提供下面几种功能,接口详细信息可以查看API参考。
功能分类 |
接口名 |
描述 |
---|---|---|
创建/删除互斥锁 |
LOS_MuxCreate |
创建互斥锁 |
LOS_MuxDelete |
删除指定互斥锁 |
|
申请/释放互斥锁 |
LOS_MuxPend |
申请指定互斥锁 |
LOS_MuxPost |
释放指定互斥锁 |
申请互斥锁有三种模式:无阻塞模式、永久阻塞模式、定时阻塞模式。
- 无阻塞模式:即任务申请互斥锁时,入参timeout等于0。若当前没有任务持有该互斥锁,或者持有该互斥锁的任务和申请该互斥锁的任务为同一个任务,则申请成功,否则立即返回申请失败。
- 永久阻塞模式:即任务申请互斥锁时,入参timeout等于0xFFFFFFFF。若当前没有任务持有该互斥锁,则申请成功。否则,任务进入阻塞态,系统切换到就绪任务中优先级最高者继续执行。任务进入阻塞态后,直到有其他任务释放该互斥锁,阻塞任务才会重新得以执行。
- 定时阻塞模式:即任务申请互斥锁时,0<timeout<0xFFFFFFFF。若当前没有任务持有该互斥锁,则申请成功。否则该任务进入阻塞态,系统切换到就绪任务中优先级最高者继续执行。任务进入阻塞态后,超时前如果有其他任务释放该互斥锁,则该任务可成功获取互斥锁继续执行,若超时前未获取到该互斥锁,接口将返回超时错误码。
释放互斥锁:
- 如果有任务阻塞于该互斥锁,则唤醒被阻塞任务中优先级最高的,该任务进入就绪态,并进行任务调度。
- 如果没有任务阻塞于该互斥锁,则互斥锁释放成功。
互斥锁错误码
对存在失败可能性的操作返回对应的错误码,以便快速定位错误原因。
序号 |
定义 |
实际数值 |
描述 |
参考解决方案 |
---|---|---|---|---|
1 |
LOS_ERRNO_MUX_NO_MEMORY |
0x02001d00 |
初始化互斥锁模块时,内存不足 |
设置更大的系统动态内存池,配置项为OS_SYS_MEM_SIZE,或减少系统支持的最大互斥锁个数 |
2 |
LOS_ERRNO_MUX_INVALID |
0x02001d01 |
互斥锁不可用 |
传入有效的互斥锁ID |
3 |
LOS_ERRNO_MUX_PTR_NULL |
0x02001d02 |
创建互斥锁时,入参为空指针 |
传入有效指针 |
4 |
LOS_ERRNO_MUX_ALL_BUSY |
0x02001d03 |
创建互斥锁时,系统中已经没有可用的互斥锁 |
增加系统支持的最大互斥锁个数 |
5 |
LOS_ERRNO_MUX_UNAVAILABLE |
0x02001d04 |
申请互斥锁失败,因为锁已经被其他线程持有 |
等待其他线程解锁或者设置等待时间 |
6 |
LOS_ERRNO_MUX_PEND_INTERR |
0x02001d05 |
在中断中使用互斥锁 |
禁止在中断中申请/释放互斥锁 |
7 |
LOS_ERRNO_MUX_PEND_IN_LOCK |
0x02001d06 |
锁任务调度时,不允许以阻塞模式申请互斥锁 |
以非阻塞模式申请互斥锁,或使能任务调度后再阻塞申请互斥锁 |
8 |
LOS_ERRNO_MUX_TIMEOUT |
0x02001d07 |
申请互斥锁超时 |
增加等待时间,或采用一直等待模式 |
9 |
LOS_ERRNO_MUX_OVERFLOW |
0x02001d08 |
暂不使用该错误码 |
- |
10 |
LOS_ERRNO_MUX_PENDED |
0x02001d09 |
删除正在使用的互斥锁锁 |
等待解锁后再删除该互斥锁 |
11 |
LOS_ERRNO_MUX_GET_COUNT_ERR |
0x02001d0a |
暂不使用该错误码 |
- |
12 |
LOS_ERRNO_MUX_REG_ERROR |
0x02001d0b |
暂不使用该错误码 |
- |
13 |
LOS_ERRNO_MUX_PEND_IN_SYSTEM_TASK |
0x02001d0c |
系统任务中获取互斥锁,如idle和软件定时器 |
不在系统任务中申请互斥锁 |
错误码定义见错误码简介。8~15位的所属模块为互斥锁模块,值为0x1d。
开发流程
互斥锁典型场景的开发流程:
- 执行make menuconfig命令,进入Kernel ---> Enable Mutex菜单,完成互斥锁的配置。
配置项
含义
取值范围
默认值
依赖
LOSCFG_BASE_IPC_MUX
互斥锁模块裁剪开关
YES/NO
YES
无
LOSCFG_MUTEX_WAITMODE_PRIO
互斥锁基于任务优先级的等待模式
YES/NO
YES
LOSCFG_BASE_IPC_MUX
LOSCFG_MUTEX_WAITMODE_FIFO
互斥锁基于FIFO的等待模式
YES/NO
NO
LOSCFG_BASE_IPC_MUX
LOSCFG_BASE_IPC_MUX_LIMIT
系统支持的最大互斥锁个数
<65535
1024
LOSCFG_BASE_IPC_MUX
- 创建互斥锁LOS_MuxCreate。
- 申请互斥锁LOS_MuxPend。
- 释放互斥锁LOS_MuxPost。
- 删除互斥锁LOS_MuxDelete。
平台差异性
无。