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

📄 eventqueue.c

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

DEFINE_THIS_FILE

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

EVENT_SIG EvtQueSigBuf1[PRIO1_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf2[PRIO2_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf3[PRIO3_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf4[PRIO4_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf5[PRIO5_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf6[PRIO6_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf7[PRIO7_EVT_BUF_SIZE];
EVENT_SIG EvtQueSigBuf8[PRIO8_EVT_BUF_SIZE];

#if (EVENT_PARAM_SIZE != 0)
EVENT_PARAM EvtQueParBuf1[PRIO1_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf2[PRIO2_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf3[PRIO3_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf4[PRIO4_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf5[PRIO5_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf6[PRIO6_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf7[PRIO7_EVT_BUF_SIZE];
EVENT_PARAM EvtQueParBuf8[PRIO8_EVT_BUF_SIZE];
#endif

const EVTQ * ActObjEvtQList[9] = {
    (EVTQ *)0,        
    (EVTQ *)&ActObjEvtQ1,//最低优先级
    (EVTQ *)&ActObjEvtQ2,
    (EVTQ *)&ActObjEvtQ3,
    (EVTQ *)&ActObjEvtQ4,
    (EVTQ *)&ActObjEvtQ5,
    (EVTQ *)&ActObjEvtQ6,
    (EVTQ *)&ActObjEvtQ7,
    (EVTQ *)&ActObjEvtQ8 //最高优先级
};

/***********************************************************************
函数原型:void EvtPostQue(INT8U prio,INT8U sig,Param par) 
功能说明:向队列发送事件信号,如果当前q->EvtQNRead == 0,则(((SM_STRU *)(me_))->Sig_) = sig,
          否则放在队列中
***********************************************************************
*/
#if (EVENT_PARAM_SIZE != 0)
void EvtPostQue(INT8U prio,EVENT_SIG sig,EVENT_PARAM par) 
#else
void EvtPostQue(INT8U prio,EVENT_SIG sig) 
#endif
{
    SM_STRU  *a;
    EVTQ *q;
    a  = (SM_STRU *)ActObjList[prio];
    q  = (EVTQ *)ActObjEvtQList[prio];
    OS_ENTER_CRITICAL();
    if(q->EvtQNRead == 0){
        ++q->EvtQNRead;
        SIG(a) = sig;
        #if (EVENT_PARAM_SIZE != 0)
        PAR(a) = par;
        #endif
        ActObjReadyList |= READY_SET_OR[prio]; //置就绪 prio
    }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();
}

#if (EVENT_PARAM_SIZE != 0)
void EvtPostQueISR(INT8U prio,EVENT_SIG sig,EVENT_PARAM par) 
#else
void EvtPostQueISR(INT8U prio,EVENT_SIG sig) 
#endif
{
    SM_STRU  *a;
    EVTQ *q;
    a  = (SM_STRU *)ActObjList[prio];
    q  = (EVTQ *)ActObjEvtQList[prio];
    if(q->EvtQNRead == 0){
        ++q->EvtQNRead;
        SIG(a) = sig;
        #if (EVENT_PARAM_SIZE != 0)
        PAR(a) = par;
        #endif
        ActObjReadyList |= READY_SET_OR[prio];       //置就绪 prio
    }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;                         
        }  
    }
}

/***********************************************************************
函数原型:void EvtQueClr(INT8U prio) 请慎用本函数
功能说明:清空事件队列 注:只能在线程中调用,不能在初始化时调用。
          第一次被ActObjInitTran调度一次的状态函数的进入动作不能调用
***********************************************************************
*/
void EvtQueClr(INT8U prio)
{
    EVTQ *q;
    q  = (EVTQ *)ActObjEvtQList[prio];
    OS_ENTER_CRITICAL();
    q-> EvtQInIx = 0;
    q-> EvtQOutIx= 0;
    q-> EvtQNRead= 1;//因为在调度中CALL本函数,所以不能清零
    OS_EXIT_CRITICAL();
}

void EvtQueInit(void)
{
    EVTQ *q;
    INT8U i;
    for(i=1;i<9;i++){
        q  = (EVTQ *)ActObjEvtQList[i];
        q-> EvtQInIx = 0;
        q-> EvtQOutIx= 0;
        q-> EvtQNRead= 0;
    }
    ActObjEvtQ1.EvtBufSize = PRIO1_EVT_BUF_SIZE;
    ActObjEvtQ2.EvtBufSize = PRIO2_EVT_BUF_SIZE;
    ActObjEvtQ3.EvtBufSize = PRIO3_EVT_BUF_SIZE;
    ActObjEvtQ4.EvtBufSize = PRIO4_EVT_BUF_SIZE;
    ActObjEvtQ5.EvtBufSize = PRIO5_EVT_BUF_SIZE;
    ActObjEvtQ6.EvtBufSize = PRIO6_EVT_BUF_SIZE;
    ActObjEvtQ7.EvtBufSize = PRIO7_EVT_BUF_SIZE;
    ActObjEvtQ8.EvtBufSize = PRIO8_EVT_BUF_SIZE;
    
    ActObjEvtQ1.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf1[0];
    ActObjEvtQ2.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf2[0];
    ActObjEvtQ3.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf3[0];
    ActObjEvtQ4.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf4[0];
    ActObjEvtQ5.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf5[0];
    ActObjEvtQ6.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf6[0];
    ActObjEvtQ7.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf7[0];
    ActObjEvtQ8.EvtQueSigPtr = (EVENT_SIG *)&EvtQueSigBuf8[0];
    
    #if (EVENT_PARAM_SIZE != 0)
    ActObjEvtQ1.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf1[0];
    ActObjEvtQ2.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf2[0];
    ActObjEvtQ3.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf3[0];
    ActObjEvtQ4.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf4[0];
    ActObjEvtQ5.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf5[0];
    ActObjEvtQ6.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf6[0];
    ActObjEvtQ7.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf7[0];
    ActObjEvtQ8.EvtQueParPtr = (EVENT_SIG *)&EvtQueParBuf8[0];
    #endif
}    
 

⌨️ 快捷键说明

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