返回首页

Zephyr 内核对象学习笔记

概述

Zephyr 内核对象是实时操作系统(RTOS)的核心组件,提供了多任务处理所需的同步和通信机制。

线程 (k_thread)

基本概念

线程创建

// 定义线程栈
K_THREAD_STACK_DEFINE(my_stack, 1024);

// 定义线程控制块
struct k_thread my_thread_data;

// 线程入口函数
void my_thread_entry(void *p1, void *p2, void *p3)
{
    while (1) {
        // 线程工作
        k_sleep(K_MSEC(100));
    }
}

// 创建并启动线程
k_tid_t tid = k_thread_create(&my_thread_data, my_stack,
                              K_THREAD_STACK_SIZEOF(my_stack),
                              my_thread_entry,
                              NULL, NULL, NULL,
                              K_PRIO_PREEMPT(7), 0, K_NO_WAIT);

线程状态

线程优先级

线程同步原语

互斥锁 (k_mutex)

// 定义互斥锁
struct k_mutex my_mutex;

// 初始化
k_mutex_init(&my_mutex);

// 获取锁
k_mutex_lock(&my_mutex, K_FOREVER);

// 临界区代码
shared_resource++;

// 释放锁
k_mutex_unlock(&my_mutex);

互斥锁特点:

信号量 (k_sem)

// 定义信号量
struct k_sem my_sem;

// 初始化(初始计数=0,最大计数=1)
k_sem_init(&my_sem, 0, 1);

// 等待信号量(会阻塞)
k_sem_take(&my_sem, K_FOREVER);

// 发送信号量
k_sem_give(&my_sem);

// 获取当前计数
unsigned int count = k_sem_count_get(&my_sem);

信号量类型:

线程间通信

消息队列 (k_msgq)

// 定义消息队列
struct k_msgq my_msgq;
char msgq_buffer[10 * sizeof(my_message)];

// 初始化
k_msgq_init(&my_msgq, msgq_buffer, sizeof(my_message), 10);

// 发送消息
k_msgq_put(&my_msgq, &msg, K_NO_WAIT);

// 接收消息
k_msgq_get(&my_msgq, &msg, K_FOREVER);

管道 (k_pipe)

// 定义管道
struct k_pipe my_pipe;
char pipe_buffer[256];

// 初始化
k_pipe_init(&my_pipe, pipe_buffer, sizeof(pipe_buffer));

// 写入
size_t bytes_written;
k_pipe_put(&my_pipe, data, len, &bytes_written, 0, K_NO_WAIT);

// 读取
size_t bytes_read;
k_pipe_get(&my_pipe, buffer, len, &bytes_read, 0, K_FOREVER);

内核对象对比

对象用途阻塞典型场景
k_mutex互斥访问保护共享资源
k_sem任务同步中断→线程通知
k_msgq消息传递线程间数据交换
k_pipe字节流大数据传输
k_fifo链表队列多生产者单消费者
k_lifo栈队列缓冲区池管理

最佳实践

  1. 锁的粒度:保持临界区尽可能短
  2. 避免死锁:始终按相同顺序获取多个锁
  3. 超时使用:使用超时而非 K_FOREVER 防止永久阻塞
  4. 栈大小:合理估计线程栈需求,避免溢出
  5. 优先级设计:避免优先级反转,关键任务使用高优先级

调试技巧

// 打印线程信息
k_thread_foreach(thread_info_cb, NULL);

// 检查栈使用量
size_t unused = k_thread_stack_space_get(tid);

// 内核对象跟踪(需启用 CONFIG_TRACING)

相关配置

CONFIG_MULTITHREADING=y
CONFIG_NUM_COOP_PRIORITIES=16
CONFIG_NUM_PREEMPT_PRIORITIES=15
CONFIG_MAIN_STACK_SIZE=1024
CONFIG_IDLE_STACK_SIZE=256

参考链接


*学习笔记创建时间: 2026-03-19*