sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio) { size_t wsz; void *wsp; syssts_t sts; thread_t *tp; (void)name; wsz = THD_WORKING_AREA_SIZE(stacksize); wsp = chCoreAlloc(wsz); if (wsp == NULL) return NULL; #if CH_DBG_FILL_THREADS == TRUE _thread_memfill((uint8_t *)wsp, (uint8_t *)wsp + sizeof(thread_t), CH_DBG_THREAD_FILL_VALUE); _thread_memfill((uint8_t *)wsp + sizeof(thread_t), (uint8_t *)wsp + wsz, CH_DBG_STACK_FILL_VALUE); #endif sts = chSysGetStatusAndLockX(); tp = chThdCreateI(wsp, wsz, prio, (tfunc_t)thread, arg); chRegSetThreadNameX(tp, name); chThdStartI(tp); chSysRestoreStatusX(sts); return (sys_thread_t)tp; }
/** * @brief ChibiOS/RT initialization. * @details After executing this function the current instructions stream * becomes the main thread. * @pre Interrupts must disabled before invoking this function. * @post The main thread is created with priority @p NORMALPRIO and * interrupts are enabled. * * @special */ void chSysInit(void) { #if CH_DBG_ENABLE_STACK_CHECK == TRUE extern stkalign_t __main_thread_stack_base__; #endif port_init(); _scheduler_init(); _vt_init(); #if CH_DBG_SYSTEM_STATE_CHECK == TRUE ch.dbg.isr_cnt = (cnt_t)0; ch.dbg.lock_cnt = (cnt_t)0; #endif #if CH_CFG_USE_TM == TRUE _tm_init(); #endif #if CH_CFG_USE_MEMCORE == TRUE _core_init(); #endif #if CH_CFG_USE_HEAP == TRUE _heap_init(); #endif #if CH_DBG_STATISTICS == TRUE _stats_init(); #endif #if CH_DBG_ENABLE_TRACE == TRUE _dbg_trace_init(); #endif #if CH_CFG_NO_IDLE_THREAD == FALSE /* Now this instructions flow becomes the main thread.*/ setcurrp(_thread_init(&ch.mainthread, NORMALPRIO)); #else /* Now this instructions flow becomes the idle thread.*/ setcurrp(_thread_init(&ch.mainthread, IDLEPRIO)); #endif currp->p_state = CH_STATE_CURRENT; #if CH_DBG_ENABLE_STACK_CHECK == TRUE /* This is a special case because the main thread thread_t structure is not adjacent to its stack area.*/ currp->p_stklimit = &__main_thread_stack_base__; #endif chSysEnable(); #if CH_CFG_USE_REGISTRY == TRUE /* Note, &ch_debug points to the string "main" if the registry is active.*/ chRegSetThreadName((const char *)&ch_debug); #endif #if CH_CFG_NO_IDLE_THREAD == FALSE { /* This thread has the lowest priority in the system, its role is just to serve interrupts in its context while keeping the lowest energy saving mode compatible with the system status.*/ thread_t *tp = chThdCreateStatic(ch.idle_thread_wa, sizeof(ch.idle_thread_wa), IDLEPRIO, (tfunc_t)_idle_thread, NULL); chRegSetThreadNameX(tp, "idle"); } #endif }