示例#1
0
//----异步事件中断引擎---------------------------------------------------------
//功能:响应异步信号,根据中断号调用用户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;
    }
}
示例#2
0
文件: int_hard.c 项目: Mars-Wu/djyos
//----异步事件中断引擎---------------------------------------------------------
//功能?响应异步信号?根据中断号调用用户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;
}