内核数据栈
本页依据 文档基线与后续更新 中记录的 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。