历史上的今天
返回首页

历史上的今天

今天是:2025年01月19日(星期日)

正在发生

2020年01月19日 | ARM命令LDREX和STREX实现spinlock

2020-01-19 来源:eefocus

在 include/asm-arm/spinlock.h 下有這麼一段

#if __LINUX_ARM_ARCH__ < 6
#error SMP not supported on pre-ARMv6 CPUs
#endif

好啦,前提就是:只有 ARM core 版本 >=6 才可以繼續:

all spin lock primitives 到最後都是使用下面這個基本型: 

static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
    unsigned long tmp;

1      __asm__ __volatile__(
2"1:    ldrex    %0, [%1]n"
3"    teq    %0, #0n"
4"    strexeq    %0, %2, [%1]n"
5"    teqeq    %0, #0n"
6"    bne    1b"
7   : "=&r" (tmp)
8  : "r" (&lock->lock), "r" (1)
9 : "cc");

    smp_mb();
}

[指令重點]:

ldrex 指令是 core 6 以後才有的,跟 strex 配成一對指令,可以請 bus 監控從 ldrex 到 strex 之間有無其他的 CPU 或 DMA 來存取這個位址 ,若有的話,strex 會在第一個 register 裡設定值為 1(non-exclusive by this CPU) 並且令 store 動作失敗,若沒有,strex 會在第一個 register 裡設定值為 0(exclusive access by this CPU) 並且令 store 動作成功。

Code Trace Discussion: 

Line 1: __volatile__ 告訴 compiler ,不要對這塊 assembly template 做最佳化動作,因為我們裡面有 loop 讀取 memory 動作,最佳化的結果可能導致 compiler 用一個 register 來 cache 它的值,不會老老實實的去讀 memory... 呵呵,這不是我們想要的動作喔!

Line 2: 把 lock 讀到 tmp,並請 bus monitor 這個 memory

Line 3: 測試 lock 是否為 0,若非 0,表示 lock 已經被別人取得了,則 Line 4,5 都不做了,然後  Line 6 一定 branch,做 spin 的動作。若為 0,表示有機會取得 lock,繼續做 Line 4.5. 

Line 4: 重點來了!,核對 bus monitor 的結果,若是exclusive access 則 tmp 設為 0 並且把 1 儲存到 lock,若是 non-exclusive access(有其他 CPU 來動過) 則 tmp設為 1並且不做儲存 lock 的動作。

Line 5: 測試 tmp

Line 6: 若 tmp 為 0 表示剛剛對 lock 動作是 exclusive,可以離開迴圈,若 tmp 為 1,則做 spin 動作。

Line 7: tmp 用 register 來操作,同時是 input 及 output 令它為 %0

Line 8: &lock->lock 用 register 來操作 ,令它為 %1,值 1 用用 register 來操作 ,令它為 %2

Line 9: 此 template 會改到 condition code,加入 clobber list 以告訴 compiler 有這回事

好了,終於看完了,真的很佩服那些 coding 的 kernel hackers ....

思考問題: ARM v6 以前有個  SWP 指令可以 lock bus and swap memory ,一樣可以用來完成 exclusive access ,但是比起 ldrex,strex 這對指令有什麼缺點呢?

ANS: 用滑鼠反白下幾行

推荐阅读

史海拾趣

Captive Fastener公司的发展小趣事

Captive Fastener公司在电子紧固件领域一直致力于技术创新。某年,公司研发团队成功开发出一种新型的自锁紧固件,这种紧固件能够在高振动环境下保持稳定的连接性能,极大地提高了电子设备的可靠性和耐久性。这一创新产品迅速获得了市场的认可,Captive Fastener公司因此获得了大量订单,实现了业务的快速增长。

DESCO公司的发展小趣事

面对数字化浪潮和智能制造的兴起,DESCO公司积极拥抱变革。公司投入大量资金引进先进的自动化设备和智能化生产线,提高生产效率和产品质量。同时,DESCO还加强了数字化营销和客户服务体系建设,提升了客户体验和市场响应速度。这些举措使公司在激烈的市场竞争中保持了领先地位。

台湾三礼(3L)公司的发展小趣事

1991年,三礼公司正式成立了美国分公司(3LU),此举标志着公司开始进军北美市场,将其作为货物管理中心,并与G-TEP合作组建了3L Global Co.(3LG),共同开拓和发展所有北美业务。这一战略决策为三礼公司打开了新的增长通道,使得公司能够更好地服务全球客户,提升品牌影响力。

Dresden Elektronik公司的发展小趣事

随着公司的发展壮大,Dresden Elektronik公司越来越意识到合作的重要性。他们积极与产业链上下游的企业开展合作,共同推动整个行业的发展。同时,公司也注重与科研机构、高校等的合作,引进先进的技术和人才,为公司的发展注入新的活力。这种合作共赢的理念使公司在激烈的市场竞争中保持了稳健的发展态势。

ACCRETECH公司的发展小趣事

在技术和产品的双重驱动下,Dresden Elektronik公司开始积极拓展市场。他们不仅在国内市场上取得了显著的成绩,还积极开拓国际市场。通过参加国际展会、与跨国企业合作等方式,公司的知名度和影响力逐渐提升,市场份额也不断扩大。

Deutronic Elektronik GmbH公司的发展小趣事

为了进一步提升竞争力,Deutronic Elektronik GmbH开始实施全球化战略。公司在美国和中国设立了子公司,并通过并购等方式加强了在欧洲和亚洲市场的布局。这些举措不仅增强了公司的市场影响力,还为公司带来了更多的资源和优势。通过全球化战略的实施,Deutronic Elektronik GmbH逐渐成为一家具有全球影响力的电子科技企业。

问答坊 | AI 解惑

全国大学生电子设计大赛历年题目

全国大学生电子设计大赛历年题目,里面包含技术达标,元器件,评分规则…

查看全部问答>

求C++简易教程

入门级的C++教程。多一点实例讲解的 大家给推荐一下啊。…

查看全部问答>

人才需求/招聘

任职要求: 1为TD-SCDMA Node B执行RF测试用例 2在板卡级别组织和开发 HW RF测试环境 3 负责HW Node B系统的测试。 4本科以上,硕士优先,主修通信或者相关领域。 5非常了解HW RF的测试(必须要有RF仪器经验 ) 6RF 电路开发背景优先。 7熟 ...…

查看全部问答>

基于FPGA 的DDS 调频信号的研究与实现.pdf

基于FPGA 的DDS 调频信号的研究与实现.pdf…

查看全部问答>

下班回家后,不弄技术,你能做什么?

嗨, 本来想看点电视节目的,关注关注国家大事什么的............... 但是还是习惯看看单片机论坛,查查资料什么的 ............ 我这陋习真难改...........…

查看全部问答>

一道汇编题?

25. 内存地址是0000H,若有4KB的存储空间,其内存的最终地址是(  ). A.400H        B.FFFH         C.4FFH      D.1000H 答案是什么?为什么?请高手 ...…

查看全部问答>

keil3上memory window 无法显示的问题

前两天你在网上下了个700多M的keil3来用!好不容易装好了发现memory window 里没法显示内存数据! 看了半天发现是字体的问题,memory window 的字体默认的是1295711,一般编译框里字体是10或0,但是没办法修改!今天弄了一天都没办法,字体太小, ...…

查看全部问答>

STM32的UART竟然不支持7Bit传输...

STM32 只能设置8,9位的方式。LPC ARM可以支持5,6,7,8位。工控中常用的 9600,E,7,1 就用不了吗?…

查看全部问答>

用团购模拟芯片DIY LCR自平衡电桥【不定期不定时更新】

准备使用 这次的团购的运放 基准源 ADC做一个LCR电桥。 写此帖的目的: 1,正好有活动,能比较低的价格买到芯片,买了芯片之后手痒就做点东西; 2,做东西的时候顺便学些东西; 3,做的过程中肯定会碰到很多问题,希望得到各位大大的帮助; 4 ...…

查看全部问答>