⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventdefer.c

📁 嵌入式软件构件:TMR计时器管理、CLK实时时钟、KEY键盘扫描、LED数码显示、LCD显示、COMM串口通信
💻 C
字号:
/********************************************************************************************************
* Filename   : EventDefer.C
* Programmer : Haven
**Date       : 2008.2.20
* 描述       :事件延迟     
*********************************************************************************************************
*/
#define  FK_EVENTDEFER_GLOBALS
#include "..\includes\includes.h"
#if EVENTDEFER_EN
DEFINE_THIS_FILE

extern const SM_STRU * ActObjList[9];
extern const INT8U   READY_CLR_AND[];
extern const INT8U   READY_SET_OR[];

EVENT_SIG EvtQDeferSigBuf1[PRIO1_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf2[PRIO2_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf3[PRIO3_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf4[PRIO4_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf5[PRIO5_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf6[PRIO6_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf7[PRIO7_DEFER_BUF_SIZE];
EVENT_SIG EvtQDeferSigBuf8[PRIO8_DEFER_BUF_SIZE];

#if (EVENT_PARAM_SIZE != 0)
EVENT_PARAM EvtQDeferParBuf1[PRIO1_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf2[PRIO2_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf3[PRIO3_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf4[PRIO4_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf5[PRIO5_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf6[PRIO6_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf7[PRIO7_DEFER_BUF_SIZE];
EVENT_PARAM EvtQDeferParBuf8[PRIO8_DEFER_BUF_SIZE];
#endif

const EVTQ * EvtQDeferList[9] = {
    (EVTQ *)0,        
    (EVTQ *)&EvtDeferQ1,//最低优先级
    (EVTQ *)&EvtDeferQ2,
    (EVTQ *)&EvtDeferQ3,
    (EVTQ *)&EvtDeferQ4,
    (EVTQ *)&EvtDeferQ6,
    (EVTQ *)&EvtDeferQ5,
    (EVTQ *)&EvtDeferQ7,
    (EVTQ *)&EvtDeferQ8 //最高优先级
};

STAT_PTR GetState(INT8U prio)
{
    SM_STRU   *a;
    STAT_PTR s;
    a  = (SM_STRU *)ActObjList[prio];
    s = (STAT_PTR)(a->StatFunPtr);
    return (s);
}
    
/***********************************************************************
函数原型:BOOLEAN EvtDefer(INT8U prio,EVENT_SIG sig)
功能说明:把事件信号放入 延迟事件队列
调用方法
if(GetState(prio) == &Com2Rx){
    EvtPostQue(prio,sig);
}else{
    EvtDefer(prio,sig);
}
***********************************************************************
*/
#if (EVENT_PARAM_SIZE != 0)
BOOLEAN EvtDefer(INT8U prio,EVENT_SIG sig,EVENT_PARAM par) 
#else
BOOLEAN EvtDefer(INT8U prio,EVENT_SIG sig) 
#endif
{
    EVTQ *q;
    q  = (EVTQ *)EvtQDeferList[prio];
    OS_ENTER_CRITICAL();
    if(q->EvtQNRead > q->EvtBufSize){
        OS_EXIT_CRITICAL();
        return (FALSE);
    }else{
        ASSERT(q->EvtQNRead < q->EvtBufSize);//断言
        ++q->EvtQNRead; 
        q->EvtQueSigPtr[q->EvtQInIx]   = sig;
        #if (EVENT_PARAM_SIZE != 0)
        q->EvtQueParPtr[q->EvtQInIx] = par;
        #endif
        ++q->EvtQInIx;
        if (q->EvtQInIx == q->EvtBufSize) {
            q->EvtQInIx = 0;  
        }
        OS_EXIT_CRITICAL();
        return (TRUE);
    }
}
/***********************************************************************
函数原型:void EvtRecall(INT8U prio);
功能说明:从延迟队列唤醒延迟事件
在空闲状态函数的进入动作中调用
***********************************************************************
*/
void EvtRecall(INT8U prio)
{
    EVTQ *q;
    EVENT_SIG e;
    #if (EVENT_PARAM_SIZE != 0)
    EVENT_PARAM par;
    #endif
    q  = (EVTQ *)EvtQDeferList[prio];
    OS_ENTER_CRITICAL();
    if(q->EvtQNRead != 0){
        --q->EvtQNRead;
        e   = q->EvtQueSigPtr[q->EvtQOutIx];
        #if (EVENT_PARAM_SIZE != 0)
        par = q->EvtQueParPtr[q->EvtQOutIx];
        #endif
        #if (EVENT_PARAM_SIZE != 0)
        EvtPostQueISR(prio,e,par);
        #else
        EvtPostQueISR(prio,e);
        #endif
        ++q->EvtQOutIx;
        if(q->EvtQOutIx == q->EvtBufSize) {
            q->EvtQOutIx = 0;  
        }
    }    
    OS_EXIT_CRITICAL();
}
/***********************************************************************
函数原型:void EvtDeferClr(INT8U prio)
功能说明:清空事件队列
***********************************************************************
*/
void EvtDeferClr(INT8U prio)
{
    EVTQ *q;
    q  = (EVTQ *)EvtQDeferList[prio];
    OS_ENTER_CRITICAL();
    q-> EvtQInIx = 0;
    q-> EvtQOutIx= 0;
    q-> EvtQNRead= 0;
    OS_EXIT_CRITICAL();
}
void EvtDeferInit(void)
{
    EVTQ *q;
    INT8U i;
    for(i=1;i<9;i++){
        q  = (EVTQ *)EvtQDeferList[i];
        q-> EvtQInIx = 0;
        q-> EvtQOutIx= 0;
        q-> EvtQNRead= 0;
    }    
    EvtDeferQ1.EvtBufSize = PRIO1_DEFER_BUF_SIZE;
    EvtDeferQ2.EvtBufSize = PRIO2_DEFER_BUF_SIZE;
    EvtDeferQ3.EvtBufSize = PRIO3_DEFER_BUF_SIZE;
    EvtDeferQ4.EvtBufSize = PRIO4_DEFER_BUF_SIZE;
    EvtDeferQ5.EvtBufSize = PRIO5_DEFER_BUF_SIZE;
    EvtDeferQ6.EvtBufSize = PRIO6_DEFER_BUF_SIZE;
    EvtDeferQ7.EvtBufSize = PRIO7_DEFER_BUF_SIZE;
    EvtDeferQ8.EvtBufSize = PRIO8_DEFER_BUF_SIZE;
    
    EvtDeferQ1.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf1[0];
    EvtDeferQ2.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf2[0];
    EvtDeferQ3.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf3[0];
    EvtDeferQ4.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf4[0];
    EvtDeferQ5.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf5[0];
    EvtDeferQ6.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf6[0];
    EvtDeferQ7.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf7[0];
    EvtDeferQ8.EvtQueSigPtr = (EVENT_SIG *)&EvtQDeferSigBuf8[0];
    
    #if (EVENT_PARAM_SIZE != 0)
    EvtDeferQ1.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf1[0];
    EvtDeferQ2.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf2[0];
    EvtDeferQ3.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf3[0];
    EvtDeferQ4.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf4[0];
    EvtDeferQ5.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf5[0];
    EvtDeferQ6.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf6[0];
    EvtDeferQ7.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf7[0];
    EvtDeferQ8.EvtQueParPtr = (EVENT_SIG *)&EvtQDeferParBuf8[0];
    #endif
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -