chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

控制IRQ和FIQ中斷的編譯器內(nèi)部函數(shù) 基于Keil MDK

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-29 16:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文是一篇偏向底層的內(nèi)容。

1.寫在前面

編譯器內(nèi)部函數(shù)__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中斷。

只有當(dāng)處理器處于特權(quán)模式才可以使用這些內(nèi)部函數(shù),因為這些函數(shù)要改變寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMASK和FAULTMASK寄存器(Cortex-M3、M4等),而這些寄存器只有在特權(quán)模式下才能被訪問。

這些內(nèi)部函數(shù)對所有架構(gòu)的處理器都有效,無論是ARM狀態(tài)還是Thumb狀態(tài),如下所述:

如果使用的是ARMv6(ARM11)或更新架構(gòu),編譯器會將這些函數(shù)用CPS指令代替。

如果使用的是ARMv4或者ARMv5架構(gòu)并且處于ARM狀態(tài),編譯器會將這些函數(shù)用MRS和MSR指令代替。一般情況下ARM7屬于ARMv4架構(gòu),ARM9屬于ARMv5架構(gòu)。

如果使用的是ARMv4或者ARMv5架構(gòu)并且處于Thumb狀態(tài)或編譯器使能-compatible參數(shù),則編譯器會調(diào)用一個輔助函數(shù)比如__ARM_disable_irq來控制中斷。

2.__enable_fiq使能FIQ中斷

通常是通過清除寄存器CPSR中的F位來實現(xiàn)的。

注意FIQ中斷一般只存在于ARMv4和ARMv5架構(gòu)中(即ARM7和ARM9),ARMv6架構(gòu)的處理器不支持此函數(shù)。

對于ARMv7架構(gòu)的處理器(Cortex-M3),這個函數(shù)清除FAULTMASK寄存器的值。

語法:void __enable_fiq(void)

限制:只能在特權(quán)級別下使用,用戶模式下無效。

3.__disable_fiq禁用FIQ中斷

通常是通過置一CPSR的F位來實現(xiàn)的。

注意FIQ中斷一般只存在于ARMv4和ARMv5架構(gòu)中(即ARM7和ARM9),ARMv6架構(gòu)的處理器不支持此函數(shù)。

對于ARMv7架構(gòu)的處理器(Cortex-M3),這個函數(shù)置位FAULTMASK寄存器,這意味著此后只有NMI可以響應(yīng),所有其它的異常,包括中斷和 Fault都不能響應(yīng)。

語法:__disable_fiq有兩個版本。

一個是返回值為空的void __disable_fiq(void)

另一個返回值為整形值的int __disable_fiq(void)

用法:int __disable_fiq(void),禁止FIQ中斷(ARMv4和ARMv5)或禁用除NMI之外的所有中斷(ARMv7)。

在禁用中斷前,將中斷使能狀態(tài)返回。

void __disable_fiq(void),禁用FIQ中斷(ARMv4和ARMv5)或禁用除NMI之外的所有中斷(ARMv7)。

限制:只能在特權(quán)級別下使用,用戶模式下無效。

如果編譯器參數(shù)設(shè)置為-cpu=7,則不支持int __disable_fiq(void)函數(shù),這是因為通用ARMv7架構(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)通用的指令序列,此時只能使用void __disable_fiq(void)。

舉例:

void func(void){ int was_masked = __disable_fiq(); /*其它處理*/ if(!was_masked) { __enable_fiq(); }}

為什么例子中要使用變量was_masked獲取之前的中斷使能信息,并且在使能中斷時還要先判斷這個變量?

直接使用__disable_fiq()和__enable_fiq()函數(shù)不是更簡單嗎?

這是因為如果之前系統(tǒng)的中斷已經(jīng)是關(guān)閉的,當(dāng)你直接使用__enable_fiq()函數(shù)就會無條件打開中斷,這樣可能是很危險的。所以在打開中斷前,要檢查之前中斷是不是已經(jīng)是禁止?fàn)顟B(tài),如果是的話就不要使能中斷。

4.__enable_irq使能IRQ中斷

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

MRS r0, CPSRAND r0, r0, #0x7FMSR CPSR_c, r0

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

CPSIE I

比如Cortex-M3架構(gòu)處理器,該指令清除PRIMASK寄存器,使能中斷。

語法:void __enable_irq(void)

限制:只能在特權(quán)級別下使用,用戶模式下無效。

5. __disable_irq禁止IRQ中斷

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

MRS r0, CPSRORR r0, r0, #0x80MSR CPSR_c, r0

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

CPSID I

比如Cortex-M3架構(gòu)處理器,該指令置位PRIMASK寄存器,表示禁止中斷和可屏蔽的異常,只剩下NMI和硬Fault可以響應(yīng)。

__disable_irq函數(shù)有兩種形式,返回值為空的void __disable_irq(void)和返回值為整形數(shù)的int __disable_irq(void)。

前者直接禁用中斷,后者在禁用中斷前,將中斷使能狀態(tài)返回。

舉例:

void func(void){ int was_masked = __disable_irq(); /*其它處理*/ if(!was_masked) { __enable_irq(); }}

為什么例子中要使用變量was_masked獲取之前的中斷使能信息,并且在使能中斷時還要先判斷這個變量?

直接使用__disable_irq()和__enable_irq()函數(shù)不是更簡單嗎?

這是因為如果之前系統(tǒng)的中斷已經(jīng)是關(guān)閉的,當(dāng)你直接使用__enable_irq()函數(shù)就會無條件打開中斷,這樣可能是很危險的。

所以在打開中斷前,要檢查之前中斷是不是已經(jīng)是禁止?fàn)顟B(tài),如果是的話就不要使能中斷。

限制:只能在特權(quán)級別下使用,用戶模式下無效。

如果編譯器參數(shù)設(shè)置為-cpu=7,則不支持int __disable_irq(void)函數(shù),這是因為通用ARMv7架構(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)通用的指令序列.

此時只能使用void __disable_irq(void)。

我們再從匯編層面上看一下返回整形數(shù)的__disable_irq:

int disable_irq(void){ return __disable_irq();}

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

MRS r0, PRIMASKAND r0, r0, #1CPSID iBX lr

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

保護(hù)共享資源

禁止中斷嵌套

保護(hù)共享資源很好理解,但禁止中斷嵌套可能很多人不理解。

中斷嵌套可以提高系統(tǒng)響應(yīng)時間,為什么要禁用掉?

雖然中斷嵌套能提高響應(yīng)時間,但絕大多數(shù)的應(yīng)用并不需要如此高的響應(yīng)時間;

更重要的是,中斷嵌套增加了程序運行的不確定性。所以我建議在不需要極致的響應(yīng)時間使,禁止中斷嵌套。

方法也很簡單,在進(jìn)入中斷服務(wù)函數(shù)后和退出中斷服務(wù)函數(shù)前中調(diào)用本文講的這些中斷控制函數(shù)即可。

7.移植性

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

來源:https://blog.csdn.net/zhzht19861011/article/details/52815488

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • IRQ
    IRQ
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    11420
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51234
  • FIQ
    FIQ
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    2500
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    在ADS編譯器中,用標(biāo)準(zhǔn)的C庫函數(shù)printf()需要哪些設(shè)置呢?

    在ADS編譯器中,用標(biāo)準(zhǔn)的C庫函數(shù)printf()需要哪些設(shè)置呢?又在哪兒可以看到printf()輸出的信息呢?
    發(fā)表于 12-23 07:32

    開源鴻蒙技術(shù)大會2025丨編譯器與編程語言分論壇:語言驅(qū)動系統(tǒng)創(chuàng)新,編譯賦能生態(tài)繁榮

    在萬物智聯(lián)的時代背景下,操作系統(tǒng)底層能力的構(gòu)建離不開編程語言與編譯器的關(guān)鍵支撐。作為開源鴻蒙生態(tài)的核心技術(shù),語言設(shè)計與編譯器、虛擬機(jī)實現(xiàn)的進(jìn)步直接關(guān)系到開發(fā)效率、運行性能與系統(tǒng)安全。本次分論壇聚焦
    的頭像 發(fā)表于 11-20 17:24 ?746次閱讀
    開源鴻蒙技術(shù)大會2025丨<b class='flag-5'>編譯器</b>與編程語言分論壇:語言驅(qū)動系統(tǒng)創(chuàng)新,<b class='flag-5'>編譯</b>賦能生態(tài)繁榮

    請問Keil的優(yōu)化等級到底該如何選擇?

    Keil MDK(Microcontroller Development Kit)中,優(yōu)化等級是編譯器的核心設(shè)置之一,它直接影響生成代碼的大小、執(zhí)行速度和調(diào)試便利性。選擇合適的優(yōu)化等級是平衡性
    發(fā)表于 11-20 07:51

    RVMCU課堂「10」: 手把手教你玩轉(zhuǎn)RVSTAR—處理內(nèi)部中斷

    /application/baremetal/demo_timer/main.c 其中,main函數(shù)調(diào)用的“ECLIC_Register_IRQ函數(shù)就是中斷配置
    發(fā)表于 10-31 06:12

    GCC編譯器,怎么才能實現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯呢?

    GCC編譯器,怎么才能實現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯?有什么編譯選項可以設(shè)置嗎? 移植代碼,有些函數(shù)沒被調(diào)用的
    發(fā)表于 09-28 12:25

    scons --target=mdk5編譯不成功如何解決?

    使用scons —target=mdk5編譯不成功,報錯如下: scons --target=mdk5 scons: Reading SConscript files ... UV4.exe
    發(fā)表于 09-26 07:20

    瑞薩RA系列MCU的中斷過程介紹

    當(dāng)中斷來臨的時候會最先經(jīng)過IRQ寄存IRQ寄存檢測到中斷的時候,會向中央處理嵌套向量
    的頭像 發(fā)表于 09-23 09:45 ?1116次閱讀
    瑞薩RA系列MCU的<b class='flag-5'>中斷</b>過程介紹

    rt_list_for_each_entry編譯失敗怎么解決?

    最新版本的rtthread,做SDIO模式的SD卡,里面包含了blk.C文件,文件里有多個rt_list_for_each_entry,我用的是keil mdk AC6,編譯報錯 全局搜索了一下
    發(fā)表于 09-18 07:14

    請問如何在keil μVision 5上進(jìn)行ARM編譯器的代碼優(yōu)化?

    如何在keil μVision 5上進(jìn)行ARM編譯器的代碼優(yōu)化?
    發(fā)表于 08-20 07:37

    如何在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6?

    Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6!
    發(fā)表于 08-20 06:29

    邊緣設(shè)備AI部署:編譯器如何實現(xiàn)輕量化與高性能?

    電子發(fā)燒友網(wǎng)綜合報道 AI編譯器是專門為人工智能(AI)和機(jī)器學(xué)習(xí)(ML)模型設(shè)計的編譯器,其核心目標(biāo)是將高級的AI模型描述(如計算圖、神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu))轉(zhuǎn)換為特定硬件平臺(如CPU、GPU、FPGA
    的頭像 發(fā)表于 07-06 05:49 ?6392次閱讀

    兆松科技ZCC編譯器全面支持芯來科技NA系列處理

    近日,兆松科技(武漢)有限公司(以下簡稱“兆松科技”)宣布正式發(fā)布高性能RISC-V編譯器ZCC 4.0.0版本。
    的頭像 發(fā)表于 06-11 09:56 ?1418次閱讀

    RVCT編譯器是否比GNU的編譯器的代碼執(zhí)行速度更快?

    使用FX3S遇到了RVCT編譯器的問題。 1、在SDK的release note中有支持RVCT的描述, 但是在EZ USB Suite的設(shè)置中沒有找到RVCT的選項, 請問支持的具體版本
    發(fā)表于 05-08 07:49

    使用STM32CubeMX生成FreeRTOS的MDK工程,選擇AC6編譯器有很多錯誤,為什么?

    使用STM32CubeMX生成FreeRTOS的MDK工程,選擇AC5編譯器可以編譯成功,選擇AC6編譯器有很多錯誤,是STM32CubeMX生成FreeRTOS的
    發(fā)表于 03-11 06:32

    串口中斷內(nèi)部中斷還是外部中斷,串口中斷是怎么觸發(fā)的

    串口中斷通常被視為外部中斷。雖然串口控制器(如USART、UART等)可能集成在微控制器或處理內(nèi)部
    的頭像 發(fā)表于 01-29 15:03 ?2842次閱讀