📄 eventqueue.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 + -