//----恢复保存的异步信号状态---------------------------------------------------- //功能:本函数是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; }
//----复位异步信号开关------------------------------------------------ //功能:把异步信号开关恢复到初始状态,即en_asyn_signal_counter=1的状态,初始化 // 中断系统后,还要做大量的模块初始化工作才能启动多事件调度,在启动多事件 // 调度前调用本函数复位异步信号状态,可以防止模块初始化代码的bug意外修改 // 了异步信号使能状态。 //参数:无 //返回:无 //----------------------------------------------------------------------------- void __Int_ResetAsynSignal(void) { Int_CutAsynSignal(); tg_int_global.en_asyn_signal_counter =1; g_bScheduleEnable = false; return; }
//----保存当前状态并禁止异步信号------------------------------------------------ //功能:本函数是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; }
//----初始化中断--------------------------------------------------------------- //功能?初始化中断硬件,初始化中断线数据结构 // 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(); //接通总中断开关 }