89 struct stTask __astUserTaskPool[MAX_NUM_USER_TASKS];
90 uint8_t __au8UserTaskStructIndex[MAX_NUM_USER_TASKS];
92 uint8_t __u8UserTasksRegistered;
93 uint8_t __u8ChildTasksRegistered;
94 uint16_t __u16NumTasksEverCreated;
97 struct stTimer __astTmrSvcs[MAX_NUM_TMRS];
98 uint8_t __esos_u8TmrSvcsRegistered;
99 uint32_t __esos_u32TmrActiveFlags;
101 #ifdef ESOS_USE_BULK_CDC_USB
102 static struct stTask __stUsbCommSystem;
106 MAILBOX __astMailbox[MAX_NUM_USER_TASKS];
107 uint8_t __au8_MBData[MAX_NUM_USER_TASKS][MAX_SIZE_TASK_MAILBOX];
108 CBUFFER __astCircularBuffers[MAX_NUM_USER_TASKS];
112 uint32_t __esos_u32UserFlags, __esos_u32SystemFlags;
128 uint8_t u8_FoundFcn =
FALSE;
130 uint8_t u8_IndexFree=0;
131 uint8_t u8_FoundFree =
FALSE;
133 if (__u8UserTasksRegistered < MAX_NUM_USER_TASKS) {
138 for (u8_i=0; u8_i<MAX_NUM_USER_TASKS; u8_i++) {
139 if (__astUserTaskPool[u8_i].pfn == taskname) {
148 if ((!u8_FoundFree) && (__astUserTaskPool[u8_i].pfn ==
NULLPTR)) {
168 __astUserTaskPool[u8_IndexFcn].flags = 0;
170 __au8UserTaskStructIndex[__u8UserTasksRegistered] = u8_IndexFcn;
171 __u8UserTasksRegistered++;
173 if ( __astUserTaskPool[u8_IndexFree].u16_taskID == 0 ) {
175 __u16NumTasksEverCreated++;
176 __astUserTaskPool[u8_IndexFree].u16_taskID = __u16NumTasksEverCreated;
178 return &__astUserTaskPool[u8_IndexFcn];
187 __astUserTaskPool[u8_IndexFree].pfn = taskname;
189 __astUserTaskPool[u8_IndexFree].flags = 0;
191 __au8UserTaskStructIndex[__u8UserTasksRegistered] = u8_IndexFree;
192 __u8UserTasksRegistered++;
194 __u16NumTasksEverCreated++;
195 __astUserTaskPool[u8_IndexFree].u16_taskID = __u16NumTasksEverCreated;
196 return &__astUserTaskPool[u8_IndexFree];
219 uint8_t u8Status=
FALSE;
228 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
230 u8_z = __au8UserTaskStructIndex[u8_i];
236 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
237 pstNowTask = &__astUserTaskPool[u8_z];
239 if (pstNowTask->pfn == taskname) {
240 __au8UserTaskStructIndex[u8_i] = REMOVE_IDX;
241 __esos_SetSystemFlag( __ESOS_SYS_FLAG_PACK_TASKS );
267 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
269 u8_z = __au8UserTaskStructIndex[u8_i];
274 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
275 pst_NowTask = &__astUserTaskPool[u8_z];
277 if (pst_NowTask->pfn == taskname) {
278 pst_ReturnTask = pst_NowTask;
283 return pst_ReturnTask;
303 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
305 u8_z = __au8UserTaskStructIndex[u8_i];
310 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
311 pst_NowTask = &__astUserTaskPool[u8_z];
313 if (pst_NowTask->u16_taskID == u16_TaskID) {
314 pst_ReturnTask = pst_NowTask;
319 return pst_ReturnTask;
343 return &__astChildTaskPool[u16_i];
356 return MAX_NUM_USER_TASKS;
368 uint16_t __esos_hasTickDurationPassed(uint32_t u32_startTick, uint32_t u32_period) {
369 uint32_t u32_delta, u32_current;
372 u32_delta = u32_current - u32_startTick;
373 if (u32_current < u32_startTick)
374 u32_delta += 0xFFFFFFFF;
375 if (u32_delta > u32_period)
386 void __esos_tmrSvcsExecute(
void) {
387 uint8_t u8_cnt, u8_index;
389 u8_cnt = __esos_u8TmrSvcsRegistered;
394 __astTmrSvcs[u8_index].u32_cntDown--;
395 if (__astTmrSvcs[u8_index].u32_cntDown == 0 ) {
396 __astTmrSvcs[u8_index].u32_cntDown = __astTmrSvcs[u8_index].u32_period;
397 __astTmrSvcs[u8_index].pfn();
426 for (u8_i=0; u8_i<MAX_NUM_TMRS; u8_i++ ) {
428 __astTmrSvcs[u8_i].pfn = timername;
429 __astTmrSvcs[u8_i].u32_period = u32_period;
430 __astTmrSvcs[u8_i].u32_cntDown = u32_period;
431 __esos_u8TmrSvcsRegistered++;
432 __esos_MarkTimerRunning( u8_i );
436 return ESOS_TMR_FAILURE;
439 return ESOS_TMR_FAILURE;
454 __astTmrSvcs[hnd_timer].pfn =
NULLPTR;
455 __esos_u8TmrSvcsRegistered--;
456 __esos_MarkTimerStopped(hnd_timer);
479 if ( __astTmrSvcs[u8_i].pfn == pfnTmrFcn )
return u8_i;
484 return ESOS_TMR_FAILURE;
502 __astTmrSvcs[hnd_timer].u32_period = u32_period;
507 void __esosInit(
void) {
511 for (u8_i=0; u8_i<MAX_NUM_USER_TASKS; u8_i++) {
512 __astUserTaskPool[u8_i].pfn =
NULLPTR;
513 __au8UserTaskStructIndex[u8_i] =
NULLIDX;
514 __astChildTaskPool[u8_i].pfn =
NULLPTR;
516 __astUserTaskPool[u8_i].pst_Mailbox = &__astMailbox[u8_i];
517 (__astUserTaskPool[u8_i].pst_Mailbox)->pst_CBuffer = &__astCircularBuffers[u8_i];
518 __esos_InitMailbox(__astUserTaskPool[u8_i].pst_Mailbox, &__au8_MBData[u8_i][0]);
520 __esos_u32TmrActiveFlags = 0;
521 for (u8_i=0; u8_i<MAX_NUM_TMRS; u8_i++) {
522 __astTmrSvcs[u8_i].pfn =
NULLPTR;
526 __u8UserTasksRegistered = 0;
528 __u8ChildTasksRegistered = 0;
530 __esos_u8TmrSvcsRegistered = 0;
539 __esos_hw_config_PRNG();
551 _esos_hw_InitUserInterrupts();
561 #ifdef ESOS_USE_BULK_CDC_USB
562 __esos_InitCommSystem();
564 #ifdef ESOS_USE_SERIAL_PORT
565 __esos_InitCommSystem();
570 __esos_lcd44780_init();
583 #if defined (ESOS_USE_I2C_100KBPS) || defined (ESOS_USE_I2C) || defined (ESOS_USE_I2C_400KBPS)
588 #ifdef ESOS_USE_I2C_400KBPS
589 #warning Using 400kbps I2C service.... Can your I2C slaves handle it?
604 #ifdef ESOS_USE_WATCHDOG
614 uint8_t u8TaskReturnedVal=0;
615 uint8_t u8i,u8j, u8NumRegdTasksTemp;
622 __u16NumTasksEverCreated = 0;
634 u8NumRegdTasksTemp = __u8UserTasksRegistered;
637 while ( u8i < u8NumRegdTasksTemp ) {
643 pstNowTask = &__astUserTaskPool[__au8UserTaskStructIndex[u8i]];
644 u8TaskReturnedVal = pstNowTask->pfn( pstNowTask );
645 if (u8TaskReturnedVal == ESOS_TASK_ENDED) {
657 if (__esos_IsSystemFlagSet( __ESOS_SYS_FLAG_PACK_TASKS) ) {
670 u8i = __u8UserTasksRegistered;
673 pstNowTask = &__astUserTaskPool[u8i];
674 if (__au8UserTaskStructIndex[u8i] == REMOVE_IDX) {
675 for ( u8j=u8i+1; u8j<u8NumRegdTasksTemp; u8j++) {
676 __au8UserTaskStructIndex[u8j-1] = __au8UserTaskStructIndex[u8j];
678 __au8UserTaskStructIndex[u8NumRegdTasksTemp-1] =
NULLIDX;
679 u8NumRegdTasksTemp--;
693 __u8UserTasksRegistered=u8NumRegdTasksTemp;
694 __esos_ClearSystemFlag( __ESOS_SYS_FLAG_PACK_TASKS );