在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

控制IRQ和FIQ中斷的編譯器內部函數 基于Keil MDK

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-02-29 16:45 ? 次閱讀

本文是一篇偏向底層的內容。

1.寫在前面

編譯器內部函數__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中斷。

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

這些內部函數對所有架構的處理器都有效,無論是ARM狀態還是Thumb狀態,如下所述:

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

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

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

2.__enable_fiq使能FIQ中斷

通常是通過清除寄存器CPSR中的F位來實現的。

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

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

語法:void __enable_fiq(void)

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

3.__disable_fiq禁用FIQ中斷

通常是通過置一CPSR的F位來實現的。

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

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

語法:__disable_fiq有兩個版本。

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

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

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

在禁用中斷前,將中斷使能狀態返回。

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

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

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

這意味著如果編譯器參數設置為-cpu=7,編譯器不能為int __disable_fiq(void)函數產生所有ARMv7架構通用的指令序列,此時只能使用void __disable_fiq(void)。

舉例:

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

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

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

這是因為如果之前系統的中斷已經是關閉的,當你直接使用__enable_fiq()函數就會無條件打開中斷,這樣可能是很危險的。所以在打開中斷前,要檢查之前中斷是不是已經是禁止狀態,如果是的話就不要使能中斷。

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函數有兩種形式,返回值為空的void __disable_irq(void)和返回值為整形數的int __disable_irq(void)。

前者直接禁用中斷,后者在禁用中斷前,將中斷使能狀態返回。

舉例:

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

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

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

這是因為如果之前系統的中斷已經是關閉的,當你直接使用__enable_irq()函數就會無條件打開中斷,這樣可能是很危險的。

所以在打開中斷前,要檢查之前中斷是不是已經是禁止狀態,如果是的話就不要使能中斷。

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

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

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

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

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

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

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

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

6.這些函數有什么用處?

保護共享資源

禁止中斷嵌套

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

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

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

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

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

7.移植性

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

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

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

    關注

    0

    文章

    16

    瀏覽量

    10766
  • 編譯器
    +關注

    關注

    1

    文章

    1634

    瀏覽量

    49132
  • FIQ
    FIQ
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2308
收藏 人收藏

    評論

    相關推薦

    Triton編譯器如何提升編程效率

    在現代軟件開發中,編譯器扮演著至關重要的角色。它們不僅將高級語言代碼轉換為機器可執行的代碼,還通過各種優化技術提升程序的性能。Triton 編譯器作為一種先進的編譯器,通過多種方式提升編程效率,使得
    的頭像 發表于 12-25 09:12 ?182次閱讀

    Triton編譯器的優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼既高效又適應不同的硬件架構。 1. 指令選擇
    的頭像 發表于 12-25 09:09 ?175次閱讀

    Triton編譯器在機器學習中的應用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務平臺的一部分,它負責將深度學習模型轉換為優化的格式,以便在NVIDIA GPU上高效運行。Triton編譯器支持
    的頭像 發表于 12-24 18:13 ?337次閱讀

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現在以下幾個方面: 一、定位與目標 Triton編譯器 : 定位:專注于深度學習中最核心、最耗時的張量運算的優化。 目標:提供一個高度抽象、靈活、高效
    的頭像 發表于 12-24 17:25 ?319次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個開源的編譯器前端,它支持多種編程語言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個可擴展和可定制的編譯器框架,允許開發者添加新的編程語言特性和優化技術
    的頭像 發表于 12-24 17:23 ?342次閱讀

    分享一個keil MDK編譯信息增強工具

    今天給大家分享一個 keil MDK 編譯信息增強工具:keil-build-viewer. 1 keil-build-viewer介
    的頭像 發表于 11-14 11:01 ?485次閱讀

    Keil編譯器優化方法

    我們都知道,代碼是可以通過編譯器優化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優化選項。
    的頭像 發表于 10-23 16:35 ?556次閱讀
    <b class='flag-5'>Keil</b><b class='flag-5'>編譯器</b>優化方法

    怎樣將keil中的程序導出

    1. 準備工作 在開始導出程序之前,需要確保已經完成了以下準備工作: 安裝Keil MDK-ARM軟件。 創建一個新的項目,并添加所需的源文件和庫文件。 配置項目設置,包括芯片型號、編譯器選項、鏈接
    的頭像 發表于 09-02 10:23 ?1635次閱讀

    keil5怎么利用sys進行配置ti環境

    設計。 安裝TI ARM工具鏈: 要為TI微控制器開發應用程序,您需要安裝TI ARM工具鏈。這包括編譯器、鏈接和其他必要的工具。您可以從TI官方網站下載這些工具。 配置Keil
    的頭像 發表于 09-02 10:19 ?566次閱讀

    __disable_irq()和__enable_irq()函數的具體定義

    前段時間一工程師向我咨詢了一個問題,問我為什么他的MCU KEIL工程代碼里沒有找到__disable_irq() 和 __enable_irq()的具體定義,是不是有問題。
    的頭像 發表于 08-29 10:06 ?2511次閱讀
    __disable_<b class='flag-5'>irq</b>()和__enable_<b class='flag-5'>irq</b>()<b class='flag-5'>函數</b>的具體定義

    AI編譯器技術剖析

    隨著人工智能技術的飛速發展,AI編譯器作為一種新興的編譯技術逐漸進入人們的視野。AI編譯器不僅具備傳統編譯器的功能,如將高級語言編寫的源代碼轉換為機器可執行的代碼,還融入了人工智能技術
    的頭像 發表于 07-17 18:28 ?1637次閱讀

    人工智能編譯器與傳統編譯器的區別

    人工智能編譯器(AI編譯器)與傳統編譯器在多個方面存在顯著的差異。這些差異主要體現在設計目標、功能特性、優化策略、適用范圍以及技術復雜性等方面。以下是對兩者區別的詳細探討,旨在全面解析其內在差異。
    的頭像 發表于 07-17 18:19 ?1883次閱讀

    KEIL怎么禁止某個函數/某段代碼被編譯器優化?

    有沒有大佬知道,KEIL怎么禁止某個函數/某段代碼 被編譯器優化?
    發表于 04-10 08:17

    STM32CubeMX生成FreeRTOS的MDK工程不支持AC6編譯器嗎?

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

    arm中斷是怎么實現的

    的分類 ARM中斷可以分為兩類:外部中斷內部異常。外部中斷是指來自外部設備(如外部中斷請求線或外設)的
    的頭像 發表于 01-05 15:18 ?912次閱讀
    主站蜘蛛池模板: 欧美激情亚洲色图| 日本系列 1页 亚洲系列| 中国xxxxx高清免费看视频| 国产一级特黄高清在线大片| 黄色短视频软件| www三级免费| 天天爽夜夜爽夜夜爽| 日日爱网站| 1024国产基地永久免费| 中文一区二区在线观看| 免费色黄网站| 午夜爽爽爽| 欧美色成人综合| 成人a在线| 免费鲁丝片一级观看| 性欧美性| 亚洲一区二区三区电影| 日本中文字幕在线播放| 激情五月亚洲色图| 午夜视频观看| 又黄又免费的网站| 四虎国产永久免费久久| 久久手机视频| 五月天婷婷爱| 91国在线啪精品一区| 亚洲免费视频在线观看| 六月婷婷综合网| 午夜性福| a视频网站| 免费手机黄色网址| 天天综合天天色| 巨臀中文字幕一区二区翘臀| 日日摸人人拍人人澡| 二级黄绝大片中国免费视频0| 欧美又粗又硬又大久久久| 亚洲偷偷| 日韩色中色| 免费观看一级特黄三大片视频| 一级一级毛片免费播放| 黄色大毛片| 免费看h视频|