void main(void) { struct vsf_module_t *module; struct vsf_module_info_t *minfo = (struct vsf_module_info_t *)APPCFG_MODULES_ADDR; int32_t pagesize; vsf_enter_critical(); vsfhal_core_init(NULL); vsfhal_flash_capacity(0, (uint32_t*)&pagesize, NULL); pagesize = msb(pagesize); vsf_bufmgr_init(app.bufmgr_buffer, sizeof(app.bufmgr_buffer)); // register modules while (minfo->entry != 0xFFFFFFFF) { module = vsf_bufmgr_malloc(sizeof(struct vsf_module_t)); if (NULL == module) { break; } module->flash = minfo; minfo = (struct vsf_module_info_t *)((uint8_t *)minfo +\ ((minfo->size + (1 << pagesize) - 1) & ~((1 << pagesize) - 1))); vsf_module_register(module); } vsf_module_load("vsf.os", true); // vsfos module SHALL never return; }
int main(void) { uint32_t app_main_ptr; vsf_leave_critical(); // system initialize vsf_bufmgr_init(app.bufmgr_buffer, sizeof(app.bufmgr_buffer)); core_interfaces.core.init(NULL); core_interfaces.tickclk.init(); core_interfaces.tickclk.start(); vsftimer_init(); core_interfaces.tickclk.set_callback(app_tickclk_callback_int, NULL); if (app.hwcfg.key.port != IFS_DUMMY_PORT) { core_interfaces.gpio.init(app.hwcfg.key.port); core_interfaces.gpio.config_pin(app.hwcfg.key.port, app.hwcfg.key.port, GPIO_INPU); } if ((IFS_DUMMY_PORT == app.hwcfg.key.port) || core_interfaces.gpio.get(app.hwcfg.key.port, 1 << app.hwcfg.key.pin)) { // key release // load and call application app_main_ptr = *(uint32_t *)APP_MAIN_ADDR; if (app_main_ptr < 128 * 1024) { app_main_ptr += APP_MAIN_ADDR; ((int (*)(struct app_hwcfg_t *hwcfg))app_main_ptr)(&app.hwcfg); } else { goto bootlaoder_init; } } else { // run bootloader bootlaoder_init: } while (1) { vsfsm_poll(); vsf_enter_critical(); if (!vsfsm_get_event_pending()) { // sleep, will also enable interrupt core_interfaces.core.sleep(SLEEP_WFI); } else { vsf_leave_critical(); } } }