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

    浏览量

    11372
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51082
  • FIQ
    FIQ
    +关注

    关注

    0

    文章

    9

    浏览量

    2493
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译呢?

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译?有什么编译选项可以设置吗? 移植代码,有些函数没被调用的
    发表于 09-28 12:25

    请问如何在keil μVision 5上进行ARM编译器的代码优化?

    如何在keil μVision 5上进行ARM编译器的代码优化?
    发表于 08-20 07:37

    如何在Keil中将NuMicro BSP从Arm编译器5迁移到编译器6?

    Keil中将NuMicro BSP从Arm编译器5迁移到编译器6!
    发表于 08-20 06:29

    使用STM32CubeMX生成FreeRTOS的MDK工程,选择AC6编译器有很多错误,为什么?

    使用STM32CubeMX生成FreeRTOS的MDK工程,选择AC5编译器可以编译成功,选择AC6编译器有很多错误,是STM32CubeMX生成FreeRTOS的
    发表于 03-11 06:32

    什么样的代码会被编译器优化

    现在的编译器有多智能,可能你辛辛苦苦写的代码,在编译器看来就是几句废话,直接被删除掉。
    的头像 发表于 01-16 16:38 932次阅读

    Triton编译器与GPU编程的结合应用

    Triton编译器简介 Triton编译器是一种针对并行计算优化的编译器,它能够自动将高级语言代码转换为针对特定硬件优化的低级代码。Triton编译器的核心优势在于其能够识别并行模式,
    的头像 发表于 12-25 09:13 1316次阅读

    Triton编译器如何提升编程效率

    在现代软件开发中,编译器扮演着至关重要的角色。它们不仅将高级语言代码转换为机器可执行的代码,还通过各种优化技术提升程序的性能。Triton 编译器作为一种先进的编译器,通过多种方式提升编程效率,使得
    的头像 发表于 12-25 09:12 1195次阅读

    Triton编译器在高性能计算中的应用

    高性能计算(High-Performance Computing,HPC)是现代科学研究和工程计算中不可或缺的一部分。随着计算需求的不断增长,对计算资源的要求也越来越高。Triton编译器作为一种
    的头像 发表于 12-25 09:11 1564次阅读

    Triton编译器的优化技巧

    在现代计算环境中,编译器的性能对于软件的运行效率至关重要。Triton 编译器作为一个先进的编译器框架,提供了一系列的优化技术,以确保生成的代码既高效又适应不同的硬件架构。 1. 指令选择
    的头像 发表于 12-25 09:09 1834次阅读

    Triton编译器的优势与劣势分析

    Triton编译器作为一种新兴的深度学习编译器,具有一系列显著的优势,同时也存在一些潜在的劣势。以下是对Triton编译器优势与劣势的分析: 优势 高效性能优化 : Triton编译器
    的头像 发表于 12-25 09:07 1863次阅读

    Triton编译器在机器学习中的应用

    1. Triton编译器概述 Triton编译器是NVIDIA Triton推理服务平台的一部分,它负责将深度学习模型转换为优化的格式,以便在NVIDIA GPU上高效运行。Triton编译器支持
    的头像 发表于 12-24 18:13 1629次阅读

    Triton编译器的常见问题解决方案

    Triton编译器作为一款专注于深度学习的高性能GPU编程工具,在使用过程中可能会遇到一些常见问题。以下是一些常见问题的解决方案: 一、安装与依赖问题 检查Python版本 Triton编译器通常
    的头像 发表于 12-24 18:04 6398次阅读

    Triton编译器支持的编程语言

    Triton编译器支持的编程语言主要包括以下几种: 一、主要编程语言 Python :Triton编译器通过Python接口提供了对Triton语言和编译器的访问,使得用户可以在Python环境中
    的头像 发表于 12-24 17:33 1458次阅读

    Triton编译器与其他编译器的比较

    Triton编译器与其他编译器的比较主要体现在以下几个方面: 一、定位与目标 Triton编译器 : 定位:专注于深度学习中最核心、最耗时的张量运算的优化。 目标:提供一个高度抽象、灵活、高效
    的头像 发表于 12-24 17:25 1590次阅读

    Triton编译器功能介绍 Triton编译器使用教程

    Triton 是一个开源的编译器前端,它支持多种编程语言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一个可扩展和可定制的编译器框架,允许开发者添加新的编程语言特性和优化技术
    的头像 发表于 12-24 17:23 2693次阅读