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