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