SylixOS arm64 自旋锁

SylixOS 下自旋锁结构体,使用union , SLD_uiLock 和 SLD_usSvcNow, SLDQ_usTicket共用空间

SLD_uiLock 代表了 是否上锁, SLD_usTicket 是当前自己编号,每次加锁后这个值会加1.依次递增。 SLDQ_usSvcNow 代表了目前正在锁的编号。  加入此时有四个加锁 SCL_usTicket 每次加锁都会递增加1。 SLDQ_usSvcNow只有释放锁的时候都会递增加1.

每次加锁 都会判断是否已经到了自己编号可以往下走的时候,如果不是调用相应函数,或者进入arm 低功耗模式。

ldaxr  是加载命令,根据arm 手册介绍是加载数据到寄存器,并保证是原子操作,同时加入了内存屏障

psld是在加锁时声明的一个内存变量。 将psld->SLD_uiLock 的值加载到 slVal中。也是是把传进来的自旋锁结构体值赋值给临时变量中的SLD_usSvcNow, SLDQ_usTicket。 add命令是相加,将 sldVal 加上 1 << LW_SPINLOCK_TICKET_SHIFT.

#define LW_SPINLOCK_TICKET_SHIFT    16  根据宏定义是左移16位,根据spinlock 结构体 定义,左移16位是给SLDQ_usTicket加1。 stxr命令又将相加后的值写入到可内存中psld中。这里这几句汇编主要是给SLDQ_usTicket 加1.

stxr命令在写入成功后第一个参数会变为0,失败会变为1.

cbnz  主要是判断写入是否成功,如果失败了,整个过程在从头开始。

解锁操作主要是将SLD_usSvcNow 加1,然后调用dsb内存屏障。调用sev命令,唤醒正处于wfe低功耗模式的核。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值