Esempio n. 1
0
File: int.c Progetto: djyos/djyos
//----恢复保存的异步信号状态----------------------------------------------------
//功能:本函数是int_save_asyn_signal()的姊妹函数,调用本函数使禁止次数减少,调用
//      一次int_save_asyn_signal()是禁止次数增加。
//      当次数减至0时激活异步信号,否则简单减1
//参数:无
//返回:无
//------------------------------------------------------------------------------
void Int_RestoreAsynSignal(void)
{
    if(tg_int_global.nest_asyn_signal != 0)
        return;
    if(tg_int_global.en_asyn_signal_counter != 0)
        tg_int_global.en_asyn_signal_counter--;
    if(tg_int_global.en_asyn_signal_counter==0)
    {
//        tg_int_global.en_asyn_signal = true;   //异步信号设为使能
//        if(tg_int_global.en_trunk_counter == 0)
//        {
            g_bScheduleEnable = true;
            if(g_ptEventRunning!= g_ptEventReady)
            {
                __Djy_Schedule();
//                Int_ContactAsynSignal();    //汇编中已经打开,无须再调用
            }else
                Int_ContactAsynSignal();
//        }else
//            Int_ContactAsynSignal();
    }else
    {
        Int_CutAsynSignal();    //防止counter>0期间意外(bug)打开
        g_bScheduleEnable = false;
    }
    return;
}
Esempio n. 2
0
File: int.c Progetto: djyos/djyos
//----复位异步信号开关------------------------------------------------
//功能:把异步信号开关恢复到初始状态,即en_asyn_signal_counter=1的状态,初始化
//      中断系统后,还要做大量的模块初始化工作才能启动多事件调度,在启动多事件
//      调度前调用本函数复位异步信号状态,可以防止模块初始化代码的bug意外修改
//      了异步信号使能状态。
//参数:无
//返回:无
//-----------------------------------------------------------------------------
void __Int_ResetAsynSignal(void)
{
    Int_CutAsynSignal();
    tg_int_global.en_asyn_signal_counter =1;
    g_bScheduleEnable = false;
    return;
}
Esempio n. 3
0
File: int.c Progetto: djyos/djyos
//----保存当前状态并禁止异步信号------------------------------------------------
//功能:本函数是int_restore_asyn_signal()的姊妹函数,调用本函数使禁止次数增加,
//      调用一次int_restore_asyn_signal()使禁止次数减少。
//      若当前次数为0,增加为1并禁止异步信号,不为0时简单地增1
//参数:无
//返回:无
//------------------------------------------------------------------------------
void Int_SaveAsynSignal(void)
{
    if(tg_int_global.nest_asyn_signal != 0)
        return;

    Int_CutAsynSignal();
    //达上限后再加会回绕到0
    if(tg_int_global.en_asyn_signal_counter != CN_LIMIT_UCPU)
        tg_int_global.en_asyn_signal_counter++;
    //原算法是从0->1的过程中才进入,但如果在en_asyn_signal_counter != 0的状态下
    //因故障使中断关闭,将使用户后续调用的en_asyn_signal_counter起不到作用
    g_bScheduleEnable = false;
    return;
}
Esempio n. 4
0
//----初始化中断---------------------------------------------------------------
//功能?初始化中断硬件,初始化中断线数据结构
//      2.异步信号保持禁止,它会在虚拟机启动引擎中打开.
//      3.总中断允许?
//      用户初始化过程应该遵守如下规则:
//      1.系统开始时就已经禁止所有异步信号,用户初始化时无须担心异步信号发生.
//      2.初始化过程中如果需要操作总中断/实时中断/异步信号,应该成对使用.禁止使
//        异步信号实际处于允许状态(即异步和总中断开关同时允许).
//      3.可以操作中断线,比如连接、允许、禁止等,但应该成对使用.
//      4.建议使用save/restore函数对,不要使用enable/disable函数对.
//参数?无
//返回?无
//-----------------------------------------------------------------------------
void Int_Init(void)
{
    ufast_t ufl_line;
    InitializeCriticalSection(&int_cs);
    tg_pIntSrcTable = malloc(tg_IntUsedNum * sizeof(struct tagIntLine));
    if(tg_pIntSrcTable == NULL)
        return;
    __Int_InitHard();
    __Int_ClearAllLine();
    for(ufl_line=0;ufl_line <= CN_INT_LINE_LAST;ufl_line++)
    {
        tg_int_lookup_table[ufl_line] = (ufast_t)CN_LIMIT_UFAST;
    }
    for(ufl_line = 0; ufl_line < tg_IntUsedNum; ufl_line++)
    {
        tg_int_lookup_table[tg_IntUsed[ufl_line]] = ufl_line;
        tg_pIntSrcTable[ufl_line].en_counter = 1;               //禁止中断,计数为1
        tg_pIntSrcTable[ufl_line].int_type = CN_ASYN_SIGNAL;    //设为异步信号
        tg_pIntSrcTable[ufl_line].clear_type = CN_INT_CLEAR_PRE;//设为调用ISR前应答
        //所有中断函数指针指向空函数
        tg_pIntSrcTable[ufl_line].ISR = (u32 (*)(ufast_t))NULL_func;
        tg_pIntSrcTable[ufl_line].sync_event = NULL;                //同步事件空
        tg_pIntSrcTable[ufl_line].my_evtt_id = CN_EVTT_ID_INVALID;  //不弹出事件
    }

    for(ufl_line=0; ufl_line < CN_INT_BITS_WORDS; ufl_line++)
    {
        //属性位图清零,全部置为异步信号方式
        tg_int_global.property_bitmap[ufl_line] = 0;
        //中断使能位图清0,全部处于禁止状态
        tg_int_global.enable_bitmap[ufl_line] = 0;
    }
    tg_int_global.nest_asyn_signal = 0;
    tg_int_global.nest_real = 0;
//    tg_int_global.en_asyn_signal = false;
    Int_CutAsynSignal();
    tg_int_global.en_asyn_signal_counter = 1;   //异步信号计数
//    tg_int_global.en_trunk = true;
    tg_int_global.en_trunk_counter = 0;   //总中断计数
    Int_ContactTrunk();                //接通总中断开关
}