跳转至

spinlock

spinlock 提供自旋锁功能,用于多线程环境下临界区的互斥保护,支持忙等待加锁、中断安全加锁及软中断禁用加锁等多种模式。

头文件清单

#include "include/osal/lock/osal_spinlock.h"

接口清单

接口名称 功能简述
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

int osal_spin_lock_init(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 初始化自旋锁,分配底层锁资源并完成初始化
  • 调用成功后,自旋锁处于可用状态,可供后续加锁/解锁操作使用
  • 必须与 osal_spin_lock_destroy 配对使用,否则会导致内存泄漏

前置条件

  • 调用时序约束:当前接口必须在模块初始化阶段调用,先于任何加锁/解锁操作
  • 上下文限制:支持 Linux、LiteOS 系统

出参

名称 数据类型 输出说明
lock osal_spinlock * 待初始化的自旋锁指针,由调用方分配内存,函数填充底层锁资源

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 初始化成功 参数合法,内存分配成功
OSAL_FAILURE(-1) 初始化失败 参数无效或内存分配失败

osal_spin_lock

void osal_spin_lock(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 获取自旋锁,若锁已被其他线程持有,则当前线程忙等待直到成功获取
  • 同一任务中不可对同一自旋锁多次加锁,否则会导致死锁
  • 若自旋锁将在任务和中断中同时使用,应使用 osal_spin_lock_irqsave 替代本接口

前置条件

  • 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
  • 上下文限制:支持 Linux、LiteOS 系统

入参

名称 参数类型 详细说明 约束取值范围
lock osal_spinlock * 待获取的自旋锁指针 非NULL,且lock->lock已初始化

osal_spin_lock_bh

void osal_spin_lock_bh(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 禁用软中断并获取自旋锁,在 Linux 上禁用软中断后加锁,在 LiteOS 和 FreeRTOS 上禁用调度
  • 用于保护与软中断上下文共享的数据,防止软中断打断临界区
  • 与 osal_spin_unlock_bh 配对使用

前置条件

  • 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
  • 上下文限制:支持 Linux、LiteOS、FreeRTOS 系统

入参

名称 参数类型 详细说明 约束取值范围
lock osal_spinlock * 待获取的自旋锁指针 非NULL,且lock->lock已初始化

osal_spin_trylock

int osal_spin_trylock(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 尝试获取自旋锁,若锁空闲则立即获取成功,若锁已被持有则立即返回失败
  • 不会忙等待,适用于不希望阻塞等待的场景
  • 获取成功后须调用 osal_spin_unlock 释放

前置条件

  • 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功
  • 上下文限制:支持 Linux、LiteOS 系统

入参

名称 参数类型 详细说明 约束取值范围
lock osal_spinlock * 待尝试获取的自旋锁指针 非NULL,且lock->lock已初始化

返回值

  • 返回类型:int
返回值 文字含义 触发场景
1 (TRUE) 获取锁成功 锁空闲,立即获取成功
0 (FALSE) 获取锁失败 锁已被其他线程持有

osal_spin_trylock_irq

int osal_spin_trylock_irq(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 尝试获取自旋锁并禁用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

void osal_spin_trylock_irqsave(osal_spinlock *lock, unsigned long *flags)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 保存当前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

void osal_spin_unlock(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 释放自旋锁,允许其他等待该锁的线程获取
  • 与 osal_spin_lock 配对使用
  • 释放前须确保当前线程已持有该锁

前置条件

  • 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功,且当前线程已持有该锁
  • 上下文限制:支持 Linux、LiteOS 系统

入参

名称 参数类型 详细说明 约束取值范围
lock osal_spinlock * 待释放的自旋锁指针 非NULL,且lock->lock已初始化

osal_spin_unlock_bh

void osal_spin_unlock_bh(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 释放自旋锁并恢复软中断,在 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

void osal_spin_lock_irqsave(osal_spinlock *lock, unsigned long *flags)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 保存当前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

void osal_spin_unlock_irqrestore(osal_spinlock *lock, unsigned long *flags)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 释放自旋锁并恢复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

void osal_spin_lock_destroy(osal_spinlock *lock)

头文件清单

#include "include/osal/lock/osal_spinlock.h"

功能说明

  • 销毁自旋锁,释放底层锁资源及已分配的内存
  • 必须在模块退出时调用,否则会导致内存泄漏
  • lock 必须为 osal_spin_lock_init 成功初始化返回的自旋锁

前置条件

  • 调用时序约束:自旋锁已通过 osal_spin_lock_init 初始化成功,且锁未被任何线程持有
  • 上下文限制:支持 Linux、LiteOS 系统

入参

名称 参数类型 详细说明 约束取值范围
lock osal_spinlock * 待销毁的自旋锁指针 非NULL,且lock->lock已初始化

Structures

osal_spinlock

typedef struct {
    void *lock;
} osal_spinlock;

成员说明

成员名称 数据类型 描述
lock void * 底层自旋锁实现指针,由 osal_spin_lock_init 分配,由 osal_spin_lock_destroy 释放

Macros

OSAL_SUCCESS

#define OSAL_SUCCESS 0

OSAL_FAILURE

#define OSAL_FAILURE (-1)