spinlock
spinlock 提供自旋锁功能,用于多线程环境下临界区的互斥保护,支持忙等待加锁、中断安全加锁及软中断禁用加锁等多种模式。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| osal_spin_lock_init | 初始化自旋锁 |
| osal_spin_lock | 获取自旋锁 |
| osal_spin_lock_bh | 禁用软中断并获取自旋锁 |
| osal_spin_trylock | 尝试获取自旋锁 |
| osal_spin_trylock_irq | 尝试获取自旋锁并禁用CPU中断 |
| osal_spin_trylock_irqsave | 保存中断状态并尝试获取自旋锁 |
| osal_spin_unlock | 释放自旋锁 |
| osal_spin_unlock_bh | 释放自旋锁并恢复软中断 |
| osal_spin_lock_irqsave | 保存中断状态并获取自旋锁 |
| osal_spin_unlock_irqrestore | 释放自旋锁并恢复中断状态 |
| osal_spin_lock_destroy | 销毁自旋锁 |
Functions
osal_spin_lock_init
头文件清单
功能说明
- 初始化自旋锁,分配底层锁资源并完成初始化
- 调用成功后,自旋锁处于可用状态,可供后续加锁/解锁操作使用
- 必须与 osal_spin_lock_destroy 配对使用,否则会导致内存泄漏
前置条件
- 调用时序约束:当前接口必须在模块初始化阶段调用,先于任何加锁/解锁操作
- 上下文限制:支持 Linux、LiteOS 系统
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| lock | osal_spinlock * | 待初始化的自旋锁指针,由调用方分配内存,函数填充底层锁资源 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 初始化成功 | 参数合法,内存分配成功 |
| OSAL_FAILURE(-1) | 初始化失败 | 参数无效或内存分配失败 |
osal_spin_lock
头文件清单
功能说明
- 获取自旋锁,若锁已被其他线程持有,则当前线程忙等待直到成功获取
- 同一任务中不可对同一自旋锁多次加锁,否则会导致死锁
- 若自旋锁将在任务和中断中同时使用,应使用 osal_spin_lock_irqsave 替代本接口
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
- 上下文限制:支持 Linux、LiteOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待获取的自旋锁指针 | 非NULL,且lock->lock已初始化 |
osal_spin_lock_bh
头文件清单
功能说明
- 禁用软中断并获取自旋锁,在 Linux 上禁用软中断后加锁,在 LiteOS 和 FreeRTOS 上禁用调度
- 用于保护与软中断上下文共享的数据,防止软中断打断临界区
- 与 osal_spin_unlock_bh 配对使用
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
- 上下文限制:支持 Linux、LiteOS、FreeRTOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待获取的自旋锁指针 | 非NULL,且lock->lock已初始化 |
osal_spin_trylock
头文件清单
功能说明
- 尝试获取自旋锁,若锁空闲则立即获取成功,若锁已被持有则立即返回失败
- 不会忙等待,适用于不希望阻塞等待的场景
- 获取成功后须调用 osal_spin_unlock 释放
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
- 上下文限制:支持 Linux、LiteOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待尝试获取的自旋锁指针 | 非NULL,且lock->lock已初始化 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 1 (TRUE) | 获取锁成功 | 锁空闲,立即获取成功 |
| 0 (FALSE) | 获取锁失败 | 锁已被其他线程持有 |
osal_spin_trylock_irq
头文件清单
功能说明
- 尝试获取自旋锁并禁用CPU中断,若锁空闲则获取成功并禁用中断,若锁已被持有则立即返回失败
- 不会忙等待,适用于需要在中断安全上下文中尝试获取锁的场景
- 获取成功后须配对调用 osal_spin_unlock_irqrestore 释放锁并恢复中断
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
- 上下文限制:仅支持 Linux 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待尝试获取的自旋锁指针 | 非NULL,且lock->lock已初始化 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 1 (TRUE) | 获取锁成功 | 锁空闲,立即获取成功并禁用中断 |
| 0 (FALSE) | 获取锁失败 | 锁已被其他线程持有 |
osal_spin_trylock_irqsave
头文件清单
功能说明
- 保存当前CPU中断状态,尝试获取自旋锁并禁用CPU中断
- 中断状态保存至 flags 参数,后续通过 osal_spin_unlock_irqrestore 恢复
- 与 osal_spin_unlock_irqrestore 配对使用
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
- 上下文限制:仅支持 Linux 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待尝试获取的自旋锁指针 | 非NULL,且lock->lock已初始化 |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| flags | unsigned long * | 保存中断状态的指针,由调用方分配内存,函数填充中断状态 |
osal_spin_unlock
头文件清单
功能说明
- 释放自旋锁,允许其他等待该锁的线程获取
- 与 osal_spin_lock 配对使用
- 释放前须确保当前线程已持有该锁
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功,且当前线程已持有该锁
- 上下文限制:支持 Linux、LiteOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待释放的自旋锁指针 | 非NULL,且lock->lock已初始化 |
osal_spin_unlock_bh
头文件清单
功能说明
- 释放自旋锁并恢复软中断,在 Linux 上释放锁后恢复软中断,在 LiteOS 和 FreeRTOS 上恢复调度
- 与 osal_spin_lock_bh 配对使用
- 释放前须确保当前线程已持有该锁
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功,且当前线程已通过 osal_spin_lock_bh 持有该锁
- 上下文限制:支持 Linux、LiteOS、FreeRTOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待释放的自旋锁指针 | 非NULL,且lock->lock已初始化 |
osal_spin_lock_irqsave
头文件清单
功能说明
- 保存当前CPU中断状态,获取自旋锁并禁用CPU中断
- 中断状态保存至 flags 参数,后续通过 osal_spin_unlock_irqrestore 恢复
- 适用于任务与中断上下文共享数据的场景,确保临界区不被中断打断
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
- 上下文限制:支持 Linux、LiteOS、FreeRTOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待获取的自旋锁指针 | 非NULL,且lock->lock已初始化 |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| flags | unsigned long * | 保存中断状态的指针,由调用方分配内存,函数填充中断状态 |
osal_spin_unlock_irqrestore
头文件清单
功能说明
- 释放自旋锁并恢复CPU中断状态,根据 flags 中保存的中断状态恢复中断使能
- 与 osal_spin_lock_irqsave 配对使用
- 释放前须确保当前线程已持有该锁
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功,且当前线程已通过 osal_spin_lock_irqsave 持有该锁
- 依赖关系:flags 为 osal_spin_lock_irqsave 保存的中断状态
- 上下文限制:支持 Linux、LiteOS、FreeRTOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待释放的自旋锁指针 | 非NULL,且lock->lock已初始化 |
| flags | unsigned long * | 之前保存的中断状态指针 | 非NULL,由osal_spin_lock_irqsave保存 |
osal_spin_lock_destroy
头文件清单
功能说明
- 销毁自旋锁,释放底层锁资源及已分配的内存
- 必须在模块退出时调用,否则会导致内存泄漏
- lock 必须为 osal_spin_lock_init 成功初始化返回的自旋锁
前置条件
- 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功,且锁未被任何线程持有
- 上下文限制:支持 Linux、LiteOS 系统
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| lock | osal_spinlock * | 待销毁的自旋锁指针 | 非NULL,且lock->lock已初始化 |
Structures
osal_spinlock
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| lock | void * | 底层自旋锁实现指针,由 osal_spin_lock_init 分配,由 osal_spin_lock_destroy 释放 |