QP-nano  6.9.0
Real-Time Embedded Framework
qfn.h
Go to the documentation of this file.
1
40#ifndef QFN_H
41#define QFN_H
42
50/****************************************************************************/
51#ifndef QF_TIMEEVT_CTR_SIZE
55 #define QF_TIMEEVT_CTR_SIZE 0U
56#endif
57#if (QF_TIMEEVT_CTR_SIZE == 0U)
58 /* no time events */
59#elif (QF_TIMEEVT_CTR_SIZE == 1U)
60 typedef uint8_t QTimeEvtCtr;
61#elif (QF_TIMEEVT_CTR_SIZE == 2U)
75 typedef uint16_t QTimeEvtCtr;
76#elif (QF_TIMEEVT_CTR_SIZE == 4U)
77 typedef uint32_t QTimeEvtCtr;
78#else
79 #error "QF_TIMER_SIZE defined incorrectly, expected 1U, 2U, or 4U"
80#endif
81
82#if (QF_TIMEEVT_CTR_SIZE != 0U)
84 typedef struct {
86#ifdef QF_TIMEEVT_PERIODIC
88#endif /* QF_TIMEEVT_PERIODIC */
89 } QTimer;
90#endif /* (QF_TIMEEVT_CTR_SIZE != 0U) */
91
92#ifndef QF_MAX_TICK_RATE
94 #define QF_MAX_TICK_RATE 1U
95#elif (QF_MAX_TICK_RATE > 4U)
96 #error "QF_MAX_TICK_RATE exceeds the 4U limit"
97#endif
98
99/****************************************************************************/
122typedef struct QActive {
125#if (QF_TIMEEVT_CTR_SIZE != 0U)
128#endif /* (QF_TIMEEVT_CTR_SIZE != 0U) */
129
131 uint8_t prio;
132
134 uint8_t volatile head;
135
137 uint8_t volatile tail;
138
142 uint8_t volatile nUsed;
143
144} QActive;
145
149typedef struct {
152#if (Q_PARAM_SIZE != 0U)
157 bool (*post)(QActive * const me, uint_fast8_t const margin,
158 enum_t const sig, QParam const par);
159
164 bool (*postISR)(QActive * const me, uint_fast8_t const margin,
165 enum_t const sig, QParam const par);
166#else
167 bool (*post) (QActive * const me, uint_fast8_t const margin,
168 enum_t const sig);
169 bool (*postISR)(QActive * const me, uint_fast8_t const margin,
170 enum_t const sig);
171#endif
173
175void QActive_ctor(QActive * const me, QStateHandler initial);
176
177
181#define QF_NO_MARGIN ((uint_fast8_t)0xFF)
182
183#if (Q_PARAM_SIZE != 0U)
201 #define QACTIVE_POST(me_, sig_, par_) do { \
202 QActive * const ao_ = QF_ACTIVE_CAST((me_)); \
203 ((void)(*((QActiveVtable const *)(ao_->super.vptr))->post)( \
204 ao_, QF_NO_MARGIN, (enum_t)(sig_), (QParam)(par_)));\
205 } while (false)
206
230 #define QACTIVE_POST_X(me_, margin_, sig_, par_) \
231 ((*((QActiveVtable const *)((me_)->super.vptr))->post)( \
232 (me_), (margin_), (enum_t)(sig_), (QParam)(par_)))
233
250 #define QACTIVE_POST_ISR(me_, sig_, par_) do { \
251 QActive * const ao_ = QF_ACTIVE_CAST((me_)); \
252 ((void)(*((QActiveVtable const *)(ao_->super.vptr))->postISR)( \
253 ao_, QF_NO_MARGIN, (enum_t)(sig_), (QParam)(par_))); \
254 } while (false)
255
279 #define QACTIVE_POST_X_ISR(me_, margin_, sig_, par_) \
280 ((*((QActiveVtable const *)( \
281 QF_ACTIVE_CAST((me_))->super.vptr))->postISR)( \
282 QF_ACTIVE_CAST((me_)), (margin_), \
283 (enum_t)(sig_), (QParam)(par_)))
284
288 bool QActive_postX_(QActive * const me, uint_fast8_t margin,
289 enum_t const sig, QParam const par);
290
294 bool QActive_postXISR_(QActive * const me, uint_fast8_t margin,
295 enum_t const sig, QParam const par);
296
297#else /* no event parameter */
298
299 #define QACTIVE_POST(me_, sig_) do { \
300 QActive * const ao_ = QF_ACTIVE_CAST((me_)); \
301 ((void)(*((QActiveVtable const *)(ao_->super.vptr))->post)( \
302 ao_, QF_NO_MARGIN, (enum_t)(sig_))); \
303 } while (false)
304
305 #define QACTIVE_POST_X(me_, margin_, sig_) \
306 ((*((QActiveVtable const *)((me_)->super.vptr))->post)((me_), \
307 (margin_), (sig_)))
308
309 bool QActive_postX_(QActive * const me, uint_fast8_t margin,
310 enum_t const sig);
311
312 #define QACTIVE_POST_ISR(me_, sig_) do { \
313 QActive * const ao_ = QF_ACTIVE_CAST((me_)); \
314 ((void)(*((QActiveVtable const *)(ao_->super.vptr))->postISR)( \
315 ao_, QF_NO_MARGIN, (enum_t)(sig_))); \
316 } while (false)
317
318 #define QACTIVE_POST_X_ISR(me_, margin_, sig_) \
319 ((*((QActiveVtable const *)( \
320 QF_ACTIVE_CAST((me_))->super.vptr))->postISR)( \
321 QF_ACTIVE_CAST((me_)), (margin_), (enum_t)(sig_)))
322
323 bool QActive_postXISR_(QActive * const me, uint_fast8_t margin,
324 enum_t const sig);
325#endif
326
327#if (QF_TIMEEVT_CTR_SIZE != 0U)
328
330 void QF_tickXISR(uint_fast8_t const tickRate);
331
332#ifdef QF_TIMEEVT_PERIODIC
336 void QActive_armX(QActive * const me, uint_fast8_t const tickRate,
337 QTimeEvtCtr const nTicks, QTimeEvtCtr const interval);
338#else
342 void QActive_armX(QActive * const me, uint_fast8_t const tickRate,
343 QTimeEvtCtr const nTicks);
344#endif
345
349 void QActive_disarmX(QActive * const me, uint_fast8_t const tickRate);
350
351#endif /* (QF_TIMEEVT_CTR_SIZE != 0U) */
352
353
354/****************************************************************************/
355/* QF-nano protected methods ...*/
356
358void QF_init(uint_fast8_t maxActive);
359
368void QF_stop(void);
369
379void QF_onStartup(void);
380
382int_t QF_run(void);
383
384
385/****************************************************************************/
397typedef struct {
400 uint8_t qlen;
401} QActiveCB;
402
404/*lint -save -e9067 MISRA-C:2012 Rule 8.11, extern array declared without size */
405extern QActiveCB const Q_ROM QF_active[];
406/*lint -restore */
407
409extern uint_fast8_t QF_maxActive_;
410
412extern uint_fast8_t volatile QF_readySet_;
413
414#ifndef QF_LOG2
415
420 extern uint8_t const Q_ROM QF_log2Lkup[16];
421
422#endif
423
424
425#ifdef QF_TIMEEVT_USAGE
426
428 extern uint_fast8_t volatile QF_timerSetX_[QF_MAX_TICK_RATE];
429
430#endif /* QF_TIMEEVT_USAGE */
431
432
434extern uint8_t const Q_ROM QF_invPow2Lkup[9];
435
436
437/****************************************************************************/
442#define QF_ROM_QUEUE_AT_(ao_, i_) (((QEvt *)Q_ROM_PTR((ao_)->queue))[(i_)])
443
448#define QF_ROM_ACTIVE_GET_(p_) ((QActive *)Q_ROM_PTR(QF_active[(p_)].act))
449
456#define QF_ACTIVE_CAST(a_) ((QActive *)(a_))
457
458#endif /* QFN_H */
459
#define Q_ROM
Definition: qassert.h:90
int int_t
Definition: qassert.h:86
uint16_t QParam
Definition: qepn.h:103
QState(* QStateHandler)(void *const me)
Definition: qepn.h:158
int enum_t
Definition: qepn.h:76
Definition: qepn.h:131
void QF_onStartup(void)
QActiveCB const Q_ROM QF_active[]
active object control blocks
void QF_init(uint_fast8_t maxActive)
Definition: qfn.c:315
uint_fast8_t volatile QF_readySet_
Definition: qfn.c:65
uint_fast8_t QF_maxActive_
Definition: qfn.c:53
#define QF_MAX_TICK_RATE
Definition: qfn.h:94
void QF_tickXISR(uint_fast8_t const tickRate)
Definition: qfn.c:398
uint16_t QTimeEvtCtr
Definition: qfn.h:75
QTimeEvtCtr interval
Definition: qfn.h:87
QActive * act
Definition: qfn.h:398
uint8_t qlen
Definition: qfn.h:400
int_t QF_run(void)
Definition: qkn.c:121
uint8_t const Q_ROM QF_log2Lkup[16]
Definition: qfn.c:89
QTimeEvtCtr nTicks
Definition: qfn.h:85
QEvt * queue
Definition: qfn.h:399
void QF_stop(void)
uint_fast8_t volatile QF_timerSetX_[QF_MAX_TICK_RATE]
Definition: qfn.c:85
uint8_t const Q_ROM QF_invPow2Lkup[9]
Definition: qfn.h:397
Definition: qfn.h:84
Definition: qfn.h:122
void QActive_ctor(QActive *const me, QStateHandler initial)
Definition: qfn.c:99
uint8_t volatile nUsed
Definition: qfn.h:142
QHsm super
derives from the QHsm base class
Definition: qfn.h:123
bool QActive_postX_(QActive *const me, uint_fast8_t margin, enum_t const sig, QParam const par)
Definition: qfn.c:143
uint8_t volatile head
Definition: qfn.h:134
uint8_t prio
Definition: qfn.h:131
void QActive_disarmX(QActive *const me, uint_fast8_t const tickRate)
Definition: qfn.c:495
uint8_t volatile tail
Definition: qfn.h:137
void QActive_armX(QActive *const me, uint_fast8_t const tickRate, QTimeEvtCtr const nTicks, QTimeEvtCtr const interval)
Definition: qfn.c:462
QTimer tickCtr[QF_MAX_TICK_RATE]
Definition: qfn.h:127
bool QActive_postXISR_(QActive *const me, uint_fast8_t margin, enum_t const sig, QParam const par)
Definition: qfn.c:229
QHsmVtable super
Definition: qfn.h:150
Definition: qepn.h:183