extern EONtheSystem * eon_sys_Initialise(const eOnsystem_cfg_t *syscfg, const eOmempool_cfg_t *mpoolcfg, const eOerrman_cfg_t *errmancfg) { if(NULL != s_eos_the_system.thevsys) { // already initialised return(&s_eos_the_system); } if(NULL == syscfg) { syscfg = &eon_system_cfg_default; } // mpoolcfg can be NULL: in such a case we use eo_mempool_alloc_dynamic mode // errmancfg can be NULL // mempool and error manager initialised inside here. s_eos_the_system.thevsys = eov_sys_hid_Initialise( mpoolcfg, errmancfg, s_eon_sys_start, s_eon_sys_gettask, s_eon_sys_timelifeget, s_eon_sys_timelifeset, s_eon_sys_nanotimeget, NULL ); // and reset the lifetime s_eos_the_system.lifetime = 0; return(&s_eos_the_system); }
extern EOStheSystem * eos_sys_Initialise(const eOssystem_cfg_t *syscfg, const eOmempool_cfg_t *mpoolcfg, const eOerrman_cfg_t *errmancfg, const eOstimerman_cfg_t *tmrmancfg, const eOscallbackman_cfg_t *cbkmancfg, const eOsfoop_cfg_t *foopcfg) { eOsfoop_cfg_t localfoopcfg; if(NULL != s_eos_the_system.thevsys) { // already initialised return(&s_eos_the_system); } // mpoolcfg can be NULL: in such a case we use eo_mempool_alloc_dynamic mode // errmancfg can be NULL // mempool and error manager initialised inside here. s_eos_the_system.thevsys = eov_sys_hid_Initialise( mpoolcfg, errmancfg, s_eos_sys_start, s_eos_sys_gettask, s_eos_sys_timelifeget, s_eos_sys_timelifeset, s_eos_sys_nanotimeget, syscfg->hal_fns.hal_sys_irq_disable ); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg), s_eobj_ownname, "eos_sys_Start() uses a NULL syscfg", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_start), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_start()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_systick_sethandler), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_systick_sethandler()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_atomic_bitwiseAND), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_atomic_bitwiseAND()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_atomic_bitwiseOR), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_atomic_bitwiseOR()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_criticalsection_take), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_criticalsection_take()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_criticalsection_release), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_criticalsection_release()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_irq_disable), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_irq_disable()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->hal_fns.hal_sys_irq_enable), s_eobj_ownname, "eos_sys_Start() uses a NULL hal_sys_irq_enable()", NULL); eo_errman_Assert(eo_errman_GetHandle(), (syscfg->userdef.systickperiod >= EOSSYS_min_systickperiod), s_eobj_ownname, "eos_sys_Start() uses systickperiod too small", NULL); eo_errman_Assert(eo_errman_GetHandle(), (syscfg->userdef.systickperiod <= EOSSYS_max_systickperiod), s_eobj_ownname, "eos_sys_Start() uses systickperiod too high", NULL); // after the previous assert() we are now sure that syscfg and foopcfg contain valid values. thus copy them // the syscfg s_eos_the_system.syscfg = syscfg; // we adjust the various configurations, so that a NULL pointer means the default. if(NULL == foopcfg) { foopcfg = (eOsfoop_cfg_t*)&eos_foop_DefaultCfg; } memcpy(&localfoopcfg, foopcfg, sizeof(eOsfoop_cfg_t)); foopcfg = &localfoopcfg; if(NULL == tmrmancfg) { tmrmancfg = (eOstimerman_cfg_t*)&eos_timerman_DefaultCfg; } if(NULL == cbkmancfg) { cbkmancfg = (eOscallbackman_cfg_t*)&eos_callbackman_DefaultCfg; } // then we adjust the foop cfg to have a queue size for callbacks as reported in the cfg of the cbk manager localfoopcfg.callbackfifosize = cbkmancfg->queuesize; // we always initialise the foop. s_eos_the_system.thefoop = eos_foop_Initialise(&localfoopcfg, (eOsfoop_hal_fn_t*)&s_eos_the_system.syscfg->hal_fns); // and reset the tickoflife s_eos_the_system.tickoflife = 0; // finally we initialise the timerman and the callbackman but only if ... they have non-zero values in their cfg // they are independent. one can use a timermanager but does not want execution of callbacks if(0 != tmrmancfg->timernum) { eos_timerman_Initialise(tmrmancfg); eos_foop_hid_SetOnTick(eos_foop_GetHandle(), s_eos_sys_tick_timermanager); } if(0 != cbkmancfg->queuesize) { eos_callbackman_Initialise(cbkmancfg); } // start hal using externally provided function s_eos_the_system.syscfg->hal_fns.hal_start(); return(&s_eos_the_system); }
extern EOMtheSystem * eom_sys_Initialise(const eOmsystem_cfg_t *syscfg, const eOmempool_cfg_t *mpoolcfg, const eOerrman_cfg_t *errmancfg, const eOmtimerman_cfg_t *tmrmancfg, const eOmcallbackman_cfg_t *cbkmancfg) { uint32_t ram08size = 0; uint64_t *ram08data = NULL; if(NULL != s_eom_system.thevsys) { // already initialised return(&s_eom_system); } eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg), "eom_sys_Initialise(): NULL syscfg", s_eobj_ownname, &eo_errman_DescrWrongParamLocal); // verify that we have a valid osalcfg and halcfg. fsalcfg can be NULL eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->halcfg), "eom_sys_Initialise(): NULL halcfg", s_eobj_ownname, &eo_errman_DescrWrongParamLocal); eo_errman_Assert(eo_errman_GetHandle(), (NULL != syscfg->osalcfg), "eom_sys_Initialise(): NULL osalcfg", s_eobj_ownname, &eo_errman_DescrWrongParamLocal); // mpoolcfg can be NULL: in such a case we use eo_mempool_alloc_dynamic mode // errmancfg can be NULL // tmrmancfg can be NULL: in such a case we use default values // cbkmancfg can be NULL: in such a case we use default values // mempool and error manager initialised inside here. s_eom_system.thevsys = eov_sys_hid_Initialise(mpoolcfg, errmancfg, // error man (eOres_fp_voidfpvoid_t)s_eom_sys_start, s_eom_gettask, osal_system_abstime_get, osal_system_ticks_abstime_set, (eOuint64_fp_void_t)osal_system_nanotime_get, hal_sys_irq_disable); s_eom_system.halcfg = syscfg->halcfg; s_eom_system.osalcfg = syscfg->osalcfg; s_eom_system.tmrmancfg = tmrmancfg; s_eom_system.cbkmancfg = cbkmancfg; hal_core_init(syscfg->halcfg); hal_core_start(); if(0 != syscfg->codespaceoffset) { hal_sys_vectortable_relocate(syscfg->codespaceoffset); } // initialise osal osal_base_memory_getsize(s_eom_system.osalcfg, &ram08size); if(0 != ram08size) { ram08data = (uint64_t*) eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_64bit, ram08size, 1); } osal_base_initialise(s_eom_system.osalcfg, ram08data); return(&s_eom_system); }