一种根据不同阶段注册不同中断服务函数的写法

一、注册一个硬件中断服务函数irq_handler,作为硬件中断产生后,实际中断服务函数的总入口。

void intc_setup_irq(vector, priority, irq_handler)

二、中断服务函数irq_handler入口,根据不同的条件调用不同分支

void irq_handler(void)
{
         get isr val

         switch(val)
         {
                   case condition_1:
                            call_service(condition_1)
                   case condition_2:
                            call_service(condition_2)
                   ...
                   ...
         }
}

三、定义一个全局的函数指针,作为“Interrupt Virtual Service Routine”,通过注册函数,在不同阶段,注册执行不同的服务函数。

void (*global_vsr)(int condition);

四、定义中断虚拟服务注册函数irq_register_service,改变global_vsr的实际指向,用于指向当前中断服务函数。

void irq_register_service(void (*cur_vsr)(int))
{
         global_vsr = cur_vsr;
}

五、call_service函数,call_service实际通过global_vsr调用了当前的中断服务函数。

void call_service(condition)
{
         global_vsr(condition);
}

使用要点:

1、注意irq_register_service注册中断虚拟服务函数的时机!!

2、中断虚拟服务函数的一致性??

原文地址:https://www.cnblogs.com/utank/p/5436101.html