47 struct stTask __astUserTaskPool[MAX_NUM_USER_TASKS];
48 uint8_t __au8UserTaskStructIndex[MAX_NUM_USER_TASKS];
50 uint8_t __u8UserTasksRegistered;
51 uint8_t __u8ChildTasksRegistered;
52 uint16_t __u16NumTasksEverCreated;
55 struct stTimer __astTmrSvcs[MAX_NUM_TMRS];
56 uint8_t __esos_u8TmrSvcsRegistered;
57 uint16_t __esos_u16TmrActiveFlags;
59 #ifdef ESOS_USE_BULK_CDC_USB 60 static struct stTask __stUsbCommSystem;
64 MAILBOX __astMailbox[MAX_NUM_USER_TASKS];
65 uint8_t __au8_MBData[MAX_NUM_USER_TASKS][MAX_SIZE_TASK_MAILBOX];
66 CBUFFER __astCircularBuffers[MAX_NUM_USER_TASKS];
70 uint16_t __esos_u16UserFlags, __esos_u16SystemFlags;
71 uint32_t __u32_esos_PRNG_Seed;
72 uint32_t __esos_u32FNVHash = 2166136261uL;
93 if (__u8UserTasksRegistered < MAX_NUM_USER_TASKS) {
98 for (u8_i=0; u8_i<MAX_NUM_USER_TASKS; u8_i++) {
99 if (__astUserTaskPool[u8_i].pfn == taskname) {
108 if ((!u8_FoundFree) && (__astUserTaskPool[u8_i].pfn ==
NULLPTR)) {
128 __astUserTaskPool[u8_IndexFcn].flags = 0;
130 __au8UserTaskStructIndex[__u8UserTasksRegistered] = u8_IndexFcn;
131 __u8UserTasksRegistered++;
133 if ( __astUserTaskPool[u8_IndexFree].u16_taskID == 0 ) {
135 __u16NumTasksEverCreated++;
136 __astUserTaskPool[u8_IndexFree].u16_taskID = __u16NumTasksEverCreated;
138 return &__astUserTaskPool[u8_IndexFcn];
147 __astUserTaskPool[u8_IndexFree].pfn = taskname;
149 __astUserTaskPool[u8_IndexFree].flags = 0;
151 __au8UserTaskStructIndex[__u8UserTasksRegistered] = u8_IndexFree;
152 __u8UserTasksRegistered++;
154 __u16NumTasksEverCreated++;
155 __astUserTaskPool[u8_IndexFree].u16_taskID = __u16NumTasksEverCreated;
156 return &__astUserTaskPool[u8_IndexFree];
188 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
190 u8_z = __au8UserTaskStructIndex[u8_i];
196 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
197 pstNowTask = &__astUserTaskPool[u8_z];
199 if (pstNowTask->pfn == taskname) {
200 __au8UserTaskStructIndex[u8_i] = REMOVE_IDX;
201 __esos_SetSystemFlag( __ESOS_SYS_FLAG_PACK_TASKS );
227 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
229 u8_z = __au8UserTaskStructIndex[u8_i];
234 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
235 pst_NowTask = &__astUserTaskPool[u8_z];
237 if (pst_NowTask->pfn == taskname) {
238 pst_ReturnTask = pst_NowTask;
243 return pst_ReturnTask;
263 for (u8_i=0; u8_i<__u8UserTasksRegistered; u8_i++) {
265 u8_z = __au8UserTaskStructIndex[u8_i];
270 if ((u8_z !=
NULLIDX) & (u8_z != REMOVE_IDX)) {
271 pst_NowTask = &__astUserTaskPool[u8_z];
273 if (pst_NowTask->u16_taskID == u16_TaskID) {
274 pst_ReturnTask = pst_NowTask;
279 return pst_ReturnTask;
303 return &__astChildTaskPool[u16_i];
323 __u32_esos_PRNG_Seed = u32_in;
335 lo = 16807 * ( __u32_esos_PRNG_Seed * 0xFFFF );
336 hi = 16807 * ( __u32_esos_PRNG_Seed >> 16 );
337 lo += (hi & 0x7FFF) << 16;
339 if (lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF;
340 return (__u32_esos_PRNG_Seed = (uint32_t) lo );
348 uint16_t esos_taskname_hash_u16(
void* buf, uint16_t len ) {
349 unsigned char *bp = (
unsigned char *)buf;
350 unsigned char *be = bp + len;
351 uint32_t u32_temp = 2166136261uL;
358 u32_temp += (u32_temp<<1) + (u32_temp<<4) + (u32_temp<<7) + (u32_temp<<8) + (u32_temp<<24);
361 u32_temp ^= (uint32_t)*bp++;
363 return (uint16_t) ((u32_temp >> 16) ^ (u32_temp & 0xFFFF));
380 unsigned char *bp = (
unsigned char *)buf;
381 unsigned char *be = bp + len;
389 #if defined(NO_FNV_GCC_OPTIMIZATION) 390 __esos_u32FNVHash *= FNV_32_PRIME;
392 __esos_u32FNVHash += (__esos_u32FNVHash<<1) + (__esos_u32FNVHash<<4) + (__esos_u32FNVHash<<7) + (__esos_u32FNVHash<<8) + (__esos_u32FNVHash<<24);
396 __esos_u32FNVHash ^= (uint32_t)*bp++;
400 return __esos_u32FNVHash;
416 unsigned char *ch_s = (
unsigned char *)psz_str;
424 #if defined(NO_FNV_GCC_OPTIMIZATION) 425 __esos_u32FNVHash *= FNV_32_PRIME;
427 __esos_u32FNVHash += (__esos_u32FNVHash<<1) + (__esos_u32FNVHash<<4) + (__esos_u32FNVHash<<7) + (__esos_u32FNVHash<<8) + (__esos_u32FNVHash<<24);
431 __esos_u32FNVHash ^= (uint32_t)*ch_s++;
435 return __esos_u32FNVHash;
438 inline uint16_t esos_hash_u32_to_u16(uint32_t u32_hash) {
439 return (uint16_t) ((u32_hash>>16) ^ (u32_hash&0xFFFF));
448 return MAX_NUM_USER_TASKS;
460 uint16_t __esos_hasTickDurationPassed(uint32_t u32_startTick, uint32_t u32_period) {
461 uint32_t u32_delta, u32_current;
464 u32_delta = u32_current - u32_startTick;
465 if (u32_current < u32_startTick)
466 u32_delta += 0xFFFFFFFF;
467 if (u32_delta > u32_period)
478 void __esos_tmrSvcsExecute(
void) {
481 u8_cnt = __esos_u8TmrSvcsRegistered;
486 __astTmrSvcs[u8_index].u32_cntDown--;
487 if (__astTmrSvcs[u8_index].u32_cntDown == 0 ) {
488 __astTmrSvcs[u8_index].u32_cntDown = __astTmrSvcs[u8_index].u32_period;
489 __astTmrSvcs[u8_index].pfn();
518 for (u8_i=0; u8_i<MAX_NUM_TMRS; u8_i++ ) {
520 __astTmrSvcs[u8_i].pfn = timername;
521 __astTmrSvcs[u8_i].u32_period = u32_period;
522 __astTmrSvcs[u8_i].u32_cntDown = u32_period;
523 __esos_u8TmrSvcsRegistered++;
524 __esos_MarkTimerRunning( u8_i );
528 return ESOS_TMR_FAILURE;
531 return ESOS_TMR_FAILURE;
546 __astTmrSvcs[hnd_timer].pfn =
NULLPTR;
547 __esos_u8TmrSvcsRegistered--;
548 __esos_MarkTimerStopped(hnd_timer);
571 if ( __astTmrSvcs[u8_i].pfn == pfnTmrFcn )
return u8_i;
576 return ESOS_TMR_FAILURE;
594 __astTmrSvcs[hnd_timer].u32_period = u32_period;
599 void __esosInit(
void) {
603 for (u8_i=0; u8_i<MAX_NUM_USER_TASKS; u8_i++) {
604 __astUserTaskPool[u8_i].pfn =
NULLPTR;
605 __au8UserTaskStructIndex[u8_i] =
NULLIDX;
606 __astChildTaskPool[u8_i].pfn =
NULLPTR;
608 __astUserTaskPool[u8_i].pst_Mailbox = &__astMailbox[u8_i];
609 (__astUserTaskPool[u8_i].pst_Mailbox)->pst_CBuffer = &__astCircularBuffers[u8_i];
610 __esos_InitMailbox(__astUserTaskPool[u8_i].pst_Mailbox, &__au8_MBData[u8_i][0]);
612 __esos_u16TmrActiveFlags = 0;
613 for (u8_i=0; u8_i<MAX_NUM_TMRS; u8_i++) {
614 __astTmrSvcs[u8_i].pfn =
NULLPTR;
618 __u8UserTasksRegistered = 0;
620 __u8ChildTasksRegistered = 0;
622 __esos_u8TmrSvcsRegistered = 0;
625 __u32_esos_PRNG_Seed = MAX_NUM_USER_TASKS;
630 __esos_hw_InitSystemTick();
637 _esos_hw_InitUserInterrupts();
647 #ifdef ESOS_USE_BULK_CDC_USB 648 __esos_InitCommSystem();
650 #ifdef ESOS_USE_SERIAL_PORT 651 __esos_InitCommSystem();
660 uint8_t u8i ,u8j, u8NumRegdTasksTemp;
667 __u16NumTasksEverCreated = 0;
679 u8NumRegdTasksTemp = __u8UserTasksRegistered;
682 while ( u8i < u8NumRegdTasksTemp ) {
688 pstNowTask = &__astUserTaskPool[__au8UserTaskStructIndex[u8i]];
689 u8TaskReturnedVal = pstNowTask->pfn( pstNowTask );
690 if (u8TaskReturnedVal == ESOS_TASK_ENDED) {
702 if (__esos_IsSystemFlagSet( __ESOS_SYS_FLAG_PACK_TASKS) ) {
715 u8i = __u8UserTasksRegistered;
718 pstNowTask = &__astUserTaskPool[u8i];
719 if (__au8UserTaskStructIndex[u8i] == REMOVE_IDX) {
720 for ( u8j=u8i+1; u8j<u8NumRegdTasksTemp; u8j++) {
721 __au8UserTaskStructIndex[u8j-1] = __au8UserTaskStructIndex[u8j];
723 __au8UserTaskStructIndex[u8NumRegdTasksTemp-1] =
NULLIDX;
724 u8NumRegdTasksTemp--;
738 __u8UserTasksRegistered=u8NumRegdTasksTemp;
739 __esos_ClearSystemFlag( __ESOS_SYS_FLAG_PACK_TASKS );
ESOS_TMR_HANDLE esos_GetTimerHandle(void(*pfnTmrFcn)(void))
#define esos_GetSystemTick()
uint32_t esos_buffer_hash_u32(void *buf, uint16_t len)
ESOS_TASK_HANDLE esos_RegisterTask(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
uint32_t esos_GetRandomUint32(void)
ESOS_TMR_HANDLE esos_RegisterTimer(void(*timername)(void), uint32_t u32_period)
#define ESOS_IS_TASK_INITED(TaskHandle)
uint32_t esos_string_hash_u32(char *psz_str)
ESOS_TASK_HANDLE esos_GetTaskHandleFromID(uint16_t u16_TaskID)
#define esos_IsTimerRunning(hndl)
uint8_t esos_UnregisterTimer(ESOS_TMR_HANDLE hnd_timer)
#define ESOS_TASK_FLUSH_TASK_MAILBOX(pstTask)
#define esos_GetNumberRunningTimers()
uint8_t esos_GetMaxNumberTasks(void)
ESOS_TASK_HANDLE esos_GetTaskHandle(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
void esos_SetRandomUint32Seed(uint32_t u32_in)
uint8_t esos_ChangeTimerPeriod(ESOS_TMR_HANDLE hnd_timer, uint32_t u32_period)
uint8_t esos_UnregisterTask(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
#define __ESOS_INIT_TASK(TaskHandle)
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.
#define MAX_NUM_CHILD_TASKS
ESOS_TASK_HANDLE esos_GetFreeChildTaskStruct()