系统线程
本页依据 文档基线与后续更新 中记录的 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 线程的必要初始化,也不要从工作队列回调等待必须由同一队列完成的工作。