57 #define MAX_NUM_USER_TASKS 16
58 #define MAX_NUM_CHILD_TASKS MAX_NUM_USER_TASKS
60 #define REMOVE_IDX 0xFE
67 struct stTask __astChildTaskPool[MAX_NUM_CHILD_TASKS];
68 uint8 __u8UserTasksRegistered;
69 uint8 __u8ChildTasksRegistered;
71 struct stTimer __astTmrSvcs[MAX_NUM_TMRS];
72 uint8 __esos_u8TmrSvcsRegistered;
73 uint16 __esos_u16TmrActiveFlags;
75 #ifdef ESOS_USE_BULK_CDC_USB
76 static struct stTask __stUsbCommSystem;
79 uint16 __esos_u16UserFlags, __esos_u16SystemFlags;
80 uint32 __u32_esos_PRNG_Seed;
103 if (__astUserTaskPool[u8_i].pfn == taskname) {
108 if ((!u8_FoundFree) && (__astUserTaskPool[u8_i].pfn ==
NULLPTR)) {
115 __astUserTaskPool[u8_IndexFcn].flags = 0;
116 __au8UserTaskStructIndex[__u8UserTasksRegistered] = u8_IndexFcn;
117 __u8UserTasksRegistered++;
118 return &__astUserTaskPool[u8_IndexFcn];
122 __astUserTaskPool[u8_IndexFree].pfn = taskname;
124 __astUserTaskPool[u8_IndexFree].flags = 0;
125 __au8UserTaskStructIndex[__u8UserTasksRegistered] = u8_IndexFree;
126 __u8UserTasksRegistered++;
127 return &__astUserTaskPool[u8_IndexFree];
152 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
154 u8_z = __au8UserTaskStructIndex[u8_i];
156 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
157 pstNowTask = &__astUserTaskPool[u8_z];
158 if (pstNowTask->pfn == taskname) {
159 __au8UserTaskStructIndex[u8_i] = REMOVE_IDX;
162 __esos_SetSystemFlag( __ESOS_SYS_FLAG_PACK_TASKS );
189 while (u16_i < MAX_NUM_CHILD_TASKS) {
191 return &__astChildTaskPool[u16_i];
211 __u32_esos_PRNG_Seed = u32_in;
223 lo = 16807 * ( __u32_esos_PRNG_Seed * 0xFFFF );
224 hi = 16807 * ( __u32_esos_PRNG_Seed >> 16 );
225 lo += (hi & 0x7FFF) << 16;
227 if (lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF;
228 return (__u32_esos_PRNG_Seed = (
uint32) lo );
249 uint32 u32_delta, u32_current;
252 u32_delta = u32_current - u32_startTick;
253 if (u32_current < u32_startTick)
254 u32_delta += 0xFFFFFFFF;
255 if (u32_delta > u32_period)
266 void __esos_tmrSvcsExecute(
void) {
267 uint8 u8_cnt, u8_index;
269 u8_cnt = __esos_u8TmrSvcsRegistered;
274 __astTmrSvcs[u8_index].u32_cntDown--;
275 if (__astTmrSvcs[u8_index].u32_cntDown == 0 ) {
276 __astTmrSvcs[u8_index].u32_cntDown = __astTmrSvcs[u8_index].u32_period;
277 __astTmrSvcs[u8_index].pfn();
306 for (u8_i=0; u8_i<MAX_NUM_TMRS; u8_i++ ) {
308 __astTmrSvcs[u8_i].pfn = timername;
309 __astTmrSvcs[u8_i].u32_period = u32_period;
310 __astTmrSvcs[u8_i].u32_cntDown = u32_period;
311 __esos_u8TmrSvcsRegistered++;
312 __esos_MarkTimerRunning( u8_i );
316 return ESOS_TMR_FAILURE;
319 return ESOS_TMR_FAILURE;
334 __astTmrSvcs[hnd_timer].pfn =
NULLPTR;
335 __esos_u8TmrSvcsRegistered--;
336 __esos_MarkTimerStopped(hnd_timer);
359 if ( __astTmrSvcs[u8_i].pfn == pfnTmrFcn )
return u8_i;
364 return ESOS_TMR_FAILURE;
382 __astTmrSvcs[hnd_timer].u32_period = u32_period;
387 void __esosInit(
void) {
392 __astUserTaskPool[i].pfn =
NULLPTR;
393 __au8UserTaskStructIndex[i] =
NULLIDX;
394 __astChildTaskPool[i].pfn =
NULLPTR;
396 __esos_u16TmrActiveFlags = 0;
397 for (i=0; i<MAX_NUM_TMRS; i++) {
402 __u8UserTasksRegistered = 0;
404 __u8ChildTasksRegistered = 0;
406 __esos_u8TmrSvcsRegistered = 0;
414 __esos_hw_InitSystemTick();
421 _esos_hw_InitUserInterrupts();
431 #ifdef ESOS_USE_BULK_CDC_USB
432 __esos_InitCommSystem();
434 #ifdef ESOS_USE_SERIAL_PORT
435 __esos_InitCommSystem();
443 uint8 u8TaskReturnedVal=0;
444 uint8 u8i ,u8j, u8NumRegdTasksTemp;
464 u8NumRegdTasksTemp = __u8UserTasksRegistered;
465 while ( u8i < u8NumRegdTasksTemp ) {
466 pstNowTask = &__astUserTaskPool[__au8UserTaskStructIndex[u8i]];
467 u8TaskReturnedVal = pstNowTask->pfn( pstNowTask );
468 if (u8TaskReturnedVal == ESOS_TASK_ENDED) {
477 if (__esos_IsSystemFlagSet( __ESOS_SYS_FLAG_PACK_TASKS) ) {
489 u8i = __u8UserTasksRegistered;
491 pstNowTask = &__astUserTaskPool[u8i];
492 if (__au8UserTaskStructIndex[u8i] == REMOVE_IDX) {
493 for ( u8j=u8i+1; u8j<u8NumRegdTasksTemp; u8j++) {
494 __au8UserTaskStructIndex[u8j-1] = __au8UserTaskStructIndex[u8j];
496 __au8UserTaskStructIndex[u8NumRegdTasksTemp-1] =
NULLIDX;
497 u8NumRegdTasksTemp--;
503 __u8UserTasksRegistered=u8NumRegdTasksTemp;
504 __esos_ClearSystemFlag( __ESOS_SYS_FLAG_PACK_TASKS );