Zephyr -- Threads
Threads CONFIG_MULTITHREADING打开Zephyr多线程功能。 Zephyr线程有下面几个关键的特性: Stack area。 线程的栈大小可修改。 thread control block k_thread。用来保存线程的一些metadata。 entry point function。线程开始执行运行的函数。 scheduling priority。支持配置调度优先级。 thread option。提供线程的一些特殊配置。 execution mode。Supervisor/User mode。依赖于CONFIG_USERSPACE。 Lifecycle k_thread_create(): 创建线程。 k_thread_join(): 阻塞等待线程终止。 k_thread_abort(): 发生异常情况,线程可以由自己或其他线程来终结。 k_thread_suspend(), k_thread_resume(): 线程suspend后只有通过resume才能重新调度。 Thread States Thread Stack objects 初始化线程栈相关属性,如果线程只在内核运行,用K_KERNEL_STACK_XXX。 如果是user space线程,用K_THREAD_STACK_XXX。 如果CONFIG_USERSPACE没打开,那么K_THREAD_STACK等于K_KERNEL_STACK。 Thread Priorities 优先级数字越小,优先级越高。 cooperative thread可配置的优先级为 -CONFIG_NUM_COOP_PRIORITIES到-1。 preemptible thread可配置的优先级为0到 (CONFIG_NUM_PREEMPT_PRIORITIES-1)。 可见cooperative thread的优先级肯定比preemptible thread高。 Cooperative thread是需要主动交出CPU控制权的,否则会一直执行该线程。 Preemptible thread是根据时间片轮转调度的,会自动切换线程。 Meta-IRQ Priorities // TODO: APIs 创建线程: 方法1: k_tid_t k_thread_create(struct k_thread *new_thread, k_thread_stack_t *stack, size_t stack_size, k_thread_entry_t entry, void *p1, void *p2, void *p3, int prio, uint32_t options, k_timeout_t delay) 线程栈必须使用 K_THREAD_STACK_DEFINE or K_KERNEL_STACK_DEFINE定义。 线程栈大小必须是传入给K_THREAD_STACK or K_KERNEL_STACK宏的大小。或者利用K_THREAD_STACK_SIZEOF()/K_KERNEL_STACK_SIZEOF(),对用K_THREAD_STACK/K_KERNEL_STACK创建线程返回的结构体。 e....