开发指南
使用场景
自旋锁可以提供任务之间的互斥访问机制,用来防止两个任务在同一时刻访问相同的共享资源。
功能
Huawei LiteOS 的自旋锁模块为用户提供下面几种功能,接口详细信息可以查看API参考。
功能分类 |
接口名 |
描述 |
---|---|---|
初始化自旋锁 |
LOS_SpinInit |
动态初始化自旋锁 |
SPIN_LOCK_INIT |
静态初始化自旋锁 |
|
申请/释放自旋锁 |
LOS_SpinLock |
申请指定的自旋锁,如果无法获取锁,会一直循环等待 |
LOS_SpinTrylock |
尝试申请指定的自旋锁,如果无法获取锁,直接返回失败,而不会一直循环等待 |
|
LOS_SpinUnlock |
释放指定的自旋锁 |
|
申请/释放自旋锁(同时进行关中断保护) |
LOS_SpinLockSave |
关中断后,再申请指定的自旋锁 |
LOS_SpinUnlockRestore |
先释放指定的自旋锁,再恢复中断状态 |
|
获取自旋锁持有状态 |
LOS_SpinHeld |
检查自旋锁是否已经被持有 |
开发流程
自旋锁的开发典型流程:
- 自旋锁依赖于SMP,可以通过make menuconfig配置,配置项的菜单路径为:Kernel ---> Enable Kernel SMP。
配置项
含义
取值范围
默认值
依赖
LOSCFG_KERNEL_SMP
SMP控制开关
YES/NO
YES
硬件支持多核
LOSCFG_KERNEL_SMP_CORE_NUM
多核core数量
与架构相关
2
无
- 创建自旋锁:使用LOS_SpinInit初始化自旋锁,或者使用SPIN_LOCK_INIT初始化静态内存的自旋锁。
- 申请自旋锁:使用接口LOS_SpinLock/LOS_SpinTrylock/LOS_SpinLockSave申请指定的自旋锁,申请成功就继续往后执行锁保护的代码;申请失败在自旋锁申请中忙等,直到申请到自旋锁为止。
- 释放自旋锁:使用LOS_SpinUnlock/LOS_SpinUnlockRestore接口释放自旋锁。锁保护代码执行完毕后,释放对应的自旋锁,以便其他核申请自旋锁。