Zephyr 内核对象是实时操作系统(RTOS)的核心组件,提供了多任务处理所需的同步和通信机制。
// 定义线程栈
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);
// 定义互斥锁
struct k_mutex my_mutex;
// 初始化
k_mutex_init(&my_mutex);
// 获取锁
k_mutex_lock(&my_mutex, K_FOREVER);
// 临界区代码
shared_resource++;
// 释放锁
k_mutex_unlock(&my_mutex);
互斥锁特点:
// 定义信号量
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);
信号量类型:
// 定义消息队列
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);
// 定义管道
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 | 栈队列 | 是 | 缓冲区池管理 |
// 打印线程信息
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*