Go to the documentation of this file.
49 #ifndef __ESOS_TASK_H__
50 #define __ESOS_TASK_H__
57 uint8 (*pfn)(
struct stTask *);
74 #define ESOS_TASK_WAITING 0
75 #define ESOS_TASK_ENDED 3
78 #define __TASK_ENDED_MASK BIT3
80 #define __TASK_KILLED_MASK BIT2
82 #define __TASK_SLEEPING_MASK BIT1
84 #define __TASK_WAITING_MASK BIT0
86 #define __TASK_CALLED_MASK BIT7
89 #define __ESOS_SET_TASK_SLEEPING_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_SLEEPING_MASK)
90 #define __ESOS_CLEAR_TASK_SLEEPING_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_SLEEPING_MASK)
91 #define __ESOS_SET_TASK_KILLED_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_KILLED_MASK)
92 #define __ESOS_CLEAR_TASK_KILLED_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_KILLED_MASK)
93 #define __ESOS_SET_TASK_WAITING_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_WAITING_MASK)
94 #define __ESOS_CLEAR_TASK_WAITING_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_WAITING_MASK)
95 #define __ESOS_SET_TASK_CALLED_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_CALLED_MASK)
96 #define __ESOS_CLEAR_TASK_CALLED_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_CALLED_MASK)
97 #define __ESOS_IS_TASK_CALLED(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_CALLED_MASK)
98 #define __ESOS_SET_TASK_ENDED_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_ENDED_MASK)
99 #define __ESOS_CLEAR_TASK_ENDED_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_ENDED_MASK)
120 #define __ESOS_INIT_TASK(TaskHandle) \
121 LC_INIT((TaskHandle)->lc);
144 #define ESOS_IS_TASK_INITED(TaskHandle) LC_IS_INITED((TaskHandle)->lc)
153 #define ESOS_IS_TASK_SLEEPING(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_SLEEPING_MASK)
162 #define ESOS_IS_TASK_KILLED(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_KILLED_MASK)
171 #define ESOS_IS_TASK_WAITING(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_WAITING_MASK)
182 #define ESOS_IS_TASK_ENDED(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_ENDED_MASK)
205 #define ESOS_USER_TASK(taskname) uint8 taskname(ESOS_TASK_HANDLE __pstSelf)
224 #define ESOS_CHILD_TASK(taskname, ...) uint8 taskname(ESOS_TASK_HANDLE __pstSelf, ##__VA_ARGS__)
237 #define ESOS_TASK_BEGIN() \
238 { __ESOS_SET_TASK_CALLED_FLAG(__pstSelf); \
239 LC_RESUME(__pstSelf->lc)
249 #define ESOS_TASK_END() \
250 LC_END(__pstSelf->lc); \
251 __pstSelf->flags = __TASK_ENDED_MASK; \
252 __ESOS_INIT_TASK(__pstSelf); \
253 return ESOS_TASK_ENDED; }
267 #define ESOS_TASK_GET_TASK_HANDLE() __pstSelf
291 #define ESOS_SCHEDULE_TASK(pfnThread) ( (pfnThread) < ESOS_TASK_ENDED )
313 #define ESOS_TASK_WAIT_UNTIL(condition) \
315 LC_SET(__pstSelf->lc); \
316 if(ESOS_IS_TASK_KILLED(__pstSelf)) { \
317 __pstSelf->flags = __TASK_KILLED_MASK; \
318 return ESOS_TASK_ENDED; \
321 __ESOS_CLEAR_TASK_WAITING_FLAG(__pstSelf); \
324 __ESOS_SET_TASK_WAITING_FLAG(__pstSelf); \
326 if(ESOS_IS_TASK_WAITING(__pstSelf)) { \
327 return ESOS_TASK_WAITING; \
341 #define ESOS_TASK_WAIT_WHILE(cond) ESOS_TASK_WAIT_UNTIL(!(cond))
353 #define ESOS_TASK_WAIT_TICKS(u32_duration) \
355 __pstSelf->u32_savedTick = esos_GetSystemTick(); \
356 __pstSelf->u32_waitLen = (u32_duration); \
357 ESOS_TASK_WAIT_UNTIL(__esos_hasTickDurationPassed(__pstSelf->u32_savedTick, __pstSelf->u32_waitLen) ); \
363 #define __ESOS_TASK_SPAWN(pstChild, fcnCallWithArgs) \
365 __ESOS_INIT_TASK((pstChild)); \
366 ESOS_TASK_WAIT_THREAD((fcnCallWithArgs)); \
396 #define ESOS_TASK_WAIT_THREAD(pfnChild, ...) ESOS_TASK_WAIT_WHILE(ESOS_SCHEDULE_TASK(pfnChild,##__VA_ARGS__ ))
413 #define ESOS_TASK_SPAWN_AND_WAIT(pstChild, pfnChild, ...) \
414 __ESOS_TASK_SPAWN((pstChild), (pfnChild)( (pstChild), ##__VA_ARGS__) )
425 #define ESOS_ALLOCATE_CHILD_TASK(pstName) (pstName)=esos_GetFreeChildTaskStruct()
456 #define ESOS_TASK_SLEEP() \
458 __ESOS_SET_TASK_SLEEPING_FLAG(__pstSelf); \
459 ESOS_TASK_WAIT_WHILE(ESOS_IS_TASK_SLEEPING(__pstSelf)); \
471 #define ESOS_TASK_RESTART() \
473 __pstSelf->flags = 0; \
474 __ESOS_INIT_TASK(__pstSelf); \
475 return ESOS_TASK_WAITING; \
490 #define ESOS_TASK_EXIT() \
492 __pstSelf->flags = __TASK_ENDED_MASK; \
493 return ESOS_TASK_ENDED; \
511 #define ESOS_WAKE_TASK(TaskHandle) __ESOS_TASK_CLEAR_SLEEPING_FLAG((TaskHandle))
524 #define ESOS_KILL_TASK(TaskHandle) __ESOS_TASK_SET_KILLED_FLAG((TaskHandle))
542 #define ESOS_RESTART_TASK(TaskHandle) \
544 (TaskHandle)->flags = 0; \
545 __ESOS_INIT_TASK((TaskHandle)); \
567 #define ESOS_TASK_YIELD() \
569 __ESOS_CLEAR_TASK_CALLED_FLAG(__pstSelf); \
570 ESOS_TASK_WAIT_UNTIL(__ESOS_IS_TASK_CALLED(__pstSelf)); \
609 #define ESOS_SEMAPHORE(semaphoreName) struct stSemaphore (semaphoreName)
627 #define ESOS_INIT_SEMAPHORE(semaphoreName, i16_val) (semaphoreName).i16_cnt=(i16_val)
644 #define ESOS_TASK_WAIT_SEMAPHORE(semaphoreName, i16_val) \
646 ESOS_TASK_WAIT_UNTIL((semaphoreName).i16_cnt >= (i16_val) ); \
647 (semaphoreName).i16_cnt -= (i16_val); \
664 #define ESOS_SIGNAL_SEMAPHORE(semaphoreName, i16_val) (semaphoreName).i16_cnt+=(i16_val)