我正在编写一个简单的程序来测试 ARM 计时器和 Raspberry Pi 上的中断,运行裸机。使用 ARM 定时器 Masked 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。
if(...
我已经尝试在 main() 中注释掉该行并在__attribute__ ((interrupt ("IRQ")));
之后添加void IRQHandler(void)
,但是在程序运行时永远不会调用 IRQHandler 函数。
我以前没有做过很多关于中断和 ISR 的工作,我非常感谢一些帮助!