第四章:线程与调度机制
在Zephyr OS中,线程通过k_thread_create()函数创建。线程创建时需要指定以下关键参数:
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);
Zephyr线程在其生命周期中会经历多种状态:
初始状态 → 就绪状态 → 运行状态 → 等待状态 → 终止状态
关键状态转换API:
k_thread_start() - 启动已创建的线程k_thread_suspend()/k_thread_resume() - 挂起/恢复线程k_thread_abort() - 终止线程k_thread_join() - 等待线程结束通过实际代码演示Zephyr OS中协作式调度与抢占式调度的区别,理解调度策略对系统行为的影响。
在协作式调度下,线程必须主动让出CPU控制权,其他线程才能运行。
void worker_thread(void *p1, void *p2, void *p3)
{
while (1) {
printk("协作式线程运行中...\n");
// 必须主动让出CPU
k_yield();
k_sleep(K_MSEC(100));
}
}
K_THREAD_DEFINE(worker, 1024, worker_thread, NULL, NULL, NULL,
5, 0, 0);
特点:
在抢占式调度下,高优先级线程可以抢占低优先级线程的执行。
void high_prio_thread(void *p1, void *p2, void *p3)
{
while (1) {
printk("高优先级线程抢占执行!\n");
k_sleep(K_MSEC(500));
}
}
void low_prio_thread(void *p1, void *p2, void *p3)
{
while (1) {
printk("低优先级线程运行...\n");
k_busy_wait(1000000); // 模拟长时间工作
}
}
K_THREAD_DEFINE(high_prio, 1024, high_prio_thread, NULL, NULL, NULL,
1, 0, 0);
K_THREAD_DEFINE(low_prio, 1024, low_prio_thread, NULL, NULL, NULL,
5, 0, 0);
特点:
在协作式调度下,低优先级线程会持续运行直到主动让出CPU;而在抢占式调度下,高优先级线程会立即抢占低优先级线程的执行。
Zephyr的调度策略可以通过Kconfig配置:
# 启用抢占式调度
CONFIG_PREEMPT_ENABLED=y
# 启用协作式调度
CONFIG_COOP_ENABLED=y
# 时间片配置(仅限同优先级线程)
CONFIG_TIMESLICE_SIZE=10
CONFIG_TIMESLICE_PRIORITY=0
客服小姐姐(优先添加)
讲师微信(备用)