欢迎光临
我们一直在努力

042、Zephyr RTOS内核基础:线程创建与管理

Zephyr RTOS内核基础:线程创建与管理

从一次现场崩溃说起

去年在做一个工业网关项目,设备在客户现场跑了三天,突然看门狗复位。抓了日志发现是某个传感器采集线程卡死在了一个while循环里,导致高优先级的管理线程永远拿不到CPU。更诡异的是,这个线程明明设置了500ms的睡眠,为什么没被调度出去?后来查代码才发现,有人在中断上下文里调用了k_sleep()——Zephyr里中断里不能阻塞,这是铁律。那次之后,我养成了在每一个线程入口函数第一行打印线程ID的习惯。

线程的本质:Zephyr里的“轻量级任务”

Zephyr的线程和Linux的线程不太一样。它没有进程的概念,所有线程共享同一个地址空间。每个线程本质上就是一个函数指针加上一个栈空间。创建线程时你给它的栈大小,就是它全部的家当——没有虚拟内存帮你动态扩展,栈溢出就是真的溢出,直接踩到隔壁线程的数据。

线程控制块(TCB)是内核维护线程状态的核心结构体,里面存了优先级、栈指针、调度状态这些关键信息。Zephyr里线程的状态机比教科书上画的要复杂一些:就绪、运行、挂起、等待、休眠、终止,还有几个特殊状态比如“等待信号量”和“等待消息队列”。调试时最常用的就是看线程当前处于哪个状态——卡在等待队列里还是真的在跑。

创建线程:不止是调用一个API

// 这里踩过坑:栈大小给太小,跑着跑着就崩了

赞(0)
未经允许不得转载:171主机测评 » 042、Zephyr RTOS内核基础:线程创建与管理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址