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