//----异步事件中断引擎--------------------------------------------------------- //功能:响应异步信号,根据中断号调用用户ISR,随后弹出中断线控制块的my_evtt_id // 成员指定的事件类型,最后在返回前查看是否需要做上下文切换,如需要则切换 // 之。 //参数:ufast ufl_line,响应的中断线号 //返回:无 //----------------------------------------------------------------------------- void __Int_EngineAsynSignal(ufast_t ufl_line) { struct tagEventECB *event; u32 isr_result; tg_pIntSrcTable = malloc(tg_IntUsedNum * sizeof(struct tagIntLine)); if(tg_pIntSrcTable == NULL) return; // tg_int_global.en_asyn_signal_counter = 1; g_bScheduleEnable = false; // tg_int_global.en_asyn_signal = false; tg_int_global.nest_asyn_signal++; if(tg_pIntSrcTable[ufl_line].enable_nest == true) //允许嵌套的情况 { Int_DisableAsynLine(ufl_line); //不禁止,可能会形成无限循环 __int_enable_irq(); //L138中异步信号用irq实现,响应中断时,ARM把Ibit关闭了。 } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_PRE) Int_ClearLine(ufl_line); //中断应答, if(tg_pIntSrcTable[ufl_line].ISR != NULL) isr_result = tg_pIntSrcTable[ufl_line].ISR(ufl_line); else { if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_USER) Int_ClearLine(ufl_line); //中断应答, } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_POST) Int_ClearLine(ufl_line); //中断应答, if(tg_pIntSrcTable[ufl_line].enable_nest == true) //支持嵌套的情况 { __int_disable_irq(); Int_EnableAsynLine(ufl_line); } event = tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event; if(event != NULL) //看同步指针中有没有事件(注:单个事件,不是队列) { event->event_result = isr_result; __Djy_EventReady(event); //把该事件放到ready队列 tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event = NULL; //解除同步 } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id != CN_INVALID_EVTT_ID) { Djy_EventPop(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id, NULL,0,(ptu32_t)isr_result, (ptu32_t)ufl_line,0); } tg_int_global.nest_asyn_signal--; if(tg_int_global.nest_asyn_signal == 0) { // tg_int_global.en_asyn_signal = true; // tg_int_global.en_asyn_signal_counter = 0; if(g_ptEventReady != g_ptEventRunning) __Djy_ScheduleAsynSignal(); //执行中断内调度 g_bScheduleEnable = true; } }
//----异步事件中断引擎--------------------------------------------------------- //功能?响应异步信号?根据中断号调用用户ISR?随后弹出中断线控制块的my_evtt_id // 成员指定的事件类型?最后在返回前查看是否需要做上下文切换?如需要则切换 // 之。 //参数?ufast ufl_line?响应的中断线号 //返回?无 //----------------------------------------------------------------------------- void __Int_EngineAsynSignal(ufast_t ufl_line) { struct tagEventECB *event; u32 isr_result; g_bScheduleEnable = false; tg_int_global.nest_asyn_signal=1; if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_PRE) Int_ClearLine(ufl_line); //中断应答, if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].ISR != NULL) isr_result = tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].ISR(ufl_line); else { if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_USER) Int_ClearLine(ufl_line); //中断应答, } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].clear_type == CN_INT_CLEAR_POST) Int_ClearLine(ufl_line); //中断应答, event = tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event; if(event != NULL) //看同步指针中有没有事件(注?单个事件?不是队列) { event->event_result = isr_result; __Djy_EventReady(event); //把该事件放到ready队列 tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].sync_event = NULL; //解除同步 } if(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id != CN_EVTT_ID_INVALID) { Djy_EventPop(tg_pIntSrcTable[tg_int_lookup_table[ufl_line]].my_evtt_id, NULL,0,(ptu32_t)isr_result, (ptu32_t)ufl_line,0); } tg_int_global.nest_asyn_signal = 0; if(g_ptEventReady != g_ptEventRunning) __Djy_ScheduleAsynSignal(); //执行中断内调度 g_bScheduleEnable = true; return; }