Exemple #1
0
//----恢复保存的异步信号状态----------------------------------------------------
//功能:本函数是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;
}
Exemple #2
0
u32 switch_context(ufast_t line)
{
    SuspendThread(old_id);
    ResumeThread(new_id);
    Int_ContactAsynSignal();
    return 0;
}
Exemple #3
0
//----复位老线程,切换到新线程-------------------------------------------------
//功能:  把old_vm的上下文重新初始化到新创建的状态,然后切换到新线程的
//      上下文中继续执行。
//当一个在常驻内存的虚拟机中处理的事件完成后,不能删除该虚拟机,必须复位
//      该虚拟机,然后切换到其他就绪线程,这时候就需要调用本函数。因此本函数在
//      被复位的线程上下文里面执行。
//参数:  thread_routine,被重置的线程函数
//      new_vm,目标线程
//      old_vm,被复位线程
//返回:  无
//函数原型:void __asm_reset_switch(void (*thread_routine)(void),
//                           struct  tagThreadVm *new_vm,struct  tagThreadVm *old_vm);
//-----------------------------------------------------------------------------
void __asm_reset_switch(ptu32_t (*thread_routine)(void),
                           struct  tagThreadVm *new_vm,struct  tagThreadVm *old_vm)
{
    Int_HalfEnableAsynSignal();
    old_vm->stack_top = CreateThread( NULL, 0, win_engine, thread_routine,
                                        CREATE_SUSPENDED, NULL );
    old_vm->stack = 0;
    old_vm->next = NULL;
    old_vm->stack_size = 0; //保存栈深度
    old_vm->host_vm = NULL;

    ResumeThread((HANDLE )new_vm->stack_top);
    Int_ContactAsynSignal();
    _endthreadex(0);
}
Exemple #4
0
//----切入上下文---------------------------------------------------------------
//功能:  不保存原上下文,直接切入新的上下文执行
//参数:  new_sp,新上下文的栈指针
//返回:  无
//函数原型: void __asm_turnto_context(struct  tagThreadVm  *new_vm);
//说明:  当事件完成,就没有必要保存旧事件的上下文,直接切换到新事件即可.
//-----------------------------------------------------------------------------
void __asm_turnto_context(struct  tagThreadVm  *new_vm)
{
    Int_HalfEnableAsynSignal();
    ResumeThread((HANDLE )new_vm->stack_top);
    Int_ContactAsynSignal();
}