QP之QEP事件分配流程分析

*********************************1***********************************

QActive *AO_Blinky = &l_blinky.super;

当建立Blinky    l_blinky事件后

typedef struct {
/* protected: */
QActive super;

/* private: */
QTimeEvt timeEvt;
} Blinky;

一个事件包括活动对象和时间事件

执行

void QActive_ctor(QActive * const me, QStateHandler initial) 和

QTimeEvt_ctorX(&me->timeEvt, (QActive *)0, TIMEOUT_SIG, (uint8_t)0);进行时间事件初始化

*********************************1***********************************

*********************************2***********************************

执行QACTIVE_START(AO_Blinky, 1,
blinky_queueSto, Q_DIM(blinky_queueSto),
(void *)0, 1024, (QEvt *)0);启动上一步赋值虚函数表后的QActive_start_函数

过程QActive_start_()---->QHSM_INIT()----->QHsm_init_()------>r = (*me->temp.fun)()前边通过初始化me->temp.fun  = initial;则执行Blinky_initial()将i_blinky中的timeevt中的act和ctr赋值,ctr为QTimeEvt_armX()计数值,在每次QF_tickX_()(只能通过宏QF_TICK_X()调用)调用中,下行计数器减少1。时间事件触发(被发布或发布)时,down-counter达到零。当ctr计数值达到时,在QF_tickX_()函数中调用QACTIVE_POST(act, &t->super, sender)函数即调用QActive_post_()通过调用宏定义QACTIVE_EQUEUE_SIGNAL_(me)即调用

QPSet_insert(&QV_readySet_, (uint_fast8_t)(me_)->prio)函数将事件标志位写1,事件执行结束调用QPSet_remove(&QV_readySet_, p)将标识位清0.

*********************************2***********************************

*********************************3***********************************

在QF_run()死循环中调用QPSet_notEmpty(&QV_readySet_)函数检查标识位

QF_tickX_必须周期性地从定时ISR调用或通过一个任务QTicker_ctor(需定义一个时钟任务)任务中通过QTicker_dispatch_调用QF_tickX_

在qf_port.h中定义QF_INT_ENABLE()和QF_INT_DISABLE()执行中断的开启和关闭保护代码零界段

void SysTick_Handler(void)
{
//printf("systick\n");

#ifdef Q_SPY
{
tmp = SysTick->CTRL; /* clear SysTick_CTRL_COUNTFLAG */
QS_tickTime_ += QS_tickPeriod_; /* account for the clock rollover */
}
#endif

QF_TICK_X(0U, &l_SysTick);
}

在函数SysTick_Handler系统滴答定时器中调用QF_TICK_X()来执行事件的定时分配策略。

*********************************3***********************************

posted @ 2021-05-23 21:33  最好不过如今  阅读(847)  评论(0)    收藏  举报