亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? os_cpu_c.c

?? ucos的WINDOWS版!通過官方的移植版制作
?? C
?? 第 1 頁 / 共 2 頁
字號:
void OSStartHighRdy()
{
    DWORD  dwID;

    OSInitTrace(100000);

    OS_ENTER_CRITICAL();

    OSTaskSwHook();
    ++OSRunning;

    OSCtxSwW32Event  = CreateEvent(NULL,FALSE,FALSE,NULL);
    OSCtxSwW32Handle = CreateThread( NULL, 0, OSCtxSwW32, 0, 0, &dwID );

    SetPriorityClass(OSCtxSwW32Handle,THREAD_PRIORITY_HIGHEST);

#ifdef SET_AFFINITY_MASK
    if( SetThreadAffinityMask( OSCtxSwW32Handle, 1 ) == 0 ) {
#ifdef OS_CPU_TRACE
        OS_Printf("Error: SetThreadAffinityMask\n");
#endif
       }
#endif
    
	SetThreadPriority(OSCtxSwW32Handle,THREAD_PRIORITY_TIME_CRITICAL);

    OSTick32Handle = CreateThread( NULL, 0, OSTickW32, 0, 0, &dwID );
    SetPriorityClass(OSTick32Handle,THREAD_PRIORITY_HIGHEST);

#ifdef SET_AFFINITY_MASK
    if( SetThreadAffinityMask( OSTick32Handle, 1 ) == 0 ) 
	{
#ifdef OS_CPU_TRACE
        OS_Printf("Error: SetThreadAffinityMask\n");
#endif
    }
#endif

	SetThreadPriority(OSTick32Handle,THREAD_PRIORITY_HIGHEST);

#ifdef WIN_MM_TICK
    timeGetDevCaps(&OSTimeCap, sizeof(OSTimeCap));

    if( OSTimeCap.wPeriodMin < WIN_MM_MIN_RES )
        OSTimeCap.wPeriodMin = WIN_MM_MIN_RES;

    timeBeginPeriod(OSTimeCap.wPeriodMin);

    OSTickEventHandle = CreateEvent(NULL, FALSE, FALSE, NULL);
    OSTickTimer       = timeSetEvent((1000/OS_TICKS_PER_SEC),OSTimeCap.wPeriodMin,(LPTIMECALLBACK)OSTickEventHandle, dwID,TIME_PERIODIC|TIME_CALLBACK_EVENT_SET);
#endif
    
    
    SS_SP = (OS_EMU_STK*) OSTCBHighRdy->OSTCBStkPtr;                      /* OSTCBCur = OSTCBHighRdy;     */
                                                                          /* OSPrioCur = OSPrioHighRdy;   */
    ResumeThread(SS_SP->Handle);

    OS_EXIT_CRITICAL();
    
    WaitForSingleObject(OSCtxSwW32Handle,INFINITE);

#ifdef WIN_MM_TICK
    timeKillEvent(OSTickTimer);
    timeEndPeriod(OSTimeCap.wPeriodMin);
    CloseHandle(OSTickEventHandle);
#endif

	CloseHandle(OSTick32Handle);
    CloseHandle(OSCtxSwW32Event);
}

/*
;*********************************************************************************************************
;                                PERFORM A CONTEXT SWITCH (From task level)
;                                           void OSCtxSw(void)
;
; Note(s): 1) Upon entry, 
;             OSTCBCur     points to the OS_TCB of the task to suspend
;             OSTCBHighRdy points to the OS_TCB of the task to resume
;
;          2) The stack frame of the task to suspend looks as follows:
;
;                 SP -> OFFSET  of task to suspend    (Low memory)
;                       SEGMENT of task to suspend      
;                       PSW     of task to suspend    (High memory)  
;
;          3) The stack frame of the task to resume looks as follows:
; 
;                 OSTCBHighRdy->OSTCBStkPtr --> DS                               (Low memory)
;                                               ES
;                                               DI
;                                               SI
;                                               BP
;                                               SP
;                                               BX
;                                               DX
;                                               CX
;                                               AX
;                                               OFFSET  of task code address
;                                               SEGMENT of task code address
;                                               Flags to load in PSW             (High memory)
;*********************************************************************************************************
*/

void OSCtxSw()
{
    DWORD n = 0;

    if(!(SS_SP->Exit)) {
        n = SuspendThread(SS_SP->Handle);
    }
    OSTaskSwHook();

    OSTrace( OBJ_SW, PT_SW_CTX, OSTCBHighRdy, 0, OSPrioCur, OSPrioHighRdy,0 );

    OSTCBCur = OSTCBHighRdy;
    OSPrioCur = OSPrioHighRdy;
    SS_SP = (OS_EMU_STK*) OSTCBHighRdy->OSTCBStkPtr;

    ResumeThread(SS_SP->Handle);
}

/*
;*********************************************************************************************************
;                                PERFORM A CONTEXT SWITCH (From an ISR)
;                                        void OSIntCtxSw(void)
;
; Note(s): 1) Upon entry, 
;             OSTCBCur     points to the OS_TCB of the task to suspend
;             OSTCBHighRdy points to the OS_TCB of the task to resume
;
;          2) The stack frame of the task to suspend looks as follows:
;
;                                  SP+0 --> OFFSET  of return address of OSIntCtxSw()  (Low memory)
;                                    +2     SEGMENT of return address of OSIntCtxSw()
;                                    +4     PSW saved by OS_ENTER_CRITICAL() in OSIntExit()
;                                    +6     OFFSET  of return address of OSIntExit()
;                                    +8     SEGMENT of return address of OSIntExit()
;                                    +10    DS                               
;                                           ES
;                                           DI
;                                           SI
;                                           BP
;                                           SP
;                                           BX
;                                           DX
;                                           CX
;                                           AX
;                                           OFFSET  of task code address
;                                           SEGMENT of task code address
;                                           Flags to load in PSW                       (High memory)
;
;          3) The stack frame of the task to resume looks as follows:
; 
;             OSTCBHighRdy->OSTCBStkPtr --> DS                               (Low memory)
;                                           ES
;                                           DI
;                                           SI
;                                           BP
;                                           SP
;                                           BX
;                                           DX
;                                           CX
;                                           AX
;                                           OFFSET  of task code address
;                                           SEGMENT of task code address
;                                           Flags to load in PSW             (High memory)
;*********************************************************************************************************
*/

void OSIntCtxSw()
{
    DWORD n = 0;

    if(!(SS_SP->Exit)) {
        n = SuspendThread(SS_SP->Handle);
    }

    OSTaskSwHook();

    OSTrace( OBJ_SW, PT_SW_INT, OSTCBHighRdy, 0, OSPrioCur,OSPrioHighRdy,0 );

    OSTCBCur = OSTCBHighRdy;
    OSPrioCur = OSPrioHighRdy;
    SS_SP = (OS_EMU_STK*) OSTCBHighRdy->OSTCBStkPtr;

    ResumeThread(SS_SP->Handle);
}

/*
;*********************************************************************************************************
;                                            HANDLE TICK ISR
;
; Description: This function is called 199.99 times per second or, 11 times faster than the normal DOS
;              tick rate of 18.20648 Hz.  Thus every 11th time, the normal DOS tick handler is called.
;              This is called chaining.  10 times out of 11, however, the interrupt controller on the PC
;              must be cleared to allow for the next interrupt.
;
; Arguments  : none
;
; Returns    : none
;
; Note(s)    : The following C-like pseudo-code describe the operation being performed in the code below.
;
;              Save all registers on the current task's stack;
;              OSIntNesting++;
;              OSTickDOSCtr--;
;              if (OSTickDOSCtr == 0) {
;                  INT 81H;               Chain into DOS every 54.925 mS 
;                                         (Interrupt will be cleared by DOS)
;              } else {
;                  Send EOI to PIC;       Clear tick interrupt by sending an End-Of-Interrupt to the 8259
;                                         PIC (Priority Interrupt Controller)
;              }
;              OSTimeTick();              Notify uC/OS-II that a tick has occured       
;              OSIntExit();               Notify uC/OS-II about end of ISR
;              Restore all registers that were save on the current task's stack;
;              Return from Interrupt;
;*********************************************************************************************************
*/

void OSTickISR()
{
    OSIntEnter();
    OSTimeTick();
    OSIntExit();
}

/*
*********************************************************************************************************
*                                          WIN32 TASK - OSCtxSwW32()
*
* Description: These functions are body of OS multitasking in WIN32.
*
* Arguments  : lpParameter   is a pointer to special paraleter of the task.
*
* Note(s)    : 1) Priorities of these tasks are very important.
*********************************************************************************************************
*/

DWORD WINAPI OSCtxSwW32( LPVOID lpParameter )
{
    OS_INIT_CRITICAL();

    while(!OSTerminateCtxSwW32)
    {
        if( WAIT_OBJECT_0 == WaitForSingleObject(OSCtxSwW32Event,INFINITE) )
        {
            OS_ENTER_CRITICAL();
            OSCtxSw();
            OS_EXIT_CRITICAL();
        }
    }
    return 0;
}

/*
*********************************************************************************************************
*                                          WIN32 TASK - OSTickW32()
*
* Description: These functions are body of OS multitasking in WIN32.
*
* Arguments  : lpParameter   is a pointer to special paraleter of the task.
*
* Note(s)    : 1) Priorities of these tasks are very important.
*********************************************************************************************************
*/

DWORD WINAPI OSTickW32( LPVOID lpParameter )
{
    OS_INIT_CRITICAL();

    while(!OSTerminateTickW32)
    {
        OSTickISR();
#ifdef WIN_MM_TICK
        if( WaitForSingleObject(OSTickEventHandle, 5000) == WAIT_TIMEOUT)
        {
            #ifdef OS_CPU_TRACE
                OS_Printf("Error: MM OSTick Timeout!\n");
            #endif
        }

        ResetEvent(OSTickEventHandle);
#else
        Sleep(1000/OS_TICKS_PER_SEC);
#endif
    }

    return 0;
}

/*
*********************************************************************************************************
*                                          WIN32 TASK - OSTaskW32()
*
* Description: These functions are body of OS multitasking in WIN32.
*
* Arguments  : lpParameter   is a pointer to special paraleter of the task.
*
* Note(s)    : 1) Priorities of these tasks are very important.
*********************************************************************************************************
*/

DWORD WINAPI OSTaskW32( LPVOID lpParameter )
{
    OS_TCB *ptcb;
    OS_EMU_STK  *stack;

    ptcb = (OS_TCB*) lpParameter;
    stack = (OS_EMU_STK*) ptcb->OSTCBStkPtr;
    
#ifdef DISABLE_PRIORITY_BOOST
        if( SetThreadPriorityBoost( stack->Handle, TRUE ) == 0 ) {
#ifdef OS_CPU_TRACE
            OS_Printf("Error: SetThreadPriorityBoost\n");
#endif
        }
#endif

    OS_INIT_CRITICAL();

    stack->Task(stack->pData);

    stack->Exit = 1;
    OSTaskDel(ptcb->OSTCBPrio);

    return 0;
}

/*
*********************************************************************************************************
*                                          WIN32 TASK - OS_SLEEP()
*
* Description: These functions are body of OS multitasking in WIN32.
*
* Arguments  : lpParameter   is a pointer to special paraleter of the task.
*
* Note(s)    : 1) Priorities of these tasks are very important.
*********************************************************************************************************
*/

void OS_SLEEP()
{
    Sleep(1);
}

/*
*********************************************************************************************************
*                                          WIN32 TASK - OS_STOP()
*
* Description: These functions are body of OS multitasking in WIN32.
*
* Arguments  : lpParameter   is a pointer to special paraleter of the task.
*
* Note(s)    : 1) Priorities of these tasks are very important.
*********************************************************************************************************
*/

void OS_STOP()
{
    OS_ENTER_CRITICAL();
    ++OSTerminateTickW32;
    ++OSTerminateCtxSwW32;
    OS_TASK_SW();
    OS_EXIT_CRITICAL();

    Sleep(1000/OS_TICKS_PER_SEC);
}

/*
*********************************************************************************************************
*                                          OS_Printf()
*
* Description: These functions help make application more reliable.
*
* OS_Printf - analog of printf, but use critical sections
*********************************************************************************************************
*/

extern int DbgOut(char *str, ...);

int OS_Printf(char *str, ...)
{
    int  ret;

    va_list marker;

    va_start( marker, str );

    OS_ENTER_CRITICAL();
    //ret = vprintf( str, marker );
	ret = DbgOut(str, marker);
    OS_EXIT_CRITICAL();

    va_end( marker );

    return ret;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美男男青年gay1069videost | 日本成人超碰在线观看| 一本色道亚洲精品aⅴ| 国产精品久久久久久久久免费相片| 久久99精品久久久久久动态图| 日韩欧美综合一区| 激情偷乱视频一区二区三区| 国产午夜亚洲精品理论片色戒| 国产高清在线观看免费不卡| 国产精品日韩成人| 欧洲国产伦久久久久久久| 亚洲一级二级在线| 91麻豆精品国产91久久久久久| 日本视频免费一区| 国产视频一区二区在线| 99国产精品久久久久久久久久| 亚洲精品久久久蜜桃| 欧美一区二区在线免费播放| 日本aⅴ精品一区二区三区| 久久久精品欧美丰满| 色妹子一区二区| 日韩av电影免费观看高清完整版在线观看| 精品国产伦一区二区三区观看方式| 免费观看一级欧美片| 欧美国产精品一区二区三区| 91国在线观看| 精品一区二区三区免费毛片爱| 欧美激情一区二区三区全黄| 97久久超碰国产精品电影| 日本三级亚洲精品| 国产精品理论在线观看| 精品视频在线视频| 粉嫩高潮美女一区二区三区| 亚洲午夜精品在线| 国产视频一区二区在线观看| 欧美片网站yy| 国产成人免费视频| 婷婷综合五月天| 国产视频一区二区在线| 在线播放视频一区| www.久久久久久久久| 三级成人在线视频| 亚洲欧美综合在线精品| 精品精品国产高清a毛片牛牛| 一本色道a无线码一区v| 狠狠久久亚洲欧美| 天天综合色天天综合色h| 国产精品国产精品国产专区不片| 日韩精品影音先锋| 91丨九色丨黑人外教| 激情小说亚洲一区| 午夜精品久久久久久久久久久 | 亚洲日本免费电影| 久久久久久电影| 337p亚洲精品色噜噜| 日本黄色一区二区| 成人av免费在线播放| 国产在线国偷精品产拍免费yy| 天天色综合成人网| 国产女主播在线一区二区| 欧美一区二区三区思思人| 在线精品视频免费观看| 成人av影视在线观看| 国产一区在线视频| 毛片av中文字幕一区二区| 亚洲综合免费观看高清完整版在线 | 91美女在线视频| 成人动漫一区二区| 国产一区二区三区黄视频| 日韩成人免费看| 五月婷婷久久丁香| 亚洲一级片在线观看| 亚洲综合图片区| 亚洲在线观看免费| 一区二区三区在线观看网站| 日韩伦理电影网| 国产精品区一区二区三区| 国产日本欧洲亚洲| 国产欧美一区二区在线| 日本一区二区动态图| 久久精品夜色噜噜亚洲a∨| 久久综合成人精品亚洲另类欧美 | 国产精品综合av一区二区国产馆| 久久超碰97中文字幕| 美国一区二区三区在线播放| 免费观看一级欧美片| 久久国产精品99久久久久久老狼 | 亚洲影视在线播放| 一区二区激情小说| 天天av天天翘天天综合网色鬼国产| 亚洲高清免费在线| 日韩电影免费一区| 韩国毛片一区二区三区| 国产成人免费网站| 成人激情小说网站| 在线视频观看一区| 91麻豆精品国产91久久久使用方法 | 亚洲精品国久久99热| 伊人色综合久久天天人手人婷| 亚洲综合激情另类小说区| 婷婷丁香久久五月婷婷| 精品一区二区三区视频 | 亚洲一区欧美一区| 奇米综合一区二区三区精品视频| 久国产精品韩国三级视频| 高清久久久久久| 在线视频综合导航| 日韩欧美黄色影院| 亚洲欧洲另类国产综合| 亚洲一卡二卡三卡四卡五卡| 激情文学综合插| 欧美在线播放高清精品| 欧美不卡一区二区三区| 国产欧美一区二区精品仙草咪| 亚洲免费在线电影| 青青草国产成人99久久| 成人精品亚洲人成在线| 欧美精品色一区二区三区| 中文字幕免费不卡| 午夜视频一区二区三区| 国产精品一二二区| 欧美日韩综合不卡| 欧美激情中文字幕一区二区| 日韩成人一级片| 91国偷自产一区二区开放时间 | 日韩电影一二三区| 97久久精品人人澡人人爽| 欧美一区二区三区喷汁尤物| 国产精品美女久久久久久久网站| 香蕉久久一区二区不卡无毒影院| 国产精品一区三区| 91精品久久久久久久久99蜜臂| 国产精品乱码久久久久久| 美女一区二区三区| 欧美色成人综合| 国产精品久久二区二区| 精品一区二区免费视频| 欧美亚洲国产一区在线观看网站| 国产欧美一区二区精品性色 | 亚洲天堂av一区| 国产精品影音先锋| 日韩一区二区免费视频| 亚洲一区影音先锋| 91丨九色丨蝌蚪丨老版| 国产精品视频麻豆| 狠狠色狠狠色综合系列| 91超碰这里只有精品国产| 伊人婷婷欧美激情| 99精品欧美一区二区蜜桃免费| 久久精品水蜜桃av综合天堂| 免费国产亚洲视频| 欧美一卡在线观看| 亚洲午夜av在线| 色噜噜狠狠成人中文综合| 亚洲男女一区二区三区| 91小视频免费看| 中文字幕不卡一区| 国产一区二区女| 久久毛片高清国产| 久久av资源网| 精品久久一区二区三区| 捆绑调教美女网站视频一区| 制服丝袜成人动漫| 视频一区二区三区在线| 欧美亚洲自拍偷拍| 亚洲精品精品亚洲| 欧美三级电影精品| 午夜国产精品影院在线观看| 日本电影欧美片| 一区二区国产盗摄色噜噜| 91在线观看成人| 一区二区三区在线免费视频| 91蝌蚪国产九色| 亚洲一区二区三区不卡国产欧美| 欧美性色黄大片| 午夜精品在线看| 精品国产在天天线2019| 狠狠色丁香婷综合久久| 中文字幕第一区综合| 不卡欧美aaaaa| 亚洲男人天堂av网| 欧美亚洲国产一区在线观看网站| 午夜精品久久久久久久| 91精品国产麻豆国产自产在线| 美女视频免费一区| 久久久久久久一区| av资源站一区| 亚洲一二三区在线观看| 91精品久久久久久久91蜜桃| 免费在线欧美视频| 国产日韩三级在线| 欧美性生活一区| 免费观看91视频大全| 久久久久亚洲综合| 色婷婷综合久久久久中文| 视频一区视频二区中文字幕| 欧美精品一区二区三区四区| 成人午夜视频网站| 亚洲国产成人av| 久久综合九色综合97_久久久|