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(); } } }
static void vsfos_on_pendsv(void *param) { struct vsfsm_evtq_t *evtq_cur = param, *evtq_old = vsfsm_evtq_get(); vsfsm_evtq_set(evtq_cur); while (vsfsm_get_event_pending()) { vsfsm_poll(); } vsfsm_evtq_set(evtq_old); }