Realview MDK中编译器对中断处理的过程详解
在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_
? 从SWI和Undef异常返回时使用:
movs pc, LR;
? 从FIQ、IRQ和预取终止返回时使用:
SUBS PC, LR,#4;
? 从数据异常返回时使用:
SUBS PC, LR,#8
在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如:
LDMFD SP!, {PC}∧
理解了ARM异常处理的过程以后,Realview MDK中__irq关键字的作用就容易理解了。下面的函数为一个中断处理函数,其前面加了__irq关键字。
__irq void pwm0_irq_handler(void)
{
//Deassert PWM0 interrupt signal
unsigned int i=AT91F_PWMC_GetInterruptStatus(AT91C_BASE_PWMC);
// Clear the LEDs. On the Board we must apply a "1" to turn off LEDs
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, led_mask[0]);
AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);
AT91F_AIC_ClearIt(AT91C_BASE_AIC,AT91C_ID_PWMC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
}
当编译器器编译这个函数时,除了保存ATPCS规则规定的寄存器以外,还保存了CPSR及PC的值。在函数的返回时,还自动添加了SUBS PC, LR, #4和从SPSR寄存器恢复CPSR寄存器值的指令。用这种方式处理以后,中断处理函数可以和普通函数一样的使用。
注意:中断处理都是在ARM模式下进行的,当源程序欲编译成Thumb指令时,这时,用__irq关键字修饰的函数仍然会被编译成ARM指令。如果源程序编译成在CORTEX M3上运行的指令时,关键字__irq对函数的编译没有任何影响,即编译器不会自动保存CPSR及PC的值,也不会添加SUBS PC, LR, #4和从SPSR寄存器恢复CPSR寄存器值的指令,因为CORTEX M3处理器硬件会自动处理这些问题,无需软件开发人员关心。
RealviewMDK编译器中断处 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)