你知道底层自旋锁是怎样实现的吗
我们在开发中,常常会用到自旋锁,对于使用接口来讲。仿照样例谁都会用,可是你知道其是怎样实现自旋的吗?今天我们就来讨论一下事实上现原理。
1、首先,我们须要实现一个结构体用于自旋锁的使用
typedef struct spinlock{
volatile unsigned int slock;
}spinlock_t;
接下来我们就要定义接口了;
2、接口实现
(1)初始化接口
#define spin_lock_init(lock) \
do{ \
((spinlock_t *)lock)->slock = 0x0; \ /*相当于赋初值*/
}while(0)
(2)上锁接口
static inline void spin_lock(spinlock_t *lock)
{
raw_spin_lock(&lock->slock);
}
(3)释放锁
static inline spin_unlock(spinlock_t *lock)
{
raw_spin_unlock(&lock->slock);
}
3、更底层汇编实现
大家能够看到上边上锁和解锁都调用了另外两个函数。这两个函数才是自旋锁的精华所在,下边我们来详细讨论一下
raw_spin_lock:
mov r1,#1 @1-->r1
DSB
take_again:
LDREX r2,[r0] @把r0的内容赋给r2,同一时候置全局标志exclusive
STREX r3,r1,[r0] @尝试将r1写入到锁里边,首先检查exclusive是否存在,假设存在则将r1-->r0,r3 = 0。并清除exclusive标志。否则1--->r3,结束
TEQ r3,#0
BNE take_again
TEQ r2,#0
BNE take_again
MOV pc,lr @返回
raw_spin_unlock:
DSB
MOV r1,#0
STR r1,[r0,#0] @为0。标示锁已释放
DSB
MOV pc,lr
经过这两段代码,是不是对自旋锁的实现更加清晰明了了?
4、假设想在自旋锁的同一时候锁中断和开中断怎么办呢?仅仅须要在获取锁和释放锁接口里加上类似于local_irq_save和local_irq_restore之类的中断控制函数就可以
相关文章
- 你知道CSS实现水平垂直居中的第10种方式吗?
- java实现邮件发送准备工作(前期配置)
- Java实现 LeetCode 710 黑名单中的随机数(黑白名单)
- Java实现洛谷 P1062 数列
- java实现最近距离
- java实现第四届蓝桥杯好好学习
- java实现第四届蓝桥杯猜年龄
- java实现第六届蓝桥杯垒骰子
- Java实现第九届蓝桥杯耐摔指数
- Java实现荷兰国旗问题
- 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索
- ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播
- java quasar协程实现第三方库官方文档地址
- 不知道宽度和高是多少,实现水平垂直居中(css)
- Algorithm:C++语言实现之贪心法算法相关问题
- ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测
- BP神经网络对水质问题进行预测(Matlab代码实现)
- 基于聚类线性回归的新型预测方法(Python代码实现)
- PostgreSQL的学习心得和知识总结(八十九)|深入理解PostgreSQL数据库开源MPP扩展Citus再平衡函数rebalance_table_shards的实现原理
- 车间调度|基于遗传算法的柔性车间调度(Matlab代码实现)
- xlnet+bilstm实现菜品正负评价分类