如何将中断连接到Raspberry Pi的功能?

时间:2014-01-23 18:32:00

标签: c timer raspberry-pi interrupt bare-metal

我正在编写一个简单的程序来测试运行裸机的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的工作,我真的很感激一些帮助!

0 个答案:

没有答案