Go to the documentation of this file.
49 #ifndef __ESOS_TASK_H__
50 #define __ESOS_TASK_H__
58 uint8_t (*pfn) (
struct stTask *pst_Task);
59 uint32_t u32_savedTick;
85 #define ESOS_TASK_WAITING 0
86 #define ESOS_TASK_ENDED 3
90 #define __TASK_MAILNACK_MASK BIT5
92 #define __TASK_HASMAIL_MASK BIT4
95 #define __TASK_ENDED_MASK BIT3
97 #define __TASK_KILLED_MASK BIT2
99 #define __TASK_SLEEPING_MASK BIT1
101 #define __TASK_WAITING_MASK BIT0
103 #define __TASK_CALLED_MASK BIT7
106 #define __ESOS_SET_TASK_SLEEPING_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_SLEEPING_MASK)
107 #define __ESOS_CLEAR_TASK_SLEEPING_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_SLEEPING_MASK)
108 #define __ESOS_SET_TASK_KILLED_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_KILLED_MASK)
109 #define __ESOS_CLEAR_TASK_KILLED_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_KILLED_MASK)
110 #define __ESOS_SET_TASK_WAITING_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_WAITING_MASK)
111 #define __ESOS_CLEAR_TASK_WAITING_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_WAITING_MASK)
112 #define __ESOS_SET_TASK_CALLED_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_CALLED_MASK)
113 #define __ESOS_CLEAR_TASK_CALLED_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_CALLED_MASK)
114 #define __ESOS_IS_TASK_CALLED(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_CALLED_MASK)
115 #define __ESOS_SET_TASK_ENDED_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_ENDED_MASK)
116 #define __ESOS_CLEAR_TASK_ENDED_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_ENDED_MASK)
119 #define __ESOS_SET_TASK_HASMAIL_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_HASMAIL_MASK)
120 #define __ESOS_CLEAR_TASK_HASMAIL_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_HASMAIL_MASK)
121 #define __ESOS_SET_TASK_MAILNACK_FLAG(TaskHandle) BIT_SET_MASK((TaskHandle)->flags, __TASK_MAILNACK_MASK)
122 #define __ESOS_CLEAR_TASK_MAILNACK_FLAG(TaskHandle) BIT_CLEAR_MASK((TaskHandle)->flags, __TASK_MAILNACK_MASK)
143 #define __ESOS_INIT_TASK(TaskHandle) \
144 LC_INIT((TaskHandle)->lc);
167 #define ESOS_IS_TASK_INITED(TaskHandle) LC_IS_INITED((TaskHandle)->lc)
176 #define ESOS_IS_TASK_SLEEPING(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_SLEEPING_MASK)
185 #define ESOS_IS_TASK_KILLED(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_KILLED_MASK)
194 #define ESOS_IS_TASK_WAITING(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_WAITING_MASK)
205 #define ESOS_IS_TASK_ENDED(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_ENDED_MASK)
228 #define ESOS_USER_TASK(taskname) uint8_t taskname(ESOS_TASK_HANDLE __pstSelf)
247 #define ESOS_CHILD_TASK(taskname, ...) uint8_t taskname(ESOS_TASK_HANDLE __pstSelf, ##__VA_ARGS__)
260 #define ESOS_TASK_BEGIN() \
261 { __ESOS_SET_TASK_CALLED_FLAG(__pstSelf); \
262 LC_RESUME(__pstSelf->lc)
272 #define ESOS_TASK_END() \
273 LC_END(__pstSelf->lc); \
274 __pstSelf->flags = __TASK_ENDED_MASK; \
275 __ESOS_INIT_TASK(__pstSelf); \
276 return ESOS_TASK_ENDED; }
290 #define ESOS_TASK_GET_TASK_HANDLE() __pstSelf
314 #define ESOS_SCHEDULE_TASK(pfnThread) ( (pfnThread) < ESOS_TASK_ENDED )
336 #define ESOS_TASK_WAIT_UNTIL(condition) \
338 LC_SET(__pstSelf->lc); \
339 if(ESOS_IS_TASK_KILLED(__pstSelf)) { \
340 __pstSelf->flags = __TASK_KILLED_MASK; \
341 return ESOS_TASK_ENDED; \
344 __ESOS_CLEAR_TASK_WAITING_FLAG(__pstSelf); \
347 __ESOS_SET_TASK_WAITING_FLAG(__pstSelf); \
349 if(ESOS_IS_TASK_WAITING(__pstSelf)) { \
350 return ESOS_TASK_WAITING; \
364 #define ESOS_TASK_WAIT_WHILE(cond) ESOS_TASK_WAIT_UNTIL(!(cond))
376 #define ESOS_TASK_WAIT_TICKS(u32_duration) \
378 __pstSelf->u32_savedTick = esos_GetSystemTick(); \
379 __pstSelf->u32_waitLen = (u32_duration); \
380 ESOS_TASK_WAIT_UNTIL(__esos_hasTickDurationPassed(__pstSelf->u32_savedTick, __pstSelf->u32_waitLen) ); \
386 #define __ESOS_TASK_SPAWN(pstChild, fcnCallWithArgs) \
388 __ESOS_INIT_TASK((pstChild)); \
389 ESOS_TASK_WAIT_THREAD((fcnCallWithArgs)); \
419 #define ESOS_TASK_WAIT_THREAD(pfnChild, ...) ESOS_TASK_WAIT_WHILE(ESOS_SCHEDULE_TASK(pfnChild,##__VA_ARGS__ ))
436 #define ESOS_TASK_SPAWN_AND_WAIT(pstChild, pfnChild, ...) \
437 __ESOS_TASK_SPAWN((pstChild), (pfnChild)( (pstChild), ##__VA_ARGS__) )
448 #define ESOS_ALLOCATE_CHILD_TASK(pstName) (pstName)=esos_GetFreeChildTaskStruct()
479 #define ESOS_TASK_SLEEP() \
481 __ESOS_SET_TASK_SLEEPING_FLAG(__pstSelf); \
482 ESOS_TASK_WAIT_WHILE(ESOS_IS_TASK_SLEEPING(__pstSelf)); \
494 #define ESOS_TASK_RESTART() \
496 __pstSelf->flags = 0; \
497 __ESOS_INIT_TASK(__pstSelf); \
498 return ESOS_TASK_WAITING; \
513 #define ESOS_TASK_EXIT() \
515 __pstSelf->flags = __TASK_ENDED_MASK; \
516 return ESOS_TASK_ENDED; \
534 #define ESOS_WAKE_TASK(TaskHandle) __ESOS_TASK_CLEAR_SLEEPING_FLAG((TaskHandle))
547 #define ESOS_KILL_TASK(TaskHandle) __ESOS_TASK_SET_KILLED_FLAG((TaskHandle))
565 #define ESOS_RESTART_TASK(TaskHandle) \
567 (TaskHandle)->flags = 0; \
568 __ESOS_INIT_TASK((TaskHandle)); \
590 #define ESOS_TASK_YIELD() \
592 __ESOS_CLEAR_TASK_CALLED_FLAG(__pstSelf); \
593 ESOS_TASK_WAIT_UNTIL(__ESOS_IS_TASK_CALLED(__pstSelf)); \
632 #define ESOS_SEMAPHORE(semaphoreName) struct stSemaphore (semaphoreName)
650 #define ESOS_INIT_SEMAPHORE(semaphoreName, i16_val) (semaphoreName).i16_cnt=(i16_val)
667 #define ESOS_TASK_WAIT_SEMAPHORE(semaphoreName, i16_val) \
669 ESOS_TASK_WAIT_UNTIL((semaphoreName).i16_cnt >= (i16_val) ); \
670 (semaphoreName).i16_cnt -= (i16_val); \
687 #define ESOS_SIGNAL_SEMAPHORE(semaphoreName, i16_val) (semaphoreName).i16_cnt+=(i16_val)