k_tid_t k_thread_spawn(char *stack, size_t stack_size, void (*entry)(void *, void *, void*), void *p1, void *p2, void *p3, int prio, u32_t options, s32_t delay) { __ASSERT(!_is_in_isr(), ""); struct k_thread *new_thread = (struct k_thread *)stack; _new_thread(stack, stack_size, entry, p1, p2, p3, prio, options); schedule_new_thread(new_thread, delay); return new_thread; }
void _init_static_threads(void) { unsigned int key; _FOREACH_STATIC_THREAD(thread_data) { _task_group_adjust(thread_data); _new_thread( thread_data->init_stack, thread_data->init_stack_size, thread_data->init_entry, thread_data->init_p1, thread_data->init_p2, thread_data->init_p3, thread_data->init_prio, thread_data->init_options); thread_data->thread->init_data = thread_data; } _sched_lock(); /* Start all (legacy) threads that are part of the EXE task group */ _k_thread_group_op(K_TASK_GROUP_EXE, _k_thread_single_start); /* * Non-legacy static threads may be started immediately or after a * previously specified delay. Even though the scheduler is locked, * ticks can still be delivered and processed. Lock interrupts so * that the countdown until execution begins from the same tick. * * Note that static threads defined using the legacy API have a * delay of K_FOREVER. */ key = irq_lock(); _FOREACH_STATIC_THREAD(thread_data) { if (thread_data->init_delay != K_FOREVER) { schedule_new_thread(thread_data->thread, thread_data->init_delay); } } irq_unlock(key); k_sched_unlock(); }