
如果你之前一直在用FreeRTOS,刚接触Zephyr时很容易在线程优先级这里踩坑。

第一个差异很好理解
FreeRTOS:数值越大,优先级越高
Zephyr:数值越小,优先级越高
但Zephyr还有一个容易忽略的特殊设计:优先级数值同时决定线程是协作式(cooperative)还是可抢占式(preemptible)。

协作式线程:使用负数优先级
协作式线程会持续占用CPU,直到主动放弃CPU资源——比如阻塞、主动让出CPU、休眠或者变为非就绪状态。
即便此时有可抢占线程进入就绪态,也不能打断正在运行的协作式线程。
这就意味着你必须严格控制协作式线程的运行时长。如果它长时间占用CPU,所有等待运行的可抢占线程都会被延迟。

可抢占式线程:优先级≥0
当更高优先级的可抢占线程变为就绪态时,可以抢占低优先级可抢占线程的执行。
简化后的Zephyr优先级映射:
--3协作式,优先级更高
--2协作式
--1协作式
-0可抢占式,可抢占线程里的最高优先级
-1可抢占式
-2可抢占式
-3可抢占式,优先级更低

重点是什么?
优先级-1的协作式线程,会阻止优先级0的可抢占线程运行,直到该协作线程主动释放CPU。并且线程的协作/抢占属性并非固定不变。运行时修改线程优先级,跨过0这个分界点时,线程的调度行为也会随之改变。
注意:如果你的需求只是临时关闭线程抢占,不要靠把线程优先级改成负数来实现。Zephyr专门提供了k_sched_lock()接口用于该场景。
所以从FreeRTOS迁移到Zephyr,绝不是简单换算优先级数字那么简单,你必须理解这些数字背后:调度器行为的控制逻辑。
在设计Zephyr应用时,你会刻意使用协作式线程,还是让应用里大部分线程都采用可抢占模式?

麦克泰技术具有丰富嵌入式软件项目开发、行业应用与服务经验。今天,我们依托欧美嵌入式软件商业团队支持,提供嵌入式软件商业授权和服务。包括(不限于)SEGGER嵌入式软件开发和编程工具(J-Link/Flasher),OS分析工具Tracealyzer,WITTENSTEIN公司的SafeRTOS(FreeRTOS)、Flexible Safety RTOS(µC/OS-II MPU)以及新一代PX5 RTOS。麦克泰技术专注预认证功能安全操作系统在汽车、轨交、医疗和工业领域的应用以及RISC-V处理器嵌入式开发生态建设。我们正在以开放开源+商业软件的支持,服务产业客户,更多信息请访问www.bmrtech.com以及我们微信公众号“麦克泰技术”。

产品购买(麦克泰)

产品购买(贝尼思)

线上课程(网校)
欢迎关注微信公众号【麦克泰技术】,回复 “加群” 按提示可加入技术交流群
产品咨询:
北京:010-62975900
上海:021-62127690
深圳:0755-82977971
分享、在看与点赞,至少我要拥有一个吧
