os_spinlock.h 源码
2026/7/20大约 1 分钟源码参考内核自旋锁头文件
os_spinlock.h — 自旋锁接口头文件
源文件路径: kernel/include/os_spinlock.h
引用章节: 4.3.6 自旋锁
完整源码
#ifndef __OS_SPINLOCK_H__
#define __OS_SPINLOCK_H__
#include <oneos_config.h>
#include <os_types.h>
#include <os_util.h>
#ifdef OS_USING_SMP
#include <os_arch_spinlock.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define OS_SPINLOCK_INIT_FLAG (0x5A5AA5A5)
struct os_spinlock
{
#ifdef OS_USING_SMP
arch_spinlock_t arch_lock; /* 架构相关自旋锁实现 */
#endif
#ifdef OS_USING_SPINLOCK_CHECK
int32_t owner_cpu; /* 持有者 CPU 编号 */
uint32_t object_inited; /* 初始化标志 */
void *owner; /* 持有者指针 */
#endif
#if !defined(OS_USING_SMP) && !defined(OS_USING_SPINLOCK_CHECK)
uint8_t padding; /* 非SMP/非调试时占位,避免空结构体 */
#endif
};
typedef struct os_spinlock os_spinlock_t;
/* 静态初始化宏 */
#define OS_DEFINE_SPINLOCK(var) \
os_spinlock_t var = {SPIN_LOCK_INIT SPINLOCK_DEBUG_INIT SPINLOCK_PADDING_INIT}
/* 初始化/加锁/解锁 */
extern void os_spin_lock_init(os_spinlock_t *lock);
extern void os_spin_lock(os_spinlock_t *lock);
extern os_bool_t os_spin_trylock(os_spinlock_t *lock);
extern void os_spin_unlock(os_spinlock_t *lock);
/* IRQ 安全版本 */
extern void os_spin_lock_irqsave(os_spinlock_t *lock, os_ubase_t *irq_save);
extern void os_spin_unlock_irqrestore(os_spinlock_t *lock, os_ubase_t irq_save);
extern void os_spin_lock_irq(os_spinlock_t *lock, os_ubase_t *irq_save);
extern void os_spin_unlock_irq(os_spinlock_t *lock, os_ubase_t irq_save);
extern void os_spin_lock_irq_disable(os_spinlock_t *lock);
extern void os_spin_unlock_irq_enable(os_spinlock_t *lock);
#ifdef __cplusplus
}
#endif
#endif /* __OS_SPINLOCK_H__ */关键说明
| API | 功能 | 适用场景 |
|---|---|---|
os_spin_lock | 基础加锁 | 非中断上下文 |
os_spin_lock_irqsave | 加锁+关中断 | 中断上下文安全,保存/恢复中断状态 |
os_spin_lock_irq_disable | 加锁+关中断 | 中断上下文安全,仅关中断不保存 |
os_spin_trylock | 尝试加锁 | 非阻塞,失败立即返回 |