我正在编写一个简单的程序来测试运行裸机的Raspberry Pi上的ARM计时器和中断。使用ARM定时器屏蔽IRQ寄存器,我已经验证了定时器正在按预期工作并且中断实际正在触发。这显示在下面的代码中。我没有包含寄存器地址定义,但我可以,如果那将是有用的。
void initTimer(void)
{
*gpio_fsel1 |= (1 << 18);
*irq_disable_3 = 0x1; // Disable the timer interrupt for setup
*arm_timer_load = SYS_FREQ/(250/2); //set load value for 0.5Hz timer
*arm_timer_reload = SYS_FREQ/(250/2);
*arm_timer_div = 0x0F9; //prescale by 250
*arm_timer_control = 0x003E00A2;
*arm_timer_irqclr = 1; //clear existing interrupt
*irq_enable_3 = 0x1; // Enable the timer interrupt
}
void IRQHandler(void)
{
if(*irq_pend_base & 0x1) // check interrupt register to see if it's the one we want
timer_isr();
}
void timer_isr (void)
{
// change the led state
if (((*gpio_lev0 & (0x01<<16))>>16)==1){
*gpio_clr0 = (1<<16);
}
else{
*gpio_set0 = (1<<16);
}
//clear interrupt
*arm_timer_irqclr = 1;
}
int main(void)
{
initTimer();
while(1)
{
if(*arm_timer_maskedirq) timer_isr();
}
}
下一步是使函数IRQHandler实际处理中断。我如何向编译器发出信号,告知这应该是一个中断服务程序?我正在使用arm-none-eabi-gcc。
我尝试在main()中注释if(...
行并在__attribute__ ((interrupt ("IRQ")));
之后添加void IRQHandler(void)
,但在程序运行时永远不会调用IRQHandler函数。
我之前没有做过多关于中断和ISR的工作,我真的很感激一些帮助!