女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]一、自旋鎖自旋鎖是專為防止多處理器并發(fā)而引入的一種鎖,它在內(nèi)核中大量應用于中斷處理等部分(對于單處理器來說,防止中斷處理中的并發(fā)可簡單采用關(guān)閉中斷的方式,即在標志

一、自旋鎖

自旋鎖是專為防止多處理器并發(fā)而引入的一種鎖,它在內(nèi)核中大量應用于中斷處理等部分(對于單處理器來說,防止中斷處理中的并發(fā)可簡單采用關(guān)閉中斷的方式,即在標志寄存器中關(guān)閉/打開中斷標志位,不需要自旋鎖)。

自旋就是自己連續(xù)的循環(huán)等待。如果你有抱著你的愛人旋轉(zhuǎn)的經(jīng)歷,那么你應該知道一件事情,為了安全,你不能旋轉(zhuǎn)太久,你的愛人如果頭昏,也想你早日釋放。是的,自旋的缺點,就是它頻繁的循環(huán)直到等待鎖的釋放,將它用于可以快速完成的代碼中才好。

自旋不能搶占,但能中斷。

相關(guān)話題:SMP和cpu。多個cpu和單個cpu。很多書說自旋鎖只能在多處理機中使用,這是不正確的。

首先定義

Spinlock_t lock;

對不起,我只能找到arm平臺的鎖了

/*

* ARMv6 Spin-locking.

*

* We (exclusively) read the old value, and decrement it. If it

* hits zero, we may have won the lock, so we try (exclusively)

* storing it.

*

* Unlocked value: 0

* Locked value: 1

*/

typedef struct {

volatile unsigned int lock;

#ifdef CONFIG_PREEMPT

unsigned int break_lock;

#endif

} spinlock_t;

#define SPINLOCK_MAGIC 0x1D244B3C

typedef struct {

unsigned long magic;

volatile unsigned long lock;

volatile unsigned int babble;

const char *module; // 所屬模塊

char *owner;

int oline;

} spinlock_t;

Lock為0時可以用,1是等待。0像鎖孔,當沒有鑰匙插進去時,它才可以插進去

怎么初始化呢?

#define spin_lock_init(x)

do {

(x)->magic = SPINLOCK_MAGIC;

(x)->lock = 0; ;0初始化,表示可用

(x)->babble = 5;

(x)->module = __FILE__;

(x)->owner = NULL;

(x)->oline = 0;

} while (0)

定義一個自旋鎖的方法很有意思,Spinlock_t lock=?????

可以通過spin_lock

Spin_lock_irqsave 來調(diào)用自旋鎖,后者不允許中斷。前者有可能在上鎖中發(fā)生中斷。

還有spin_trylock 這是一個絕不妥協(xié)的函數(shù),它不等待。

恢復為spin_unlock

Spin_unlock_irqrestore

考查下面代碼

#define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags)

#define _spin_lock_irqsave(lock, flags)

do {

local_irq_save(flags); 保存中斷請求標志

preempt_disable(); 不允許搶占

_raw_spin_lock(lock);

__acquire(lock);

} while (0)

二、自旋鎖綜合使用

下面是一個使用的例子,你可以使用source insight查到它

/* never called when PTRS_PER_PMD > 1 */

void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)

{

unsigned long flags; /* can be called from interrupt context */

spin_lock_irqsave(&pgd_lock, flags); 枷鎖

pgd_list_del(pgd);

spin_unlock_irqrestore(&pgd_lock, flags); 釋放

}

中斷枷鎖

#define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags)

分析

unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)

{

unsigned long flags;

local_irq_save(flags); 將寄存器存入flags,并關(guān)中斷

preempt_disable(); 搶占鎖

_raw_spin_lock_flags(lock, flags); 枷鎖

return flags;

}

EXPORT_SYMBOL(_spin_lock_irqsave);

/* For spinlocks etc */

#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")

將標志寄存器的內(nèi)容放在內(nèi)存x中。請查看gcc匯編

static inline void _raw_spin_lock_flags (spinlock_t *lock, unsigned long flags)

{

#ifdef CONFIG_DEBUG_SPINLOCK

if (unlikely(lock->magic != SPINLOCK_MAGIC)) {

printk("eip: %p ", __builtin_return_address(0));

BUG();

}

#endif

__asm__ __volatile__(

spin_lock_string_flags

:"=m" (lock->slock) : "r" (flags) : "memory");

}

#define spin_lock_string_flags

" 1: "

"lock ; decb %0 " ;lock總線鎖住,原子操作

"jns 4f "

"2: "

"testl $0x200, %1 "

"jz 3f "

"sti "

"3: "

"rep;nop "

"cmpb $0, %0 "

"jle 3b "

"cli "

"jmp 1b "

"4: "

理解一下大概意思,就可以了。當lock-1后大于等于0就可以關(guān)中斷繼續(xù)執(zhí)行了,否則nop空操作。Nop期間,cpu可以執(zhí)行其他任務的代碼。

解鎖

#define spin_unlock_irqrestore(lock, flags) _spin_unlock_irqrestore(lock, flags)

void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)

{

_raw_spin_unlock(lock);

local_irq_restore(flags);

preempt_enable();

}

static inline void _raw_spin_unlock(spinlock_t *lock)

{

#ifdef CONFIG_DEBUG_SPINLOCK

BUG_ON(lock->magic != SPINLOCK_MAGIC);

[!--empirenews.page--]

BUG_ON(!spin_is_locked(lock));

#endif

__asm__ __volatile__(

spin_unlock_string

);

}

Raw赤裸的解鎖,表示最低沉的解鎖原理。

#define spin_unlock_string

"xchgb %b0, %1"

:"=q" (oldval), "=m" (lock->slock)

:"0" (oldval) : "memory"

加1.解鎖

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉