日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

掃碼添加小助手

加入工程師交流群

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

1.寫在前面

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

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

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

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

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

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

2.__enable_fiq使能FIQ中斷

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

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

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

語法:void __enable_fiq(void)

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

3.__disable_fiq禁用FIQ中斷

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

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

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

語法:__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)。

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

如果編譯器參數(shù)設置為-cpu=7,則不支持int __disable_fiq(void)函數(shù),這是因為通用ARMv7架構和ARMv7 R及ARMv7 M-profiles架構的異常處理模式不同所導致的。

這意味著如果編譯器參數(shù)設置為-cpu=7,編譯器不能為int __disable_fiq(void)函數(shù)產(chǎn)生所有ARMv7架構通用的指令序列,此時只能使用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)是關閉的,當你直接使用__enable_fiq()函數(shù)就會無條件打開中斷,這樣可能是很危險的。所以在打開中斷前,要檢查之前中斷是不是已經(jīng)是禁止狀態(tài),如果是的話就不要使能中斷。

4.__enable_irq使能IRQ中斷

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

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

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

CPSIE I

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

語法:void __enable_irq(void)

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

5. __disable_irq禁止IRQ中斷

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

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

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

CPSID I

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

__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)是關閉的,當你直接使用__enable_irq()函數(shù)就會無條件打開中斷,這樣可能是很危險的。

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

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

如果編譯器參數(shù)設置為-cpu=7,則不支持int __disable_irq(void)函數(shù),這是因為通用ARMv7架構和ARMv7 R及ARMv7 M-profiles架構的異常處理模式不同所導致的。

這意味著如果編譯器參數(shù)設置為-cpu=7,編譯器不能為int __disable_irq(void)函數(shù)產(chǎn)生所有ARMv7架構通用的指令序列.

此時只能使用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ù)有什么用處?

保護共享資源

禁止中斷嵌套

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

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

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

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

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

7.移植性

與編譯器特性相關,不具備移植性,建議使用前先用宏進行封裝。

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

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

    關注

    0

    文章

    17

    瀏覽量

    11604
  • 編譯器
    +關注

    關注

    1

    文章

    1673

    瀏覽量

    51961
  • FIQ
    FIQ
    +關注

    關注

    0

    文章

    9

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用 Keil Studio for Visual Studio Code開發(fā) STM32 設備

    與業(yè)界工具的無縫集成、版本控制支持,以及用于 CI 工作流的命令行接口(CLI)。 Keil Studio 作為 Arm Keil MDK 6的一部分,為基于 CortexM 的微
    的頭像 發(fā)表于 03-05 17:41 ?4322次閱讀
    使用 <b class='flag-5'>Keil</b> Studio for Visual Studio Code開發(fā) STM32 設備

    C編譯器錯誤與解決方法

    C語言keil編譯器提示錯誤的解決方法,可以幫你解決程序編譯中的煩惱!! C編譯器錯誤與解決方法 1. Warning 280:’i’:unreferenced local var
    發(fā)表于 01-22 08:03

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

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

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

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

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

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

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

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

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

    GCC編譯器,怎么才能實現(xiàn)c文件中未被調用的函數(shù),不會被編譯?有什么編譯選項可以設置嗎? 移植代碼,有些函數(shù)沒被調用的
    發(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的中斷過程介紹

    中斷來臨的時候會最先經(jīng)過IRQ寄存IRQ寄存檢測到中斷的時候,會向中央處理嵌套向量
    的頭像 發(fā)表于 09-23 09:45 ?1553次閱讀
    瑞薩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上進行ARM編譯器的代碼優(yōu)化?

    如何在keil μVision 5上進行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

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

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

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

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

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

    使用FX3S遇到了RVCT編譯器的問題。 1、在SDK的release note中有支持RVCT的描述, 但是在EZ USB Suite的設置中沒有找到RVCT的選項, 請問支持的具體版本
    發(fā)表于 05-08 07:49
    鸡西市| 历史| 涞水县| 奈曼旗| 上饶县| 台北县| 岳阳县| 绿春县| 大连市| 望奎县| 侯马市| 屯留县| 遵义县| 石屏县| 梁山县| 灵寿县| 武义县| 武强县| 延津县| 磐安县| 湖北省| 大渡口区| 延庆县| 山阴县| 白山市| 娄烦县| 滨海县| 句容市| 广饶县| 新绛县| 米脂县| 乌兰浩特市| 珠海市| 大悟县| 汉源县| 历史| 康定县| 开江县| 合作市| 阿尔山市| 翁源县|