系统线程

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

主线程

内核初始化后调用应用的 main。通常写作 int main(void);启用 CONFIG_BOOTARGS 的应用可使用对应的带参数入口。

默认情况下,主线程使用最高的可抢占线程优先级 0;当没有配置可抢占线程时,使用最低的 协作线程优先级 -1。实际配置由 CONFIG_MAIN_THREAD_PRIORITY 等设置决定。 负数优先级属于协作线程,非负数属于可抢占线程,数字越小优先级越高。

主线程执行初始化与 main 时是 essential 线程,异常终止会触发致命错误。 正常从 main 返回则可以结束主线程,不会因此停止其他线程或产生同样的错误。

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>

int main(void)
{
    printk("application started\n");
    return 0;
}

若 main 需要周期处理,可用 k_sleep() 或等待内核对象交出 CPU。 忙等会消耗处理器时间;协作线程尤其要注意主动让出执行机会。

栈与空闲线程

CONFIG_MAIN_STACK_SIZE 控制主线程栈。栈空间需求受调用深度、局部变量、日志、 C 库和体系结构影响,不应继续把早期文档的“默认 1 KiB”当作通用结论。

空闲线程在没有其他可运行工作时执行,使用最低优先级并保持存活。 它可配合电源管理进入节能状态;启用 SMP 时还需考虑每个 CPU 的空闲执行。 CONFIG_IDLE_STACK_SIZE 的值同样与架构、配置有关。

其他系统线程

启用系统工作队列、日志、网络等功能时,系统还可能创建对应服务线程。 这些线程占用自己的栈和调度资源,分析 RAM 或响应时间时应计入。 不要阻塞 essential 线程的必要初始化,也不要从工作队列回调等待必须由同一队列完成的工作。

上游依据