首页 > 技术文章 > 一种根据不同阶段注册不同中断服务函数的写法

utank 2016-04-26 18:17 原文

一、注册一个硬件中断服务函数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、中断虚拟服务函数的一致性??

 

推荐阅读