|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-3-28 22:15:48
|
显示全部楼层
问题已搞懂
IAR for arm 中断处理写法
方法1:
启动文件中:(默认启动文件也是这样)
org 0x18
ldr pc,[pc,#-0xFF0] ; 直接跳转到用户中断处理函数
直接写用户中断函数
__irq __arm void Tmr0_IntOnMR0_isr(void)
{
............
}
__irq __arm void Tmr1_IntOnMR0_isr(void)
{
............
}
方法2.
启动文件中:(默认启动文件也是这样)
org 0x18
ldr pc,=irq_handler ;跳转到公共中断处理函数,再分支到具体功能的中断处理函数中
__irq __arm void irq_handler (void) //公共中断处理函数,检查VICVectAddr是否为空
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
if(interrupt_function != NULL)
{
interrupt_function(); // Call vectored interrupt function.
}
else
{
VICVectAddr = 0; // Clear interrupt in VIC.
}
}
具体功能的中断处理函数
void Tmr0_IntOnMR0_isr(void)
{
............
}
void Tmr1_IntOnMR0_isr(void)
{
............
}
方法3.
使用#pragma vector不管启动文件如何写法,
#define IRQV 0x18
#pragma vector=IRQV
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
if(interrupt_function != NULL)
{
interrupt_function(); // Call vectored interrupt function.
}
else
{
VICVectAddr = 0; // Clear interrupt in VIC.
}
}
具体功能的中断处理函数
void Tmr0_IntOnMR0_isr(void)
{
............
}
void Tmr1_IntOnMR0_isr(void)
{
............
} |
|