吴忠躺衫网络科技有限公司

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(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ù),因?yàn)檫@些函數(shù)要改變寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMASK和FAULTMASK寄存器(Cortex-M3、M4等),而這些寄存器只有在特權(quán)模式下才能被訪問(wèn)。

這些內(nèi)部函數(shù)對(duì)所有架構(gòu)的處理器都有效,無(wú)論是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來(lái)控制中斷。

2.__enable_fiq使能FIQ中斷

通常是通過(guò)清除寄存器CPSR中的F位來(lái)實(shí)現(xiàn)的。

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

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

語(yǔ)法:void __enable_fiq(void)

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

3.__disable_fiq禁用FIQ中斷

通常是通過(guò)置一CPSR的F位來(lái)實(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)。

語(yǔ)法:__disable_fiq有兩個(gè)版本。

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

另一個(gè)返回值為整形值的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)級(jí)別下使用,用戶模式下無(wú)效。

如果編譯器參數(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)。

舉例:

void func(void){ int was_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ì)無(wú)條件打開中斷,這樣可能是很危險(xiǎn)的。所以在打開中斷前,要檢查之前中斷是不是已經(jīng)是禁止?fàn)顟B(tài),如果是的話就不要使能中斷。

4.__enable_irq使能IRQ中斷

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

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

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

CPSIE I

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

語(yǔ)法:void __enable_irq(void)

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

5. __disable_irq禁止IRQ中斷

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

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

對(duì)于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獲取之前的中斷使能信息,并且在使能中斷時(shí)還要先判斷這個(gè)變量?

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

這是因?yàn)槿绻跋到y(tǒng)的中斷已經(jīng)是關(guān)閉的,當(dāng)你直接使用__enable_irq()函數(shù)就會(huì)無(wú)條件打開中斷,這樣可能是很危險(xiǎn)的。

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

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

如果編譯器參數(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è)購(gòu)?a href="http://www.solar-ruike.com.cn/v/tag/3195/" target="_blank">匯編層面上看一下返回整形數(shù)的__disable_irq:

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

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

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

6.這些函數(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ù)即可。

7.移植性

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

來(lái)源:https://blog.csdn.net/zhzht19861011/article/details/52815488

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

    關(guān)注

    0

    文章

    16

    瀏覽量

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

    關(guān)注

    1

    文章

    1642

    瀏覽量

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

    關(guān)注

    0

    文章

    9

    瀏覽量

    2316
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Triton編譯器與GPU編程的結(jié)合應(yīng)用

    Triton編譯器簡(jiǎn)介 Triton編譯器是一種針對(duì)并行計(jì)算優(yōu)化的編譯器,它能夠自動(dòng)將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為針對(duì)特定硬件優(yōu)化的低級(jí)代碼。Triton編譯器的核心優(yōu)勢(shì)在于其能夠識(shí)別并行模式,
    的頭像 發(fā)表于 12-25 09:13 ?323次閱讀

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

    在現(xiàn)代軟件開發(fā)中,編譯器扮演著至關(guān)重要的角色。它們不僅將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為機(jī)器可執(zhí)行的代碼,還通過(guò)各種優(yōu)化技術(shù)提升程序的性能。Triton 編譯器作為一種先進(jìn)的編譯器,通過(guò)多種方式提升編程效率,使得
    的頭像 發(fā)表于 12-25 09:12 ?333次閱讀

    Triton編譯器的優(yōu)化技巧

    在現(xiàn)代計(jì)算環(huán)境中,編譯器的性能對(duì)于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為一個(gè)先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼既高效又適應(yīng)不同的硬件架構(gòu)。 1. 指令選擇
    的頭像 發(fā)表于 12-25 09:09 ?340次閱讀

    Triton編譯器在機(jī)器學(xué)習(xí)中的應(yīng)用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務(wù)平臺(tái)的一部分,它負(fù)責(zé)將深度學(xué)習(xí)模型轉(zhuǎn)換為優(yōu)化的格式,以便在NVIDIA GPU上高效運(yùn)行。Triton編譯器支持
    的頭像 發(fā)表于 12-24 18:13 ?518次閱讀

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

    Triton編譯器與其他編譯器的比較主要體現(xiàn)在以下幾個(gè)方面: 一、定位與目標(biāo) Triton編譯器 : 定位:專注于深度學(xué)習(xí)中最核心、最耗時(shí)的張量運(yùn)算的優(yōu)化。 目標(biāo):提供一個(gè)高度抽象、靈活、高效
    的頭像 發(fā)表于 12-24 17:25 ?483次閱讀

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

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

    分享一個(gè)keil MDK編譯信息增強(qiáng)工具

    今天給大家分享一個(gè) keil MDK 編譯信息增強(qiáng)工具:keil-build-viewer. 1 keil-build-viewer介
    的頭像 發(fā)表于 11-14 11:01 ?713次閱讀

    Keil編譯器優(yōu)化方法

    我們都知道,代碼是可以通過(guò)編譯器優(yōu)化的,有的時(shí)候,為了提高運(yùn)行速度或者減少代碼尺寸,會(huì)開啟優(yōu)化選項(xiàng)。
    的頭像 發(fā)表于 10-23 16:35 ?809次閱讀
    <b class='flag-5'>Keil</b><b class='flag-5'>編譯器</b>優(yōu)化方法

    怎樣將keil中的程序?qū)С?/a>

    1. 準(zhǔn)備工作 在開始導(dǎo)出程序之前,需要確保已經(jīng)完成了以下準(zhǔn)備工作: 安裝Keil MDK-ARM軟件。 創(chuàng)建一個(gè)新的項(xiàng)目,并添加所需的源文件和庫(kù)文件。 配置項(xiàng)目設(shè)置,包括芯片型號(hào)、編譯器選項(xiàng)、鏈接
    的頭像 發(fā)表于 09-02 10:23 ?1992次閱讀

    keil5怎么利用sys進(jìn)行配置ti環(huán)境

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

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

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

    AI編譯器技術(shù)剖析

    隨著人工智能技術(shù)的飛速發(fā)展,AI編譯器作為一種新興的編譯技術(shù)逐漸進(jìn)入人們的視野。AI編譯器不僅具備傳統(tǒng)編譯器的功能,如將高級(jí)語(yǔ)言編寫的源代碼轉(zhuǎn)換為機(jī)器可執(zhí)行的代碼,還融入了人工智能技術(shù)
    的頭像 發(fā)表于 07-17 18:28 ?1763次閱讀

    人工智能編譯器與傳統(tǒng)編譯器的區(qū)別

    人工智能編譯器(AI編譯器)與傳統(tǒng)編譯器在多個(gè)方面存在顯著的差異。這些差異主要體現(xiàn)在設(shè)計(jì)目標(biāo)、功能特性、優(yōu)化策略、適用范圍以及技術(shù)復(fù)雜性等方面。以下是對(duì)兩者區(qū)別的詳細(xì)探討,旨在全面解析其內(nèi)在差異。
    的頭像 發(fā)表于 07-17 18:19 ?2112次閱讀

    KEIL怎么禁止某個(gè)函數(shù)/某段代碼被編譯器優(yōu)化?

    有沒(méi)有大佬知道,KEIL怎么禁止某個(gè)函數(shù)/某段代碼 被編譯器優(yōu)化?
    發(fā)表于 04-10 08:17

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

    使用STM32CubeMX生成FreeRTOS的MDK工程,選擇AC5編譯器可以編譯成功,選擇AC6編譯器有很多錯(cuò)誤,是STM32CubeMX生成FreeRTOS的
    發(fā)表于 03-06 08:24
    大发888九州娱乐城| 网络百家乐官网开户网| 百家乐| 百家乐官网网投打法| 免费百家乐过滤工具| 百家乐官网双层筹码盘| 百家乐筹码片| 百家乐官网微乐| 新大发888pt老虎机| 澳门百家乐官网路单| 大发真钱娱乐城| 网络百家乐软件真假| 澳门百家乐官网自杀| 真人百家乐送钱| 百家乐官网投注平台导航网| 现场百家乐机| 赌百家乐官网的计划跟策略| 德州扑克书| 真人百家乐出千| 铁岭市| 新利百家乐的玩法技巧和规则| 澳门百家乐官网战法| 星期八百家乐的玩法技巧和规则| 百家乐官网出闲几率| 大发888游戏充值50| 实战百家乐官网十大取胜原因百分百战胜百家乐官网不买币不吹牛只你能做到按我说的.百家乐官网基本规则 | 百家乐官网庄家抽水的秘密| 尊龙百家乐赌场娱乐网规则 | 大发888下载 客户端| 百家乐天天赢钱| 百家乐官网专打单跳投注法| 现场百家乐牌路分析| 木棉百家乐官网网络| 伟博娱乐| 长江百家乐的玩法技巧和规则 | 全讯网六仔开奖| 网上百家乐可靠| 网络百家乐官网的陷阱| 大发888奖金| 欢乐博百家乐娱乐城| 云鼎百家乐官网作弊|