3

我正在编写一个简单的程序来测试 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 的工作,我非常感谢一些帮助!

4

0 回答 0