开发指导
使用场景
多任务环境下往往存在多个任务竞争同一临界资源的应用场景,互斥锁可以提供任务间的互斥机制,防止两个任务在同一时刻访问相同的临界资源,从而实现独占式访问。
功能
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。
平台差异性
无。
 
  