www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]編譯器內(nèi)部函數(shù)__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中斷。只有當(dāng)處理器處于特權(quán)模式才可以使用這些內(nèi)部函數(shù),因?yàn)檫@些函數(shù)要改變寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMAS

編譯器內(nèi)部函數(shù)__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中斷。
只有當(dāng)處理器處于特權(quán)模式才可以使用這些內(nèi)部函數(shù),因?yàn)檫@些函數(shù)要改變寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMASK和FAULTMASK寄存器(Cortex-M3、M4等),而這些寄存器只有在特權(quán)模式下才能被訪問。
這些內(nèi)部函數(shù)對(duì)所有架構(gòu)的處理器都有效,無論是ARM狀態(tài)還是Thumb狀態(tài),如下所述:
如果使用的是ARMv6(ARM11)或更新架構(gòu),編譯器會(huì)將這些函數(shù)用CPS指令代替。
如果使用的是ARMv4或者ARMv5架構(gòu)并且處于ARM狀態(tài),編譯器會(huì)將這些函數(shù)用MRS和MSR指令代替。一般情況下ARM7屬于ARMv4架構(gòu),ARM9屬于ARMv5架構(gòu)。
如果使用的是ARMv4或者ARMv5架構(gòu)并且處于Thumb狀態(tài)或編譯器使能-compatible參數(shù),則編譯器會(huì)調(diào)用一個(gè)輔助函數(shù)比如__ARM_disable_irq來控制中斷。

1. __enable_fiq

使能FIQ中斷。
通常是通過清除寄存器CPSR中的F位來實(shí)現(xiàn)的。注意FIQ中斷一般只存在于ARMv4和ARMv5架構(gòu)中(即ARM7和ARM9),ARMv6架構(gòu)的處理器不支持此函數(shù)。對(duì)于ARMv7架構(gòu)的處理器(Cortex-M3),這個(gè)函數(shù)清除FAULTMASK寄存器的值。
語法:void __enable_fiq(void)
限制:只能在特權(quán)級(jí)別下使用,用戶模式下無效。

2.__disable_fiq

禁用FIQ中斷。
通常是通過置一CPSR的F位來實(shí)現(xiàn)的。注意FIQ中斷一般只存在于ARMv4和ARMv5架構(gòu)中(即ARM7和ARM9),ARMv6架構(gòu)的處理器不支持此函數(shù)。對(duì)于ARMv7架構(gòu)的處理器(Cortex-M3),這個(gè)函數(shù)置位FAULTMASK寄存器,這意味著此后只有NMI可以響應(yīng),所有其它的異常,包括中斷和 Fault都不能響應(yīng)。
語法:__disable_fiq有兩個(gè)版本,一個(gè)是返回值為空的void __disable_fiq(void),另一個(gè)返回值為整形值的int __disable_fiq(void),函數(shù)名都是__disable_fiq。
用法:int __disable_fiq(void),禁止FIQ中斷(ARMv4和ARMv5)或禁用除NMI之外的所有中斷(ARMv7)。在禁用中斷前,將中斷使能狀態(tài)返回。
void __disable_fiq(void),禁用FIQ中斷(ARMv4和ARMv5)或禁用除NMI之外的所有中斷(ARMv7)。
限制:只能在特權(quán)級(jí)別下使用,用戶模式下無效。如果編譯器參數(shù)設(shè)置為-cpu=7,則不支持int __disable_fiq(void)函數(shù),這是因?yàn)橥ㄓ肁RMv7架構(gòu)和ARMv7 R及ARMv7 M-profiles架構(gòu)的異常處理模式不同所導(dǎo)致的。這意味著如果編譯器參數(shù)設(shè)置為-cpu=7,編譯器不能為int __disable_fiq(void)函數(shù)產(chǎn)生所有ARMv7架構(gòu)通用的指令序列,此時(shí)只能使用void __disable_fiq(void)。
舉例:

voidfunc(void)

{

intwas_masked=__disable_fiq();

/*其它處理*/

if(!was_masked)

__enable_fiq();

}

為什么例子中要使用變量was_masked獲取之前的中斷使能信息,并且在使能中斷時(shí)還要先判斷這個(gè)變量?直接使用__disable_fiq()和__enable_fiq()函數(shù)不是更簡(jiǎn)單嗎?
這是因?yàn)槿绻跋到y(tǒng)的中斷已經(jīng)是關(guān)閉的,當(dāng)你直接使用__enable_fiq()函數(shù)就會(huì)無條件打開中斷,這樣可能是很危險(xiǎn)的。所以在打開中斷前,要檢查之前中斷是不是已經(jīng)是禁止?fàn)顟B(tài),如果是的話就不要使能中斷。

3.__enable_irq

使能IRQ中斷。
對(duì)于ARMv4和ARMv5架構(gòu)(ARM7和ARM9),編譯器插入下列指令清除CPSR寄存器的I位。

MRSr0,CPSR

ANDr0,r0,#0x7F

MSRCPSR_c,r0

對(duì)于ARMv6(ARM11)和ARMv7(Cortex-M3等)指令,編譯器插入下列指令使能中斷:

CPSIEI

比如Cortex-M3架構(gòu)處理器,該指令清除PRIMASK寄存器,使能中斷。
語法:void __enable_irq(void)
限制:只能在特權(quán)級(jí)別下使用,用戶模式下無效。

4. __disable_irq

禁止IRQ中斷。
對(duì)于ARMv4和ARMv5架構(gòu)(ARM7和ARM9),編譯器插入下列指令置位CPSR寄存器的I位。

MRSr0,CPSR

ORRr0,r0,#0x80

MSRCPSR_c,r0

對(duì)于ARMv6(ARM11)和ARMv7(Cortex-M3等)指令,編譯器插入下列指令禁用中斷:

CPSIDI

比如Cortex-M3架構(gòu)處理器,該指令置位PRIMASK寄存器,表示禁止中斷和可屏蔽的異常,只剩下NMI和硬Fault可以響應(yīng)。
__disable_irq函數(shù)有兩種形式,返回值為空的void __disable_irq(void)和返回值為整形數(shù)的int __disable_irq(void)。前者直接禁用中斷,后者在禁用中斷前,將中斷使能狀態(tài)返回。
舉例:

voidfunc(void)

{

intwas_masked=__disable_irq();

/*其它處理*/

if(!was_masked)

__enable_irq();

}

為什么例子中要使用變量was_masked獲取之前的中斷使能信息,并且在使能中斷時(shí)還要先判斷這個(gè)變量?直接使用__disable_irq()和__enable_irq()函數(shù)不是更簡(jiǎn)單嗎?
這是因?yàn)槿绻跋到y(tǒng)的中斷已經(jīng)是關(guān)閉的,當(dāng)你直接使用__enable_irq()函數(shù)就會(huì)無條件打開中斷,這樣可能是很危險(xiǎn)的。所以在打開中斷前,要檢查之前中斷是不是已經(jīng)是禁止?fàn)顟B(tài),如果是的話就不要使能中斷。
限制:只能在特權(quán)級(jí)別下使用,用戶模式下無效。如果編譯器參數(shù)設(shè)置為-cpu=7,則不支持int __disable_irq(void)函數(shù),這是因?yàn)橥ㄓ肁RMv7架構(gòu)和ARMv7 R及ARMv7 M-profiles架構(gòu)的異常處理模式不同所導(dǎo)致的。這意味著如果編譯器參數(shù)設(shè)置為-cpu=7,編譯器不能為int __disable_irq(void)函數(shù)產(chǎn)生所有ARMv7架構(gòu)通用的指令序列,此時(shí)只能使用void __disable_irq(void)。

我們?cè)購膮R編層面上看一下返回整形數(shù)的__disable_irq:

intdisable_irq(void)

{

return__disable_irq();

}

在-cpu=Cortex-M3時(shí),Keil MDK編譯器產(chǎn)生的匯編代碼為:

MRSr0,PRIMASK

ANDr0,r0,#1

CPSIDi

BXlr

5.這些函數(shù)有什么用處?

保護(hù)共享資源

禁止中斷嵌套

保護(hù)共享資源很好理解,但禁止中斷嵌套可能很多人不理解:中斷嵌套可以提高系統(tǒng)響應(yīng)時(shí)間,為什么要禁用掉?
雖然中斷嵌套能提高響應(yīng)時(shí)間,但絕大多數(shù)的應(yīng)用并不需要如此高的響應(yīng)時(shí)間;更重要的是,中斷嵌套增加了程序運(yùn)行的不確定性。所以我建議在不需要極致的響應(yīng)時(shí)間使,禁止中斷嵌套。方法也很簡(jiǎn)單,在進(jìn)入中斷服務(wù)函數(shù)后和退出中斷服務(wù)函數(shù)前中調(diào)用本文講的這些中斷控制函數(shù)即可。

6.移植性

與編譯器特性相關(guān),不具備移植性,建議使用前先用宏進(jìn)行封裝。


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

單片機(jī)將是下述內(nèi)容的主要介紹對(duì)象,通過這篇文章,小編希望大家可以對(duì)它的相關(guān)情況以及信息有所認(rèn)識(shí)和了解,詳細(xì)內(nèi)容如下。

關(guān)鍵字: 單片機(jī) 中斷 boot

在C語言編程中,結(jié)構(gòu)體內(nèi)存對(duì)齊是一個(gè)容易被忽視卻影響深遠(yuǎn)的關(guān)鍵問題。它不僅關(guān)乎程序性能,更直接影響到內(nèi)存占用效率,尤其在嵌入式系統(tǒng)等資源受限環(huán)境中顯得尤為重要。本文將深入探討結(jié)構(gòu)體內(nèi)存對(duì)齊的原理,并分享手動(dòng)調(diào)整與編譯器優(yōu)...

關(guān)鍵字: C語言 內(nèi)存對(duì)齊 編譯器

編譯器不僅是連接硬件與軟件的橋梁,還直接影響MCU的性能優(yōu)化與功能安全。面對(duì)汽車行業(yè)對(duì)高可靠性、低功耗和高算力的需求,編譯器需在確保ASIL-D等嚴(yán)格標(biāo)準(zhǔn)的同時(shí),最大化發(fā)揮RISC-V芯片的潛力。

關(guān)鍵字: 車規(guī)MCU RISC-V 編譯器 HighTec

國內(nèi)電子信息產(chǎn)業(yè)內(nèi)的廠商正在全球嵌入式系統(tǒng)的發(fā)展浪潮中扮演著越來越重要的角色,但隨之而來的是國內(nèi)嵌入式系統(tǒng)和相關(guān)芯片企業(yè)在出海時(shí)也面臨越來越多的合規(guī)要求,尤其是在保障用戶、設(shè)備和周邊人與物安全的功能安全領(lǐng)域內(nèi)的合規(guī)要求。...

關(guān)鍵字: 嵌入式系統(tǒng) 智能網(wǎng)聯(lián) 編譯器

【2025年4月11日, 德國慕尼黑訊】全球功率系統(tǒng)和物聯(lián)網(wǎng)領(lǐng)域的半導(dǎo)體領(lǐng)導(dǎo)者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)推出用于AURIX?、TRAVEO?和PSOC?的可擴(kuò)展軟件包產(chǎn)品組合...

關(guān)鍵字: PSOC 物聯(lián)網(wǎng) 編譯器

瑞典烏普薩拉,2025年3月11日 — 全球領(lǐng)先的嵌入式系統(tǒng)開發(fā)軟件解決方案供應(yīng)商IAR在德國紐倫堡舉辦的embedded world 2025展會(huì)上重磅發(fā)布全新云端平臺(tái)。該平臺(tái)為嵌入式軟件開發(fā)人員提供前所未有的自由度與...

關(guān)鍵字: 編譯器 嵌入式 RISC-V

該統(tǒng)一解決方案為Microchip編譯器產(chǎn)品線提供靈活且經(jīng)濟(jì)高效的許可選項(xiàng)

關(guān)鍵字: 編譯器 嵌入式

當(dāng)安全標(biāo)準(zhǔn)相互契合:意法半導(dǎo)體 (ST) Stellar MCU取得了風(fēng)險(xiǎn)管理安全標(biāo)準(zhǔn)等級(jí)最高的ISO 26262 ASIL D 級(jí)認(rèn)證,現(xiàn)在更有達(dá)到同等安全級(jí)別的 HighTec Rust 編譯器的加持

關(guān)鍵字: 微控制器 編譯器

在嵌入式系統(tǒng)的開發(fā)中,中斷機(jī)制扮演著至關(guān)重要的角色。它允許系統(tǒng)在執(zhí)行正常程序流程時(shí),響應(yīng)外部或內(nèi)部事件,從而確保系統(tǒng)能夠及時(shí)響應(yīng)并處理緊急事件。本文將深入探討嵌入式系統(tǒng)中中斷的概念、如何在系統(tǒng)中設(shè)置和處理多個(gè)中斷的優(yōu)先級(jí)...

關(guān)鍵字: 嵌入式系統(tǒng) 中斷

在STM32的開發(fā)過程中,開發(fā)者可能會(huì)遇到各種編譯錯(cuò)誤,其中“Program file does not exist”是一個(gè)較為常見且可能由多種原因引起的錯(cuò)誤。這個(gè)錯(cuò)誤通常意味著編譯器在預(yù)期的路徑下沒有找到可執(zhí)行文件(如...

關(guān)鍵字: STM32 編譯器
關(guān)閉