Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
调度器
线程查找
相同优先级时间片轮转调度
5
同一优先级中有多个任务,调度器下次怎么查找任务相同优先级的另一个任务?
发布于 2021-05-10 10:44:14 浏览:1328
订阅该版
1.插入线程 ```c void rt_schedule_insert_thread(struct rt_thread *thread) { register rt_base_t temp; RT_ASSERT(thread != RT_NULL); /* disable interrupt */ temp = rt_hw_interrupt_disable(); /* it's current thread, it should be RUNNING thread */ if (thread == rt_current_thread) { thread->stat = RT_THREAD_RUNNING | (thread->stat & ~RT_THREAD_STAT_MASK); goto __exit; } /* READY thread, insert to ready queue */ thread->stat = RT_THREAD_READY | (thread->stat & ~RT_THREAD_STAT_MASK); /* insert thread to ready list */ rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]), &(thread->tlist)); RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("insert thread[%.*s], the priority: %d\n", RT_NAME_MAX, thread->name, thread->current_priority)); /* set priority mask */ #if RT_THREAD_PRIORITY_MAX > 32 rt_thread_ready_table[thread->number] |= thread->high_mask; #endif /*设置优先级组中标志位*/ rt_thread_ready_priority_group |= thread->number_mask; __exit: /* enable interrupt */ rt_hw_interrupt_enable(temp); } ``` Q1;同一优先级中多个线程,RT_Thread怎么标记该些线程? 当同一优先级有多个线程(Thread1,Thread2,Thread...),插入线程时,只是将优先级组`rt_thread_ready_priority_group`对优先级位置1, 那RT-Thread是怎么记录,同一优先级中有个线程的呢?优先级组`rt_thread_ready_priority_group`只能标志该优先级是否存在线程,并不能标记相同优先级有多少个线程。 2.移除线程 ```c void rt_schedule_remove_thread(struct rt_thread *thread) { register rt_base_t level; RT_ASSERT(thread != RT_NULL); /* disable interrupt */ level = rt_hw_interrupt_disable(); RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("remove thread[%.*s], the priority: %d\n", RT_NAME_MAX, thread->name, thread->current_priority)); /* remove thread from ready list */ rt_list_remove(&(thread->tlist)); if (rt_list_isempty(&(rt_thread_priority_table[thread->current_priority]))) { #if RT_THREAD_PRIORITY_MAX > 32 rt_thread_ready_table[thread->number] &= ~thread->high_mask; if (rt_thread_ready_table[thread->number] == 0) { rt_thread_ready_priority_group &= ~thread->number_mask; } #else /*重置优先级组中标志位*/ rt_thread_ready_priority_group &= ~thread->number_mask; #endif } /* enable interrupt */ rt_hw_interrupt_enable(level); } ``` Q2:同一优先级中多个线程,怎么查找该些线程? 如果同一优先级中有多个线程(Thread1,Thread2,Thread...),在移除一个线程时如Thread1移除,重置优先级组(即将优先级对于标志位置0), 那其他Thread2,Thread3,再下次被调用时,需要查优先级组rt_thread_ready_priority_group中对于的标志位, 但此时优先级组`rt_thread_ready_priority_group`已被置0,无法查找其他线程。
查看更多
3
个回答
默认排序
按发布时间排序
chenyizhong
2021-05-10
这家伙很懒,什么也没写!
线程相关的全局变量有两个: 一 个 是 线 程 就 绪 优 先 级 组rt_thread_ready_priority_group 另 一 个 是 线 程 优 先 级 表rt_thread_priority_table[RT_THREAD_PRIORITY_MAX] 线程是有一个线程控制块,每次在让出时间片时会做以下操作: 1.调用rt_list_remove(&(thread->tlist))将时间片耗完的线程从就绪列表移除 2.将线程插入到该优先级下的链表rt_thread_priority_table的尾部、 3.执行线程调度rt_schedule()(会从rt_thread_priority_table中找对应优先级线程链表的表头线程控制块,并执行) 做完以上三步之后,新的线程开始执行了,但是新的线程在优先级线程链表的位置是不变的,直到它让出时间片后被重新安置在同优先级的双向链表尾端 如果线程正常执行完毕或者被调用函数销毁,导致这个优先级没有线程了,那么该优先级在rt_thread_ready_priority_group 中的对应位会被清零,在rt_thread_priority_table下的链表只剩下一个空表头,空表头的前后指针都指向空表头本身 如果这个优先级下又有新的线程被创建了,那么该优先级在rt_thread_ready_priority_group 中的对应位会被置1,线程对应的控制块会被插入rt_thread_priority_table ---------------------------------------------- 以下摘录自RT_THREAD NANO,时间片轮转关键代码 /** * 该函数将让当前线程让出处理器,调度器选择最高优先级的线程运行。当前让出处理器之后, * 当前线程还是在就绪态。 * * @return RT_EOK */ //将当前时间片执行完的线程从就绪链表中的位置放到最后,然后重新调度一个新的优先级高的线程 rt_err_t rt_thread_yield(void) { register rt_base_t level; struct rt_thread *thread; /* 关中断 */ //临界区处理 level = rt_hw_interrupt_disable(); /* 获取当前线程的线程控制块 */ thread = rt_current_thread; /* 如果线程在就绪态,且同一个优先级下不止一个线程,就暂时执行调度,让出CPU */ //如果同一个优先级只有该线程,那就不用让了 if ((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_READY && thread->tlist.next != thread->tlist.prev) { /* 将时间片耗完的线程从就绪列表移除 */ rt_list_remove(&(thread->tlist)); /* 将线程插入到该优先级下的链表的尾部 */ //插入到表头的前面 rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]), &(thread->tlist)); /* 开中断 */ rt_hw_interrupt_enable(level); /* 执行调度 */ rt_schedule(); //这个函数里自带临界区 return RT_EOK; } /* 开中断 */ rt_hw_interrupt_enable(level); return RT_EOK; }
flashman2002
2021-05-10
这家伙很懒,什么也没写!
同一优先级的线程调度基于轮询方式。
JeckXu666
2021-05-10
这家伙很懒,什么也没写!
同一优先级的任务通过链表连接,依次按时间片数量运行
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
xiaotong_n
这家伙很懒,什么也没写!
提问
4
回答
4
被采纳
0
关注TA
发私信
相关问题
1
关于时间片轮询中优先级高低导致轮询出错的问题
2
时间片轮转调度,,,,,,,,
3
时间片轮转调度,,,,,,
4
线程创建函数create最后的tick的作用?
5
跑timeslice_sample的示例,运行结果与文档说明的结果不一样
6
RT-Thread 时间片示例问题
7
时间片例程 结果和pdf给出的结果不同
8
新手问题:刚开始学,看到优先级和时间片,有个问题问一下
9
没有相同优先级线程时,线程时间片的问题
10
关于互斥量与线程时间片的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部