2121#define STK_TIMER_COUNT_MAX (STK_C_TIMER_MAX )
2222#include " time/stk_time.h"
2323
24+ // Check correctness of stk_config.h
25+ #ifndef STK_C_KERNEL_TYPE_CPU_0
26+ #error "Missing STK_C_KERNEL_TYPE_CPU_0: Kernel type for CPU0 must be defined via stk_config.h or compiler flags."
27+ #endif
28+ #ifndef STK_C_CPU_COUNT
29+ #error "Missing STK_C_CPU_COUNT: CPU count must be defined via stk_config.h or compiler flags."
30+ #endif
31+ #ifndef STK_C_KERNEL_MAX_TASKS
32+ #error "Missing STK_C_KERNEL_MAX_TASKS: max task count must be defined via stk_config.h or compiler flags."
33+ #endif
34+
2435using namespace stk ;
2536
2637#define STK_C_TASKS_MAX (STK_C_KERNEL_MAX_TASKS )
@@ -33,35 +44,43 @@ struct stk_task_t;
3344class TaskWrapper final : public ITask
3445{
3546public:
47+ explicit TaskWrapper () : m_func(nullptr ), m_user_data(nullptr ), m_stack(nullptr ),
48+ m_stack_size(0U ), m_mode(ACCESS_USER ), m_weight(DEFAULT_WEIGHT ), m_tname(nullptr )
49+ {}
50+
51+ /* ! \brief Destructor.
52+ \note MISRA deviation: [STK-DEV-005] Rule 10-3-2.
53+ */
54+ ~TaskWrapper () = default ;
55+
3656 // ITask
37- EAccessMode GetAccessMode () const override { return m_mode; }
38- void OnDeadlineMissed (uint32_t duration) override { (void )duration; }
39- int32_t GetWeight () const override { return m_weight; }
40- const char *GetTraceName () const override { return m_tname; }
57+ EAccessMode GetAccessMode () const override { return m_mode; }
58+ void OnDeadlineMissed (uint32_t duration) override { (void )duration; }
59+ int32_t GetWeight () const override { return m_weight; }
60+ const char *GetTraceName () const override { return m_tname; }
4161
4262 // IStackMemory
43- stk_word_t *GetStack () const override { return m_stack; }
44- size_t GetStackSize () const override { return m_stack_size; }
63+ const Word *GetStack () const override { return m_stack; }
64+ size_t GetStackSize () const override { return m_stack_size; }
4565 size_t GetStackSizeBytes () const override { return m_stack_size * sizeof (stk_word_t ); }
4666
47- void Initialize (stk_task_entry_t func,
48- void *user_data,
49- stk_word_t *stack,
50- size_t stack_size,
51- EAccessMode mode)
67+ void Initialize (stk_task_entry_t func, void *user_data, stk_word_t *stack,
68+ size_t stack_size, EAccessMode mode)
5269 {
5370 m_func = func;
5471 m_user_data = user_data;
5572 m_stack = stack;
5673 m_stack_size = stack_size;
5774 m_mode = mode;
58- m_weight = 1 ;
75+ m_weight = DEFAULT_WEIGHT ;
5976 }
6077
61- void SetWeight (int32_t weight) { m_weight = weight; }
78+ void SetWeight (Weight weight) { m_weight = weight; }
6279 void SetName (const char *tname) { m_tname = tname; }
6380
6481private:
82+ STK_NONCOPYABLE_CLASS (TaskWrapper);
83+
6584 void Run () override { m_func (m_user_data); }
6685 void OnExit () override { FreeTask (ToStkTask ()); }
6786
@@ -73,7 +92,7 @@ class TaskWrapper final : public ITask
7392 stk_word_t *m_stack;
7493 size_t m_stack_size;
7594 EAccessMode m_mode;
76- int32_t m_weight;
95+ Weight m_weight;
7796 const char *m_tname;
7897};
7998
@@ -239,12 +258,19 @@ extern "C" {
239258// -----------------------------------------------------------------------------
240259// Kernel create/destroy wrappers
241260// -----------------------------------------------------------------------------
261+ #define STK_PP_CAT (A, B ) A##B
262+ #define STK_PP_CAT_EXPAND (A, B ) STK_PP_CAT (A, B)
263+ #define STK_KERNEL_TYPE (X ) STK_PP_CAT (STK_C_KERNEL_TYPE_CPU_ , X)
264+ #define STK_KERNEL_MEM (X ) STK_PP_CAT_EXPAND (kernel_, STK_PP_CAT_EXPAND (X, _mem))
242265#define STK_KERNEL_CASE (X ) \
243266 case X: \
244267 { \
245- STK_STATIC_ASSERT_N (sizeof (STK_C_KERNEL_TYPE_CPU_ ##X) % sizeof (Word) == 0 , " Kernel memory size must be multiple of Word" ); \
246- alignas (alignof (STK_C_KERNEL_TYPE_CPU_ ##X)) static Word kernel_##X##_mem[sizeof (STK_C_KERNEL_TYPE_CPU_ ##X) / sizeof (Word)]; \
247- IKernel *kernel = new (kernel_##X##_mem) STK_C_KERNEL_TYPE_CPU_ ##X (); \
268+ using KernelType_ = STK_KERNEL_TYPE (X); \
269+ STK_STATIC_ASSERT_N (((sizeof (KernelType_) % sizeof (Word)) == 0U ), \
270+ " Kernel memory size must be multiple of Word" ); \
271+ alignas (alignof (KernelType_)) \
272+ static Word STK_KERNEL_MEM (X)[sizeof (KernelType_) / sizeof (Word)]; \
273+ IKernel *kernel = new (STK_KERNEL_MEM (X)) KernelType_ (); \
248274 RegisterKernel (kernel, X); \
249275 return reinterpret_cast <stk_kernel_t *>(kernel); \
250276 }
0 commit comments