#ifndef INCLUDED_OS_TASK_H #define INCLUDED_OS_TASK_H #ifndef INCLUDED_OS_TYPES_H #include #endif /*INCLUDED_OS_TYPES_H*/ #ifndef INCLUDED_OS_STACK_H #include #endif /*INCLUDED_OS_STACK_H*/ #ifndef INCLUDED_OS_LIST_H #include #endif /*INCLUDED_OS_LIST_H*/ #ifndef INCLUDED_OS_PRIORITY_H #include #endif /*INCLUDED_OS_PRIORITY_H*/ #ifndef INCLUDED_OS_UTILS_H #include #endif /*INCLUDED_OS_UTILS_H*/ #ifndef INCLUDED_OS_TIMER_H #include #endif /*INCLUDED_OS_TIMER_H*/ #ifndef INCLUDED_OS_SCHED_H #include #endif /*INCLUDED_OS_SCHED_H*/ #ifndef INCLUDED_OS_ALIGN_H #include #endif /*INCLUDED_OS_ALIGN_H*/ /* ------------------------------------------------------------------------------------------------------------------ */ /* */ typedef void (*os_task_entry_t)(void*); typedef enum { kOsTaskState_Terminated = -1, kOsTaskState_Idle = 0, kOsTaskState_Ready = 1, kOsTaskState_Running = 2, kOsTaskState_Yield = 3, kOsTaskState_Delay = 4, kOsTaskState_Wait = 5, }os_task_state_t; typedef struct os_task_t{ os_stack_t stack; os_list_node_t node; os_tick_t init_ticks; os_tick_t remain_ticks; os_priority_t init_priority; os_priority_t curr_priority; os_timer_t timer; os_task_state_t state; os_err_t errors; }os_task_t; void os_task_init(os_task_t* self, os_task_entry_t entry, void* param, void* stack_base, os_size_t stack_size, os_tick_t ticks, os_priority_t priority); void os_task_sleep(os_tick_t ticks); void os_task_yield(void); void os_task_join(os_task_t* self); OS_STATIC_FORCE_INLINE void os_task_sleep_ms(os_size_t ms){ os_task_sleep(os_tick_from_ms(ms)); } OS_STATIC_FORCE_INLINE os_task_t* os_task_self(void){ return (os_task_t*)g_os_sched_current_task_p; } /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define OS_TASK_DEF(Name, StackSize) \ OS_ALIGNED(OS_ALIGN_SIZE) \ static uint8_t Name##_Stack[StackSize]; \ static os_task_t Name; \ OS_NORETURN \ static void Name##_TaskEntry(void* param) #define OS_TASK_RUN(Name, Param, Ticks, Priority) \ os_task_init(&Name, Name##_TaskEntry, Param, Name##_Stack, OS_ARRAY_SIZE(Name##_Stack), Ticks, Priority) #define OS_TASK_FAST_DEF(Name) OS_TASK_DEF(Name, 1024) #define OS_TASK_FAST_RUN(Name) OS_TASK_RUN(Name, 0, 10, OS_PRIORITY_NORMAL) #endif /*INCLUDED_OS_TASK_H*/