MDK中如何使用中断关键词__irq

By | 06月09日
Advertisement

根据ARM提供的资料,在使用快速中断的时候一般对时间要求比较高,这时建议客户使用汇编语言进行编写FIQ的中断处理函数.

Realview MDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。RealView编译器提供关键字__irq 以定义标准的(irq)和(fiq)中断函数。

例子:

__irq void IRQ_Handler (void)

{

/* the interrupt code */

}

对没有向量中断处理或FIQ中断函数的微控制器,需要按要求改变CPU的启动代码。

例子: 下面的C代码实现了一个空的FIQ_Handler:

__irq void FIQ_Handler (void)

{

;

}

在启动代码中,要进行如下修改以调用FIQ_Handler:

PRESERVE8 ; telllinker: stack alignment is 8-byte

IMPORT FIQ_Handler ;use external FIQ_Handler

Vectors LDR PC, Reset_Addr

……

LDR PC, FIQ_Addr ; Instruction at FIQ Vector

location

:

FIQ_Addr DCD FIQ_Handler ; FIQ Entry point

当编译器器编译这个函数时__irq void IRQ_Handler (void),除了保存ATPCS规则规定的寄存器以外,还保存了CPSR及PC的值。在函数的返回时,还自动添加了SUBS PC, LR, #4和从SPSR寄存器恢复CPSR寄存器值的指令。用这种方式处理以后,中断处理函数可以和普通函数一样的使用。中断处理都是在ARM模式下进行的。

或者按照如下使用,也是可以的

PRESERVE8 ; telllinker: stack alignment is 8-byte

IMPORT FIQ_Handler ;use external FIQ_Handler

Vectors LDRPC, Reset_Addr

……

LDRPC, FIQ_Addr ; Instruction at FIQ Vector

location

:

FIQ_Addr DCD FIQ ; FIQ Entry point

FIQ b FIQ_Handler ;不能使用bl指令,这样会把LR的保存的返回地址给覆盖掉!

Similar Posts:

  • keil MDK中如何生成*.bin格式的文件

    在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯于使用*.bin格式的文件,甚至有些嵌入式软件开发者已经拥有了*.bin格式文件的调试或烧写工具.为了充分地利用现有的工具,同时发挥Realview MDK集成开发环境的优势,将*.axf格式文件或*.hex格式文件转换成*.bin格式的文件是十分自然的想法.本文将详细的探讨这种转换方法. 在Rea

  • Keil MDK中使用pc-lint的详细方法

    keil MDK版本:V4.03,下载地址见我的其他博文 PC-lint版本: V8.0 关于pc-lint的强大作用,网上有很多,这里不想再复述,只说一句:能通过pc-lint检验的程序不一定没有问题,但通过了pc-lint检验的程序,质量的提高也是不言而喻的. 首先安装keil MDK和PC-lint这两个软件,网上的PC-lint大多是安装好的压缩包,直接解压到C盘即可.请支持正版!!(咳,心虚中...) 方法十分简单,因为keil MDK中已经给出了pc-lint对应keil ARM编译

  • Realview MDK中启动代码的配置详解

    转自:http://www.realview.com.cn/bbs/dispbbs.asp?boardID=2&ID=1532&page=38Realview MDK中启动代码的配置详解 Embest 徐良平 Realview MDK不仅提供了默认的启动代码,而且这些启动代码可以通过图形化界面配置.启动代码的图形化配置界面非常类似于Web网页的界面,甚至后台处理的脚本也与Html语言十分接近.下面将详细的解析图形化界面的设计与配置. 启动代码的配置界面是由程序中的注释代码控制的.各个标签的

  • STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系

    原]STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系 NVIC是Cortex-M3核心的一部分,关于它的资料不在<STM32的技术参考手册>中,应查阅ARM公司的<Cortex-M3技术参考手册> Cortex-M3的向量中断统一由NVIC管理 EXTI是ST公司在其STM32产品上扩展的外中断控制.它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断(PVD,RTC alarm,USB wakeup,ethernet wakeup),以及软件中断.其输出

  • 在MDK中使用C++源格式做printf串口输出时跳死 调试时发现卡在启动代码中

    usart.h #ifndef __USART_H #define __USART_H #ifdef __cplusplus extern "C" { #endif #include "stdio.h" //#include "stm32f4xx_conf.h" #include "sys.h" #define USART_REC_LEN 200 //定义最大接收字节数 200 #define EN_USART1_RX 1 /

  • MDK中One ELF Section per Function选项功能探究

    本文主要探讨的是MDK开发工具中One ELF Section per Function选项对于代码优化的作用及其实现的机制. 这里以EK-STM32F开发板的LCDDemo实验例程为例进行说明: 1)在MDK的Project -> Options for Target -> Target选项卡下,在Code Generation 中选中Use MicroLIB,选择使用微库.如图1所示: 图 1 在User选项卡Run User Programs After Build/Rebuild中,勾

  • 阻塞队列中的安全中断

    本文的小例子主要是说明如何安全中断阻塞队列中的任务,避免使用interrupt()中断线程,造成堵塞队列中没有被消费的任务都被忽略. package com.thread; import java.io.PrintWriter; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * 单个线程的安全取消 * * 这里模拟的场景是单个线程,处理阻塞队列中要处理的

  • myeclipse中ant build中断解决方法

    刚刚在myeclipse中导入一个有ant build.xml项目,build时直接中断,无法进行. 研究再三,出现此问题的原因应该是配置文件中有错误的配置项,导致build无法通过,有点类似于JAVA中有异常没有捕获而无法编译的情况.所以解决方案有2种. 第一种就是解决问题,在build.xml中将错误的路径,错误配置项去除,即可build通过,此方法可以根本解决当前项目的问题,如果其他项目也无法build通过,也需要进入配置文件中进行修改,此方法比较浪费时间, 第二种就是抛出问题,自身不解决

  • Keil MDK中的Code, RO-data , RW-data, ZI-data代表的意思

    转载自: http://anlx27.iteye.com/blog/1575848 http://blog.csdn.net/gasbi/article/details/6186312 http://hi.baidu.com/whyspai/item/2e3dd968c4ee6a2668105bdb 一 基础知识 字节 8位 半字 16位 字 32位 二 解惑 Code, RO-data,RW-data,ZI-data Code为程序代码部分 RO-data 表示 程序定义的常量const te

  • LDD3中第十章 中断的例程shortprint函数间调用关系(图)

    LDD3(Linux Device Driver 3rd) 第十章 中断 中的例程 shortprint驱动程序 函数之间的调用关系图(将所有read部分略掉了) (原创,如有错误欢迎纠正)

Tags: