Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
RT-THREAD 调度器的疑问,中断处理并没有无条件触发调度器?
发布于 2017-04-20 13:58:17 浏览:2032
订阅该版
简单分析了RTT2.1.0的内核代码, 关于抢占式调度器有个疑问想请教一下作者。 1. 调度器被触发的时机包括 1). 主动触发: 在任务上下文,通过rt_schedule直接进入最高优先级的下个task. 2). 被动触发: 在tick中断上下文,必须满足当前任务时间片结束,才会设置抢占标志,在返回tick中断时我那成抢占。 因为在中断处理检查调度点并不是无条件的, 假如用户写的中断处理函数中不主动尝试调度,调度器触发就会只会依赖于时钟中断, 在这个时候如果当前任务的时间片设置的特别长,会导致已经处于reay状态的高优先级任务无法被即时投入运行,所以,在每次退出中断之前无条件检查调度点调用 exit_isr,是否可以提高系统的实时性?像下面这样处理 bl rt_interrupt_enter nop bl rt_interrupt_dispatch nop bl rt_interrupt_leave nop bl exit_isr ................... 在exit_isr中检查当前是否有更高优先级的任务存在,如果有,设置调度flag. 个人愚见,还请指教。
查看更多
5
个回答
默认排序
按发布时间排序
bernard
2017-04-20
这家伙很懒,什么也没写!
>> 2). 被动触发: 在tick中断上下文,必须满足当前任务时间片结束,才会设置抢占标志,在返回tick中断时我那成抢占。 你这个就错了
13824125580
2017-04-20
这家伙很懒,什么也没写!
条目2是遗漏了一点,还应该包括timer超时,执行处理timer超时处理函数可能会调用 rt_schedule 触发调用flag.
13824125580
2017-04-20
这家伙很懒,什么也没写!
多谢指导, 重新看了一遍调度器这块的代码,发现自己之前的判断是有问题。 先说一下之前的理解,周期性时钟中断才去检查是否可以调度, 检查的时机是 1.当前任务时间片用完,通过yield调用 rt_schedule 2.当前有timer超时, 超时函数执行唤醒操作的时候,调用链里面会执行"rt_schedule"。 但因为大部分唤醒的动作是在外部中断处理函数中,要做到硬实时,外设中断也应该执行类似yield的动作,由于外设中断处理函数是用户定制的,和平台有关, 无法做到统一,所以最好的办法是在中断处理退出前,也就是 bl rt_leave_interrupt之后进行检查,在这里做到统一。 后来在仔细看了一遍内核唤醒函数的实现后(sem, mutex, flag)唤醒, 函数中都有执行wake up然后调用 “rt_schedule"的操作, 如果能保证所有的唤醒调用链里面都有执行 "rt_schedule",那么效果应该和上面说的加入中断统一退出检查的效果是一样的。 只是对唤醒函数本身的处理,不同的上下文会有区别,任务上下文里面执行rt_schedule直接就被抢占了, 而中断上下文不会立即进行任务抢占,而是设置抢占flag,等到退出中断上下文时会根据flag进行实际的任务切换动作。 所以只要保证所有的唤醒操作入口都能影响到 "flag"标志就可以。 不知道理解的对不对,版主指导。
bernard
2017-04-20
这家伙很懒,什么也没写!
>> 后来在仔细看了一遍内核唤醒操作的实现后(sem, mutex, flag)唤醒, 实现中都有执行完wake up后调用 “rt_schedule"的操作, 如果能保证所有的唤醒调用链里面都有执行 "rt_schedule",那么效果应该和上面说的加入中断统一退出检查的效果是一样的。 只是对唤醒函数本身的处理,不同的上下文有区别,任务上下文里面rt_schedule直接就抢占了, 而中断上下文不会直接进行任务抢占,而是设置抢占flag, 退出中断上下文时会根据flag进行实际的任务切换动作。 所以保证所有的唤醒操作入口都能影响到 "flag"标志就可以。 这个是对的。执行了系统 API 操作,既然在任务状态下能够正确唤醒、调度到正确的任务,那么在中断中执行这些API,也就必然会设定flag。然后当退出中断时,自动切换到对应的任务上去执行了。 lz还是比较好学的,赞一个!学生?期待你有后续的一些学习笔记
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
13824125580
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
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
rt-thread使用cherryusb实现虚拟串口
2
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
3
《原子操作:程序世界里的“最小魔法单位”解析》
4
《C++设计模式:重塑游戏角色系统类结构的秘籍》
5
rt-thread官方usb驱动之虚拟串口
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
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
rt_mq_消息队列_msg_queue
keil_MDK
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
6
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部