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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? os_event.c

?? EventOS操作系統(tǒng)核心源碼
?? C
字號:
#include    <string.h>
#include    "OS_DEF.H"

#define OS_EVT_MAX_NUM           0x10
#define OS_EVT_STK_SIZE           400

OS_EVENT    OSEventAry[OS_EVT_MAX_NUM];
INT8U       OSnEvtTop;
INT8U       OSnEvtBut;
INT32U      OSOldTime;          // Use for save the checked time

extern  OS_MSG  *OSMsgHd;
extern  OS_STK  *pSchedStk;
extern  INT8U    OSEvtCode;
extern  INT32U   OSSumTick;
extern  INT32U   OSUseTick;
extern  INT32U   OSCurTime;   // Use for system time

extern  void    OSInit(void);
extern  INT8U   GetTaskSta(INT8U nTaskID);
extern  void    SetActive(INT8U nTaskID);
extern  void    OSTaskIdleHook(void);

void RunTask(OS_TCB *pTaskPnt, INT32U pParams);
void InVoke(MSGPROC *pMsgCurP, INT16U nParamL, INT32U pParamH);
void DefProc(void (*pSysProc)(INT16U, INT32U), INT16U nParamL, INT32U pParamH);
void Scheduler(SEMPROC *pSemCurP, INT16U nParamL, INT32U pParamH);
void TskInvoke(OS_TCB *pTskPnt, INT16U nParamL, INT32U pParamH);
void MsgInvoke(MSGPROC *pMsgCurP, INT16U nParamL, INT32U pParamH);
void DefInvoke(void (*pFuncProc)(INT16U, INT32U), INT16U nParamL, INT32U pParamH);


/*****************************************************************************************************
*                            System Event Memagement
* FUNCTION: PostEvent(INT8U OSEventID, INT16U nParamL, INT32U lParamM)
*           GetEvent(INT16U *pParamL, INT32U *pParamM)
*
* Description: Post one or Get one Event to System Event Stack
*
* Arguments  : INT8U   OSEventID - Event ID Code
*              INT16U  nParamL   - Event Short Code
*              INT32U  lParamM   - Event Large Code
*
* Returns   (1): == OS_NO_ERR : else ERROR
*           (2): == OS_NO_EVENT : else Event Code
*---------------------------------------------------------------------------------------------
*/
INT8U PutEvent(INT8U OSEventID, INT8U nTaskID, INT16U nParamL, INT32U pParamM)
{
    OS_MSG *pMsgPtr;
    INT8U   nCurPtr;
    
    pMsgPtr = OSMsgHd;
    while (pMsgPtr != NULL) {
        if (pMsgPtr->OSMsgID == OSEventID)
            break;
        pMsgPtr = pMsgPtr->pNextMsg;
    }
    if (pMsgPtr == NULL)
        return OS_INVALID_ID;
    OS_ENTER_CRITICAL();
    nCurPtr = (OSnEvtTop + 1) % OS_EVT_MAX_NUM;
    if (nCurPtr == OSnEvtBut) {
        OS_EXIT_CRITICAL();
        return OS_EVT_BUFFULL;
    }
    OSEventAry[nCurPtr].OSEventID = OSEventID;
    OSEventAry[nCurPtr].nTaskID = nTaskID;
    OSEventAry[nCurPtr].ParamL = nParamL;
    OSEventAry[nCurPtr].ParamM = pParamM;
    OSnEvtTop = nCurPtr;
    OS_EXIT_CRITICAL();
    return OS_NO_ERR;
}

INT8U GetEvent(INT8U *pTaskID, INT16U *pParamL, INT32U *pParamM)
{
    INT8U   nCurPtr;
    
    if (OSnEvtTop == OSnEvtBut) return OS_NO_EVENT;
    OS_ENTER_CRITICAL();
    OSnEvtBut++, OSnEvtBut %= OS_EVT_MAX_NUM;
    nCurPtr = OSnEvtBut;
    *pTaskID = OSEventAry[nCurPtr].nTaskID;
    *pParamL = OSEventAry[nCurPtr].ParamL;
    *pParamM = OSEventAry[nCurPtr].ParamM;
    nCurPtr  = OSEventAry[nCurPtr].OSEventID;
    OS_EXIT_CRITICAL();
    return nCurPtr;
}
/*****************************************************************************************************
*                                              IDLE TASK
*
* Description: This task is internal to EventOS and executes whenever no other higher priority tasks
*              executes because they are ALL waiting for event(s) to occur.
*
* Arguments  : none
* Returns    : none
*
* Note(s)    : 1) OSTaskIdleHook() is called after the critical section to ensure that interrupts will be
*                 enabled for at least a few instructions.  On some processors (ex. Philips XA), enabling
*                 and then disabling interrupts didn't allow the processor enough time to have interrupts
*                 enabled before they were disabled again.  uC/OS-II would thus never recognize
*                 interrupts.
*              2) This hook has been added to allow you to do such things as STOP the CPU to conserve 
*                 power.
*       事件類型:
         1、發(fā)給所有可執(zhí)行任務(wù):nTaskID = 0
         2、發(fā)給當(dāng)前活動任務(wù):  nTaskID = 0x8000
         3、發(fā)給指定任務(wù):      nTaskID = pMsgCurp->nTaskID
*       任務(wù)狀態(tài):
         1、當(dāng)前任務(wù)為活動狀態(tài):  xxx0,0000
         2、當(dāng)前任務(wù)為非活動狀態(tài):xxx1,0000
         3、當(dāng)前任務(wù)還未啟動:    1xxx,0000
******************************************************************************************************
*/
int main(void)
{
    INT8U     nTaskID, nTskSta;
    INT16U    nParamL;
    INT32U    pParamH;    
    OS_MSG   *pCurMsg;
    OS_TCB   *pTaskPnt;
    MSGPROC  *pMsgCurP;
    SEMPROC  *pSemCurP;

    OSnEvtTop = 0, OSnEvtBut = 0;
    OSInit();                    // EventOS系統(tǒng)初始化
    for (;;) {
        OSEvtCode = GetEvent(&nTaskID, &nParamL, &pParamH);
        if (OSEvtCode > 0) {
            pCurMsg = OSMsgHd;
            while (pCurMsg != NULL) {
                if (pCurMsg->OSMsgID == OSEvtCode) break;
                pCurMsg = pCurMsg->pNextMsg;
            }
            if (pCurMsg != NULL) {
                if (OSEvtCode == 1) {               // 啟動任務(wù)
                    pTaskPnt = pCurMsg->FstProc;
                    while (pTaskPnt != NULL) {
                        if (nTaskID == pTaskPnt->TaskID &&
                           (pTaskPnt->bStatus&OS_TSK_SEM) == 0) {
                            RunTask(pTaskPnt, pParamH);
                            break;
                        }
                        pTaskPnt = pTaskPnt->pTcbNext;
                    }
                } else if (OSEvtCode < 16) {
                    pSemCurP = pCurMsg->FstProc;
                    while (pSemCurP != NULL) {
                        if (nTaskID == 0 || nTaskID == pSemCurP->TaskID)
                            Scheduler(pSemCurP, nParamL, pParamH);
                        pSemCurP = pSemCurP->pNextSemP;
                    }
                } else {
                    pMsgCurP = pCurMsg->FstProc;
                    while (pMsgCurP != NULL) {
                        nTskSta = 0;
                        if (pMsgCurP->bStatus & OS_TSK_READY) {
                            if (nTaskID == pMsgCurP->TaskID) nTskSta = nTaskID;       //指定
                            else if ((nTaskID&0x7F) == 0) nTskSta = pMsgCurP->TaskID; //通用|活動
                        }
                        if (nTskSta != 0) {
                            nTskSta = GetTaskSta(nTskSta);  // 缺省為給活動任務(wù)的事件有效
                            if (nTaskID & OS_TSK_ACTIVE) {  // 僅對活動任務(wù)
                                if (nTskSta & OS_TSK_ACTIVE) nTskSta = 0;  
                            } else {                        // 對非活動任務(wù),必須為有效的任務(wù)
                                if ((nTskSta & OS_TSK_READY) == 0) nTskSta = 0; 
                            }
                            if (nTskSta == 0) InVoke(pMsgCurP, nParamL, pParamH);
                        }
                        if (OSEvtCode == 0) pMsgCurP = NULL;
                        else pMsgCurP = pMsgCurP->pNextMsgP;
                    }
                    if (OSEvtCode > 0 && pCurMsg->DefProc != NULL)
                        DefProc(pCurMsg->DefProc, nParamL, pParamH);
                }
            }
            if (OSEvtCode == 0) {
                if (OSCurTime <  OSOldTime) OSCurTime += 100000;
                OSUseTick += OSCurTime - OSOldTime;
            }
        }
        
        OS_ENTER_CRITICAL();
        if (OSCurTime <  OSOldTime) OSCurTime += 100000;
        OSSumTick += OSCurTime - OSOldTime;
        OSOldTime = OSCurTime;
        if (OSSumTick > 100000)
            OSSumTick = 0, OSUseTick = 0;
        OS_EXIT_CRITICAL();
      #if OS_CPU_HOOKS_EN
        OSTaskIdleHook();      /* Call user definable HOOK  */
      #endif
    }
}
/*****************************************************************************************************
*                                      INVOKE
*
* Description: This Function is internal to EventOS and executes current Message process 
*              executes because the event that is waiting for is occured.
*
* Arguments  : none
* Returns    : none
*
* Note(s)    : 1) OSTaskIdleHook() is called after the critical section to ensure that interrupts will be
*                 enabled for at least a few instructions.  On some processors (ex. Philips XA), enabling
*                 and then disabling interrupts didn't allow the processor enough time to have interrupts
*                 enabled before they were disabled again.  uC/OS-II would thus never recognize
*                 interrupts.
*              2) This hook has been added to allow you to do such things as STOP the CPU to conserve 
*                 power.
------------------------------------------------------------------------------------------------------
*/
void RunTask(OS_TCB *pTaskPnt, INT32U pParams)
{
    pSchedStk = OSEvtInvokeInit((void *)TskInvoke, (void *)pTaskPnt, 0, pParams);
    pTaskPnt->bStatus = OS_TSK_ACTIVE;
    pTaskPnt->nDelayCnt = OS_SYS_MAXDLY;
    OSEvtSched();
}
void TskInvoke(OS_TCB *pTskPnt, INT16U nParamL, INT32U pParamH)
{
    (*pTskPnt->pTskProg)(nParamL, pParamH);
    pTskPnt->bStatus = OS_TSK_OVER;
    OSRtnSched();
}

void InVoke(MSGPROC *pMsgCurP, INT16U nParamL, INT32U pParamH)
{
    pSchedStk = OSEvtInvokeInit((void *)MsgInvoke, (void *)pMsgCurP, nParamL, pParamH);
    SetActive(pMsgCurP->TaskID);           // Set current task as Active
    pMsgCurP->bStatus = OS_TSK_RUN;
    pMsgCurP->nDelayCnt = OS_SYS_MAXDLY;
    OSEvtSched();
}
void MsgInvoke(MSGPROC *pMsgCurP, INT16U nParamL, INT32U pParamH)
{
    (*pMsgCurP->pFuncProc)(nParamL, pParamH);
    pMsgCurP->bStatus = OS_TSK_READY;
    OSRtnSched();
}

void DefProc(void (*pSysProc)(INT16U, INT32U), INT16U nParamL, INT32U pParamH)
{
    pSchedStk = OSEvtInvokeInit((void *)DefInvoke, (void *)pSysProc, nParamL, pParamH);
    OSEvtSched();
}
void DefInvoke(void (*pSysProc)(INT16U, INT32U), INT16U nParamL, INT32U pParamH)
{
    (*pSysProc)(nParamL, pParamH);

    OSRtnSched();
}

void Scheduler(SEMPROC *pSemCurP, INT16U nParamL, INT32U pParamH)
{
    pSchedStk = pSemCurP->pStkPtr;
    pSemCurP->pOS_Tcb->bStatus = OS_TSK_RUN;    
    SetActive(pSemCurP->TaskID);           // Set current task as Active
    OSSemSched(nParamL, pParamH);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久99久精品视频免费观看| 午夜精品免费在线观看| 不卡电影一区二区三区| 国产精品欧美久久久久无广告 | 色综合天天天天做夜夜夜夜做| 国产日产欧美精品一区二区三区| 国产99久久久精品| 亚洲日本一区二区| 在线成人高清不卡| 毛片一区二区三区| 欧美激情综合在线| 色激情天天射综合网| 日韩成人一区二区| 久久综合国产精品| 日本高清不卡在线观看| 日本aⅴ免费视频一区二区三区| 欧美成人一区二区三区| 成人午夜激情视频| 性做久久久久久免费观看| 欧美精品一区二区三区在线| 99精品视频在线观看| 日精品一区二区| 国产精品午夜春色av| 欧美日韩久久一区二区| 国产乱一区二区| 亚洲一区在线观看视频| 欧美变态tickle挠乳网站| av亚洲精华国产精华| 日产国产欧美视频一区精品| 国产精品久久综合| 日韩精品在线看片z| 成人动漫中文字幕| 美腿丝袜亚洲色图| 亚洲丝袜另类动漫二区| 日韩精品一区二区三区在线| 99久久精品99国产精品| 老司机精品视频线观看86 | 久久这里只有精品6| 色哟哟亚洲精品| 国产一区二区日韩精品| 亚洲二区在线观看| 国产精品不卡视频| 精品成人a区在线观看| 欧美三区免费完整视频在线观看| 国产99久久久精品| 久久99国产精品久久| 亚洲综合视频在线| 国产精品久久久久影院| 欧美va亚洲va| 欧美日韩国产在线观看| 色婷婷亚洲婷婷| 不卡电影免费在线播放一区| 国产一区视频网站| 蜜桃av一区二区三区| 亚洲国产另类av| 一区二区三区色| 自拍偷拍国产精品| 中文字幕中文字幕在线一区| 久久婷婷综合激情| 精品免费国产二区三区| 91精品国产91久久综合桃花| 欧美色网站导航| 色婷婷狠狠综合| 91免费视频大全| caoporn国产精品| 成人丝袜视频网| 成人黄色软件下载| 成人深夜在线观看| 国产成人高清在线| 成人午夜免费视频| av成人免费在线观看| 99久久婷婷国产| 色噜噜狠狠色综合欧洲selulu| 91丝袜美女网| 欧洲精品一区二区| 欧美性高清videossexo| 亚洲免费观看高清完整版在线观看熊| 久久免费偷拍视频| 国产欧美综合在线| 国产精品久久久久久亚洲毛片| 欧美国产精品劲爆| 欧美高清在线视频| 亚洲女女做受ⅹxx高潮| 亚洲午夜一区二区三区| 婷婷中文字幕综合| 热久久一区二区| 狠狠色丁香久久婷婷综合_中 | 成人午夜看片网址| 91浏览器打开| 欧美日韩视频在线第一区| 日韩一区二区三| 精品国产欧美一区二区| 亚洲国产高清在线| 伊人色综合久久天天| 日韩高清一区二区| 国产综合色在线| 暴力调教一区二区三区| 欧美色区777第一页| 日韩精品一区二区三区老鸭窝| 久久色在线视频| 亚洲免费看黄网站| 免费人成黄页网站在线一区二区| 国产一区二区在线视频| av在线不卡电影| 欧美久久久久久久久中文字幕| 精品免费99久久| 中文字幕一区三区| 视频在线在亚洲| 丁香六月综合激情| 亚洲在线免费播放| 蜜臀av性久久久久蜜臀av麻豆| 成人一级片网址| 欧美美女一区二区在线观看| 久久久国产一区二区三区四区小说 | 91精品国产综合久久精品麻豆| 精品蜜桃在线看| 一区二区三区在线影院| 美洲天堂一区二卡三卡四卡视频 | 91久久人澡人人添人人爽欧美| 4438x成人网最大色成网站| 久久久蜜臀国产一区二区| 又紧又大又爽精品一区二区| 韩国成人在线视频| 欧美性生活大片视频| 国产三级精品三级| 亚洲成人一二三| 成人激情校园春色| 欧美一区二区黄色| 一区二区三区四区亚洲| 国产传媒一区在线| 欧美一区二区视频观看视频| 亚洲欧洲三级电影| 国模娜娜一区二区三区| 欧美高清视频不卡网| 亚洲色图另类专区| 国产精品亚洲专一区二区三区| 欧美人体做爰大胆视频| 亚洲欧美电影院| 不卡在线视频中文字幕| 精品理论电影在线观看| 亚洲v日本v欧美v久久精品| kk眼镜猥琐国模调教系列一区二区| 日韩视频在线你懂得| 亚洲国产视频在线| av电影一区二区| 国产精品色在线| 国产精品亚洲成人| 欧美大胆人体bbbb| 免费观看成人av| 欧美另类z0zxhd电影| 一区二区三区高清| 91成人国产精品| 一区二区三区中文在线| 91小视频在线| 亚洲黄色性网站| 91久久精品一区二区三| 亚洲丝袜自拍清纯另类| 99久久综合狠狠综合久久| 国产精品三级av| 不卡av免费在线观看| 亚洲欧洲av在线| 99精品久久99久久久久| 国产精品久久久久影视| av亚洲精华国产精华精| 亚洲色图色小说| 欧美在线观看视频一区二区三区| 一区二区三区小说| 欧美三级电影网| 天堂午夜影视日韩欧美一区二区| 欧美麻豆精品久久久久久| 日韩不卡一区二区| 欧美一区二区三区人| 美腿丝袜亚洲三区| wwwwww.欧美系列| 成人免费视频播放| 日韩美女精品在线| 在线中文字幕一区二区| 欧美影视一区在线| 偷拍一区二区三区| 日韩一二在线观看| 国产福利精品导航| 亚洲欧美电影一区二区| 欧美日本国产视频| 国产制服丝袜一区| 亚洲欧美国产毛片在线| 在线不卡免费av| 国产制服丝袜一区| 亚洲少妇最新在线视频| 欧美日韩一区不卡| 久久99久久99小草精品免视看| 国产色一区二区| 91国偷自产一区二区三区成为亚洲经典 | 亚洲精品免费看| 欧美一区日韩一区| 国产a精品视频| 亚洲一区二区三区国产| 久久青草国产手机看片福利盒子| 成人动漫一区二区在线| 日韩电影一二三区| 国产精品短视频|