QP/C 8.1.1
Real-Time Event Framework
Loading...
Searching...
No Matches
qp_port.h
Go to the documentation of this file.
1/*! @file
2@code_uid{qp_port.h, Sample @QPX port}
3@code_litem{Details}
4This is just an example of a QF port for a generic C11 compiler. Other specific QF ports will define the QF facilities differently.
5@endcode_uid
6*/
7#ifndef QP_PORT_H_
8#define QP_PORT_H_
9
10#include <stdint.h> // Exact-width types. WG14/N843 C99-C11 Standard
11#include <stdbool.h> // Boolean type. WG14/N843 C99-C11 Standard
12
13/*!
14@code_uid{#Q_NORETURN, No-return specifier for the Q_onError() callback function.}
15@code_litem{Details}
16Per the Software Safety Requirement @ref SSR_QA_FDM_20, the Q_onError() handler should never return. Starting with the C99 Standard, the no-return specification can be provided at the language level, which may allow the compiler to apply optimizations (e.g., for impossible code paths downstream of Q_onError()). Also, the no-return specification is immensely valuable for static analysis tools. Unfortunately, MISRA-C:2025 still considers the specifier `_Noreturn` as an "emergent language feature", which should not be used (MISRA-C:2025 Rule 1.4, Required). The #Q_NORETURN macro encapsulates this deviation.
17@note
18If the `Q_NORETURN` macro is not defined in the QP port (`qf_port.h`), the default will be the C99 specifier `_Noreturn` applied in `qsafe.h`.
19@code_bw_trace{brief}
20- @tr{SSR_QA_FDM_20}: <i>@QPX Application shall implement custom error handler such that it does <u>not return</u>.</i>
21@code_fw_trace
22- @tr{SSM_QA_CSOU_21}: <i>Mandate: @QPX Application must ensure that the Q_onError() Custom Error Handler does <u>not return</u>.</i>
23@endcode_uid
24*/
25#define Q_NORETURN _Noreturn void
26
27// QF configuration for the data members of the QActive class ----------------
28/*!
29@code_uid{QACTIVE_EQUEUE_TYPE, Port-specific ::QActive event queue type.}
30@code_fw_trace
31@endcode_uid
32*/
33#define QACTIVE_EQUEUE_TYPE QEQueue
34
35/*!
36@code_uid{QACTIVE_OS_OBJ_TYPE, Port-specific ::QActive "OS-object" type.}
37@code_fw_trace
38@endcode_uid
39*/
40#define QACTIVE_OS_OBJ_TYPE void*
41
42/*!
43@code_uid{QACTIVE_THREAD_TYPE, Port-specific ::QActive thread type.}
44@code_fw_trace
45@endcode_uid
46*/
47#define QACTIVE_THREAD_TYPE void const *
48
49// interrupt disabling mechanism ---------------------------------------------
50/*!
51@code_uid{QF_INT_DISABLE(), Port-specific interrupt disable}
52@code_fw_trace
53- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
54@endcode_uid
55*/
56#define QF_INT_DISABLE() intDisable()
57
58/*!
59@code_uid{QF_INT_ENABLE(), Port-specific interrupt enable}
60@code_fw_trace
61- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
62@endcode_uid
63*/
64#define QF_INT_ENABLE() intEnable()
65
66// QF critical section mechanism ---------------------------------------------
67/*!
68@code_uid{#QF_CRIT_STAT, Define the critical section status that was present before entering the critical section.}
69@code_litem{Details}
70For critical sections that are allowed to nest, the critical section status must be saved and restored at the end. This macro provides the storage for saving the status.
71@note
72This macro might be empty, in which case, the critical section status is not saved or restored. Such critical sections won't be able to nest. Also, note that the macro should be invoked without the closing semicolon.
73@code_fw_trace
74@endcode_uid
75*/
76#define QF_CRIT_STAT crit_stat_t crit_stat_;
77
78/*!
79@code_uid{QF_CRIT_ENTRY(), Port-specific critical section entry}
80@code_litem{Details}
81If the critical section status is provided, the macro saves the critical section status from before entering the critical section. Otherwise, the macro just unconditionally enters the critical section without saving the status.
82@code_fw_trace
83- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
84@endcode_uid
85*/
86#define QF_CRIT_ENTRY() (crit_stat_ = critEntry())
87
88/*!
89@code_uid{QF_CRIT_EXIT(), Port-specific critical section exit}
90@code_litem{Details}
91If the critical section status is provided, the macro restores the critical section status saved by QF_CRIT_ENTRY(). Otherwise, the macro just unconditionally exits the critical section.
92@code_fw_trace
93- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
94@endcode_uid
95*/
96#define QF_CRIT_EXIT() critExit(crit_stat_)
97
98/*!
99@code_uid{QF_CRIT_EXIT_NOP(), No-operation for exiting a critical section}
100@code_litem{Details}
101In some QF ports, the critical section exit takes effect only on the next machine instruction. If this next instruction is another entry to a critical section, the critical section won't be exited, but rather the two adjacent critical sections would be _merged_. The QF_CRIT_EXIT_NOP() macro contains minimal code required to prevent such merging of critical sections in QF ports.
102@code_fw_trace
103- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
104@endcode_uid
105*/
106#define QF_CRIT_EXIT_NOP() __asm volatile ("isb" ::: "memory")
107
108/*!
109@code_uid{QF_CRIT_EST(), Port-specific establishing a critical section (without saving the status)}
110@code_litem{Details}
111This port-specific macro only establishes a critical section (to later call Q_onError() error handler), but since Q_onError() never returns, there is no need to exit such established critical section.
112@code_fw_trace
113- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
114@endcode_uid
115*/
116#define QF_CRIT_EST() ((void)critEntry())
117
118/*!
119@code_uid{QF_LOG2(), Port-specific integer log-base-2 of a 32-bit bitmask}
120@code_litem{Details}
121Calculate integer log-base-2 of a given bitmask (1-based) used to quickly determine the higest-number 1-bit in the bitmask. This operation is used frequently during task scheduling and publish-subscribe.
122@param[in] bitmask_ 32-bit bitmask
123@returns 1-based integer log-base-2 of the provided bitmask. Examples:
124- QF_LOG2(0x00000000U) == 0U
125- QF_LOG2(0x00000001U) == 1U
126- QF_LOG2(0x00000002U) == 2U
127- QF_LOG2(0x00000004U) == 3U
128- QF_LOG2(0x00000008U) == 4U
129- QF_LOG2(0x00000010U) == 5U
130...
131- QF_LOG2(0x80000010U) == 32U
132
133@note
134This operation is performed frequently in time-critical parts of the code. Some CPUs provide such calculation in hardware (e.g., as a machine intruction). For example, ARMv7 and higher architectures support the related CLZ (count leading zeroes) instruction, with the following relationship:
135QF_LOG2(bitmask_) == 32U - CLZ(bitmask_).
136@code_fw_trace
137- @tr{DVR_QP_MC5_D4_9B}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (CORRECT diagnostics)</i>
138@endcode_uid
139*/
140#define QF_LOG2(bitmask_) QF_qlog2((uint32_t)(bitmask_))
141
142//typedef unsigned int crit_stat_t;
143//crit_stat_t critEntry(void);
144//void critExit(crit_stat_t stat);
145
146#ifdef QF_MEM_ISOLATE
147
148 /*!
149 @code_uid{QF_ON_CONTEXT_SW, Enable memory isolation requires the context-switch}
150 @code_fw_trace
151 @endcode_uid
152 */
153 #define QF_ON_CONTEXT_SW 1U
154
155 /*!
156 @code_uid{QF_MEM_SYS(), Port-specific establishing _System Context_ for memory protection}
157 @code_fw_trace
158 - @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
159 @endcode_uid
160 */
161 #define QF_MEM_SYS() QF_onMemSys()
162
163 /*!
164 @code_uid{QF_MEM_APP(), Port-specific establishing _Application Context_ for memory protection}
165 @code_fw_trace
166 - @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
167 @endcode_uid
168 */
169 #define QF_MEM_APP() QF_onMemApp()
170
171#endif // QF_MEM_ISOLATE
172
173// QV-specific ---------------------------------------------------------------
174/*!
175@code_uid{QV_CPU_SLEEP(), Port-specific method to put the CPU to sleep __safely__ in the non-preemptive QV kernel (to be called from QV::QV_onIdle()).}
176@code_fw_trace
177- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
178@endcode_uid
179*/
180#define QV_CPU_SLEEP() \
181do { \
182 __disable_interrupt(); \
183 QF_INT_ENABLE(); \
184 __WFI(); \
185 __enable_interrupt(); \
186} while (false)
187
188
189// QK-specific ---------------------------------------------------------------
190/*!
191@code_uid{QK_ISR_CONTEXT_(), Port-specific method to check if the QK kernel executes in the ISR context (used internally in QK only).}
192@returns `true` if the caller executes in the ISR context and `false` otherwise
193@code_fw_trace
194- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
195@endcode_uid
196*/
197#define QK_ISR_CONTEXT_() (QK_priv_.intNest != 0U)
198
199/*!
200@code_uid{QK_ISR_ENTRY(), Port-specific method to inform QK kernel about the ISR entry.}
201@code_fw_trace
202- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
203@endcode_uid
204*/
205#define QK_ISR_ENTRY() \
206do { \
207 QF_INT_DISABLE(); \
208 ++QK_priv_.intNest; \
209 QF_QS_ISR_ENTRY(QK_priv_.intNest, QK_currPrio_); \
210 QF_INT_ENABLE(); \
211} while (false)
212
213/*!
214@code_uid{QK_ISR_EXIT(), Port-specific method to inform QK kernel about the ISR exit.}
215@code_fw_trace
216- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
217@endcode_uid
218*/
219#define QK_ISR_EXIT() \
220do { \
221 QF_INT_DISABLE(); \
222 --QK_priv_.intNest; \
223 if (QK_priv_.intNest == 0U) { \
224 if (QK_sched_() != 0U) { \
225 QK_activate_(); \
226 } \
227 } \
228 QF_INT_ENABLE(); \
229} while (false)
230
231// QXK-specific --------------------------------------------------------------
232/*!
233@code_uid{QXK_ISR_CONTEXT_(), Port-specific method to check if the QXK kernel executes in the ISR context (used internally in QXK only).}
234@returns `true` if the caller executes in the ISR context and `false` otherwise
235@code_fw_trace
236- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
237@endcode_uid
238*/
239#define QXK_ISR_CONTEXT_() (QXK_get_IPSR() != 0U)
240
241/*!
242@code_uid{QXK_CONTEXT_SWITCH_(), Port-specific method to trigger context switch (used internally in QXK only).}
243@code_fw_trace
244- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
245@endcode_uid
246*/
247#define QXK_CONTEXT_SWITCH_() (trigPendSV())
248
249/*!
250@code_uid{QXK_ISR_ENTRY(), Port-specific method to inform QXK kernel about the ISR entry.}
251@code_fw_trace
252- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
253@endcode_uid
254*/
255#define QXK_ISR_ENTRY() ((void)0)
256
257/*!
258@code_uid{QXK_ISR_EXIT(), Port-specific method to inform QXK kernel about the ISR exit.}
259@code_fw_trace
260- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
261@endcode_uid
262*/
263#define QXK_ISR_EXIT() do { \
264 QF_INT_DISABLE(); \
265 if (QXK_sched_() != 0U) { \
266 *Q_UINT2PTR_CAST(uint32_t, 0xE000ED04U) = (1U << 28U);\
267 } \
268 QF_INT_ENABLE(); \
269 QXK_ARM_ERRATUM_838869(); \
270} while (false)
271
272// Scheduling locking port interface (example) -------------------------------
273/*!
274@code_uid{QF_SCHED_STAT_, Port-specific type of the scheduler lock status (for internal use in QF only).}
275@code_fw_trace
276@endcode_uid
277*/
278#define QF_SCHED_STAT_ QSchedStatus lockStat_;
279
280/*!
281@code_uid{QF_SCHED_LOCK_(), Port-specific method to lock the scheduler (for internal use in QF only).}
282@param[in] ceil_ priority-ceiling up to which the scheduler should be locked
283@code_fw_trace
284- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
285@endcode_uid
286*/
287#define QF_SCHED_LOCK_(ceil_) do { \
288 if (QK_ISR_CONTEXT_()) { \
289 lockStat_ = 0xFFU; \
290 } else { \
291 lockStat_ = QK_schedLock((ceil_)); \
292 } \
293} while (false)
294
295/*!
296@code_uid{QF_SCHED_UNLOCK_(), Port-specific method to unlock the scheduler (for internal use in QF only).}
297@code_fw_trace
298- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
299@endcode_uid
300*/
301#define QF_SCHED_UNLOCK_() do { \
302 if (lockStat_ != 0xFFU) { \
303 QK_schedUnlock(lockStat_); \
304 } \
305} while (false)
306
307// Event-Queue port interface (example) --------------------------------------
308// QActive event queue customization...
309/*!
310@code_uid{QACTIVE_EQUEUE_WAIT_(), Port-specific method to wait on an empty Active Object event queue (for internal use only).}
311@param[in,out] me_ current instance pointer (see @ref SAS_QP_OO)
312@code_fw_trace
313- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
314@endcode_uid
315*/
316#define QACTIVE_EQUEUE_WAIT_(me_) ((void)0)
317
318/*!
319@code_uid{QACTIVE_EQUEUE_SIGNAL_(), Port-specific method to signal Active Object event queue (for internal use only).}
320@param[in,out] me_ current instance pointer (see @ref SAS_QP_OO)
321@code_fw_trace
322- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
323@endcode_uid
324*/
325#define QACTIVE_EQUEUE_SIGNAL_(me_) do { \
326 QPSet_insert(&QK_priv_.readySet, (uint_fast8_t)(me_)->prio); \
327 QPSet_update_(&QK_priv_.readySet, &QK_priv_.readySet_dis); \
328 if (!QK_ISR_CONTEXT_()) { \
329 if (QK_sched_() != 0U) { \
330 QK_activate_(); \
331 } \
332 } \
333} while (false)
334
335/*!
336@code_uid{QXTHREAD_EQUEUE_SIGNAL_(), Port-specific method to signal eXtended thread event queue (for internal use only).}
337@param[in,out] me_ current instance pointer (see @ref SAS_QP_OO)
338@code_fw_trace
339- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
340@endcode_uid
341*/
342#define QXTHREAD_EQUEUE_SIGNAL_(me_) do { \
343 if (me->super.temp.obj == QXK_PTR_CAST_(QMState*, &me->eQueue)) { \
344 (void)QXThread_teDisarm_(QXTHREAD_CAST_(me)); \
345 QPSet_insert(&QXK_priv_.readySet, (uint_fast8_t)me->prio); \
346 QPSet_update_(&QXK_priv_.readySet, &QXK_priv_.readySet_dis); \
347 if (!QXK_ISR_CONTEXT_()) { \
348 (void)QXK_sched_(); \
349 } \
350 } \
351} while (false)
352
353// Event-Pool port interface (example) ---------------------------------------
354/*!
355@code_uid{QF_EPOOL_TYPE_, Port-specific type of the event pool (for internal use in QF only).}
356@code_fw_trace
357@endcode_uid
358*/
359#define QF_EPOOL_TYPE_ QMPool
360
361/*!
362@code_uid{QF_EPOOL_INIT_(), Port-specific event pool initialization (for internal use in QF only).}
363@param[in,out] p_ event pool pointer
364@param[in] poolSto_ storage for the pool (pointer to the pool buffer)
365@param[in] poolSize_ size of the pool storage in [bytes]
366@param[in] evtSize_ event size of this pool in [bytes]
367@code_fw_trace
368- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
369@endcode_uid
370*/
371#define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) \
372 (QMPool_init(&(p_), (poolSto_), (poolSize_), (evtSize_)))
373
374/*!
375@code_uid{QF_EPOOL_EVENT_SIZE_(), Port-specific event pool block-size() operation (for internal use in QF only).}
376@param[in,out] p_ event pool pointer
377@code_fw_trace
378- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
379@endcode_uid
380*/
381#define QF_EPOOL_EVENT_SIZE_(p_) ((uint16_t)(p_).blockSize)
382
383/*!
384@code_uid{QF_EPOOL_GET_(), Port-specific event pool get() operation (for internal use in QF only).}
385@param[in,out] p_ event pool pointer
386@param[out] e_ event pointer to be assigned the obtained event
387@param[in] m_ marign (# free events that must still remain in the pool)
388@param[in] qsId_ QS ID for the QS local filter
389@code_fw_trace
390- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
391- @tr{DVR_QP_MC5_R11_5}: <i>MISRA-C:2025 Rule 11.5(Advisory): A conversion should not be performed from pointer to void into pointer to object</i>
392@endcode_uid
393*/
394#define QF_EPOOL_GET_(p_, e_, m_, qsId_) \
395 ((e_) = (QEvt *)QMPool_get(&(p_), (m_), (qsId_)))
396
397/*!
398@code_uid{QF_EPOOL_PUT_(), Port-specific event pool put() operation (for internal use in QF only).}
399@param[in,out] p_ event pool pointer
400@param[out] e_ event pointer to return to the pool
401@param[in] qsId_ QS ID for the QS local filter
402@code_fw_trace
403- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
404@endcode_uid
405*/
406#define QF_EPOOL_PUT_(p_, e_, qsId_) (QMPool_put(&(p_), (e_), (qsId_)))
407
408/*!
409@code_uid{QF_EPOOL_USE_(), Port-specific event pool # used events operation (for internal use in QF only).}
410@param[in] ePool_ event pool pointer
411@returns # used events in the pool at this moment (allocated and not returned yet)
412@code_fw_trace
413- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
414@endcode_uid
415*/
416#define QF_EPOOL_USE_(ePool_) (QMPool_getUse(ePool_))
417
418/*!
419@code_uid{QF_EPOOL_FREE_(), Port-specific event pool # free events operation (for internal use in QF only).}
420@param[in] ePool_ event pool pointer
421@returns # free events in the pool at this moment (available to allocate)
422@code_fw_trace
423- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
424@endcode_uid
425*/
426#define QF_EPOOL_FREE_(ePool_) ((uint16_t)(ePool_)->nFree)
427
428/*!
429@code_uid{QF_EPOOL_MIN_(), Port-specific event pool minimum # events since initialization (for internal use in QF only).}
430@param[in] ePool_ event pool pointer
431@returns minimal # free events in the pool since initialization
432@code_fw_trace
433- @tr{DVR_QP_MC5_D4_9A}: <i>MISRA-C:2025 Directive 4.9(Advisory): A function should be used in preference to a function-like macro where they are interchangeable (FALSE-POSITIVE diagnostics)</i>
434@endcode_uid
435*/
436#define QF_EPOOL_MIN_(ePool_) ((uint16_t)(ePool_)->nMin)
437
438// include files -------------------------------------------------------------
439#include "queue.h" // QK kernel uses the native QP event queue
440#include "qmpool.h" // QK kernel uses the native QP memory pool
441#include "qp.h" // QP framework
442#include "qk.h" // QK kernel
443
444#endif // QP_PORT_H_
QK (preemptive non-blocking kernel) platform-independent public interface.
QP/C native platform-independent memory pool QMPool interface.
QP Framework platform-independent public interface