内核数据栈

本页依据 文档基线与后续更新 中记录的 Zephyr main 快照更新。

k_stack 是存放整数值的后进先出容器,与线程调用栈不同。 元素类型 stack_data_t 对应本机字宽,可能是 32 位或 64 位;不要固定写成 uint32_t 来存放指针。

定义与使用

#include <zephyr/kernel.h>

K_STACK_DEFINE(values, 8);

int save_value(stack_data_t value)
{
    return k_stack_push(&values, value);
}

int load_value(stack_data_t *value)
{
    return k_stack_pop(&values, value, K_MSEC(100));
}

动态初始化可提供 stack_data_t 数组并调用 k_stack_init()。 k_stack_alloc_init() 从调用线程的资源池分配数组,使用后在没有使用者和等待者时 通过 k_stack_cleanup() 释放相应动态缓冲区。

容量与返回值

push 不提供阻塞等待空间的参数。通常栈满返回 -ENOMEM;启用 CONFIG_NO_RUNTIME_CHECKS 时,不能依赖运行时检查拦截越界,调用者必须确保容量。 成功返回 0 后数据才被接受。

pop 在没有数据且不等待时返回 -EBUSY,超时返回 -EAGAIN。 线程可等待数据;ISR 可以 push,也可用 K_NO_WAIT pop。 存在等待者时,新值可能直接交给它,不必先进入数组。

地址池用途

可把对象指针转换为 stack_data_t 存入栈,用作简单的空闲对象池。 应确保类型可容纳指针,并保证每个对象最多归还一次。栈只管理值,不自动分配或释放对象。 需求是固定大小缓冲区分配时,也可以直接使用 k_mem_slab。

上游依据