zoukankan      html  css  js  c++  java
  • 关于__irq 的使用

    关于__irq使用,首先看ARM公司的说明:ARM 编译器 armcc 支持的函数关键字和运算符。下表列出的关键字是 ARM 对 C 和 C++ 标准的扩展。 表中没有介绍不具备 ARM 编译器特有的行为或限制的标准 C 和 C++ 关键字。

    ARM 编译器支持的关键字扩展表: 关键字
    __align __int64 __svc
    __ALIGNOF__ __INTADDR__ __svc_indirect
    __asm __irq __svc_indirect_r7
    __declspec __packed __value_in_regs
    __forceinline __pure __weak
    __global_reg __softfp __writeonly
    __inline __smc  

    通过使用 __irq 关键字,可以将 C 或 C++ 函数用作中断例程。__irq 是一个函数限定符。 它影响函数的类型。限制:将保留所有损坏的寄存器(浮点寄存器除外),而不仅限于通常在 AAPCS 中保留的寄存器。 必须使用缺省 AAPCS 模式。
    通过将程序计数器设置为 lr-4 并将 CPSR 设置为 SPSR 中的值,可以退出该函数。 不能将任何自变量或返回值与 __irq 函数配合使用。
    再看其他的一些解释:
    armcc的编译器的C对ANSI C的关键字做了些扩展。
    比如__irq 是用来声明IRQ和FIQ中断处理函数用的,可以自动返回原来的现场。__asm用来嵌入汇编代码等。

    __irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如:


    ADS编译器中 : void __irq IRQ_Eint0(void);
    Keil编译器中 : void IRQ_Eint0(void) __irq;


    但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。因此自己编写中断入口现场保护代码,并不使用 __irq 标识符号,就是这个原因。
    总结如下:
    1、若不想自己编写中断入口现场保护代码,而且使用中无中断嵌套,在中断函数中用 __irq 来标识我们的中断函数,否则出错;
    2、若程序中要使用中断嵌套,对于无中断嵌套功能的ARM来说,一定要自己编写中断入口现场保护代码,而且不能用 __irq 标识我们的中断函数,否则出错。


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zht_sir/archive/2009/04/12/4067631.aspx

  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/bugershang/p/2803665.html
Copyright © 2011-2022 走看看