当前位置:首页 > 单片机 > 单片机
[导读]编译器内部函数__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中断。只有当处理器处于特权模式才可以使用这些内部函数,因为这些函数要改变寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMAS

编译器内部函数__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来控制中断。

1. __enable_fiq

使能FIQ中断。
通常是通过清除寄存器CPSR中的F位来实现的。注意FIQ中断一般只存在于ARMv4和ARMv5架构中(即ARM7和ARM9),ARMv6架构的处理器不支持此函数。对于ARMv7架构的处理器(Cortex-M3),这个函数清除FAULTMASK寄存器的值。
语法:void __enable_fiq(void)
限制:只能在特权级别下使用,用户模式下无效。

2.__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),函数名都是__disable_fiq。
用法: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)。
举例:

voidfunc(void)

{

intwas_masked=__disable_fiq();

/*其它处理*/

if(!was_masked)

__enable_fiq();

}

为什么例子中要使用变量was_masked获取之前的中断使能信息,并且在使能中断时还要先判断这个变量?直接使用__disable_fiq()和__enable_fiq()函数不是更简单吗?
这是因为如果之前系统的中断已经是关闭的,当你直接使用__enable_fiq()函数就会无条件打开中断,这样可能是很危险的。所以在打开中断前,要检查之前中断是不是已经是禁止状态,如果是的话就不要使能中断。

3.__enable_irq

使能IRQ中断。
对于ARMv4和ARMv5架构(ARM7和ARM9),编译器插入下列指令清除CPSR寄存器的I位。

MRSr0,CPSR

ANDr0,r0,#0x7F

MSRCPSR_c,r0

对于ARMv6(ARM11)和ARMv7(Cortex-M3等)指令,编译器插入下列指令使能中断:

CPSIEI

比如Cortex-M3架构处理器,该指令清除PRIMASK寄存器,使能中断。
语法:void __enable_irq(void)
限制:只能在特权级别下使用,用户模式下无效。

4. __disable_irq

禁止IRQ中断。
对于ARMv4和ARMv5架构(ARM7和ARM9),编译器插入下列指令置位CPSR寄存器的I位。

MRSr0,CPSR

ORRr0,r0,#0x80

MSRCPSR_c,r0

对于ARMv6(ARM11)和ARMv7(Cortex-M3等)指令,编译器插入下列指令禁用中断:

CPSIDI

比如Cortex-M3架构处理器,该指令置位PRIMASK寄存器,表示禁止中断和可屏蔽的异常,只剩下NMI和硬Fault可以响应。
__disable_irq函数有两种形式,返回值为空的void __disable_irq(void)和返回值为整形数的int __disable_irq(void)。前者直接禁用中断,后者在禁用中断前,将中断使能状态返回。
举例:

voidfunc(void)

{

intwas_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:

intdisable_irq(void)

{

return__disable_irq();

}

在-cpu=Cortex-M3时,Keil MDK编译器产生的汇编代码为:

MRSr0,PRIMASK

ANDr0,r0,#1

CPSIDi

BXlr

5.这些函数有什么用处?

保护共享资源

禁止中断嵌套

保护共享资源很好理解,但禁止中断嵌套可能很多人不理解:中断嵌套可以提高系统响应时间,为什么要禁用掉?
虽然中断嵌套能提高响应时间,但绝大多数的应用并不需要如此高的响应时间;更重要的是,中断嵌套增加了程序运行的不确定性。所以我建议在不需要极致的响应时间使,禁止中断嵌套。方法也很简单,在进入中断服务函数后和退出中断服务函数前中调用本文讲的这些中断控制函数即可。

6.移植性

与编译器特性相关,不具备移植性,建议使用前先用宏进行封装。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭