Zephyr OS 入门与实战

第四章:线程与调度机制

线程生命周期 (k_thread_create)

线程创建

在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:

注意事项

协作式 vs 抢占式调度实验

实验目标

通过实际代码演示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);
            

特点:

实验步骤

  1. 创建两个不同优先级的线程
  2. 观察协作式调度下的线程行为
  3. 切换到抢占式调度,观察行为变化
  4. 调整线程优先级,观察调度顺序变化
  5. 分析不同调度策略的适用场景

预期结果

在协作式调度下,低优先级线程会持续运行直到主动让出CPU;而在抢占式调度下,高优先级线程会立即抢占低优先级线程的执行。

调度策略配置

Zephyr的调度策略可以通过Kconfig配置:

                # 启用抢占式调度
                CONFIG_PREEMPT_ENABLED=y
                
                # 启用协作式调度
                CONFIG_COOP_ENABLED=y
                
                # 时间片配置(仅限同优先级线程)
                CONFIG_TIMESLICE_SIZE=10
                CONFIG_TIMESLICE_PRIORITY=0
            
客服小姐姐(优先添加)

客服小姐姐(优先添加)

客服微信

讲师微信(备用)