1. 创建线程(任务)时优先级的区别
1.1 FreeRTOS
概念名称:任务(Task)
优先级取值范围:
0 ~ (configMAX_PRIORITIES - 1)
数字越大,优先级越高
指定优先级方式:
创建任务时,调用 xTaskCreate() 或 xTaskCreateStatic() 指定优先级
调度机制:
优先调度优先级数字大的任务
同优先级任务默认不轮转,需要配置 configUSE_TIME_SLICING = 1
空闲任务:
优先级通常为 0(最低)
1.2 RT-Thread
概念名称:线程(Thread)
优先级取值范围:
0 ~ (RT_THREAD_PRIORITY_MAX - 1),默认是0~31
数字越小,优先级越高
指定优先级方式:
创建线程时,调用 rt_thread_create() 或 rt_thread_init() 指定优先级
调度机制:
优先调度优先级数字小的线程
同优先级线程默认支持时间片轮转
空闲线程:
优先级为最大值(最低优先级)
1.3 核心对比表
2. 优先级链表插入方式的区别
2.1 FreeRTOS
就绪链表结构:
每个优先级一个链表,链表数组大小为 configMAX_PRIORITIES
插入逻辑:
新建任务插入对应优先级链表的末尾
时间片轮转开启后,每次tick到时,将当前运行任务重新插到链表末尾
调度逻辑:
从优先级数字大到小遍历,找到最高优先级的非空链表,调度链表头部任务
2.2 RT-Thread
就绪链表结构:
每个优先级一个链表,链表数量为 RT_THREAD_PRIORITY_MAX
插入逻辑:
默认新线程插入到链表末尾(支持时间片轮转)
特殊情况下可以选择插入链表头部(加速响应)
调度逻辑:
从优先级数字小到大遍历,找到最高优先级的非空链表,调度链表头部线程
2.3 核心对比表
3. 小结
FreeRTOS优先级数字越大越高,RT-Thread数字越小越高。
FreeRTOS同优先级默认不轮转,需要手动开启时间片;RT-Thread默认支持时间片轮转。
两者都通过每个优先级一个链表管理就绪线程(任务),插入链表时有不同策略,影响多任务调度行为。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/hallo_zz/article/details/147544927
|