Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
线程调度
请教 关于从硬件中断退出后的调度
发布于 2013-01-30 15:01:38 浏览:3210
订阅该版
中断退出后还原现场,应该是继续运行中断前的线程。 假如中断释放了信号量,而要获得信号量的线程比当前线程优先级高, 调度器应该切换到更高优先级的线程运行,中断退出后调度器如何立刻切换线程的? 如果是中断中做了标记,中断退出后调度器又是如何停止当前线程的运行,能在第一时间去读取标记的? 谢谢回复!
查看更多
6
个回答
默认排序
按发布时间排序
jaffer
2024-07-27
You can contact me by Email, jaffer.work@foxmail.com, if you want.
纠正一下,博主之前的回答其实是有误的,正确结果如下: **A:** 某线程执行过程中,触发了某个外设的中断,而在对应中断函数中**未调用**会触发调度类的API,如rt_sem_release这类函数,则正常处理外设的中断,处理完中断内容之后回到线程继续运行 此类情况,在中断函数内也就调了 rt_interrupt_enter(); rt_interrupt_leave();这几个函数,这几个函数内还调用了 rt_hw_interrupt_disable(); 和 rt_hw_interrupt_enable(); 并不会触发调度,确实也不需要触发调度。 **B:**某线程执行过程中,触发了某个外设的中断,在对应的中断函数内**调用了**会触发系统调用类的API,如rt_sem_release这类函数,在此类函数内,会检查是否需要调度,如果需要则执行 rt_schedule(); 函数,则根据实际线程等待队列情况,修改线程优先级表,触发 PensV 中断,而 PensV 中断优先级又是最低,因此会等待当前以及其他更高优先级中断处理完成之后,再触发 PensV 中断,进行线程切换 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240727/8061afe5a0499c585764c27b6f47b7e6.png.webp)
yongshi01
2013-01-30
这家伙很懒,什么也没写!
先贴一下prife在群里的回复,在整理个自己的表述。 > **prife回复:** > 以stm32为例子,先明确几点。 > 1.实际的线程的切换是通过PendSV这个中断完成的。并且这种中断的优先级是最低的。 > 2. stm32支持中断嵌套。如果一个中断正在执行时,另外一中断满足,那要看这个新的中断的优先级跟当前正在处理的中断的硬件优先级的关系。 > > 如果刚发生的中断优先级更高,则即可保存现场,执行刚发生的这个中断的处理函数。 反之,新出现的中断优先级比当前处理的ISR的优先级低,那么则会在当前中断ISR处理完成之后,继续执行新发生的中断处理函数。直到所有的中断处理函数都执行完毕,所有的中断状态位都清零。然后再恢复线程上下文,继续执行。 > > 而,如果在中断中释放信号量。 就属于上述2 中的第二种情况,即在ISR中调用rt_sem_release函数,释放信号量,这个函数又会调用rt_hw_interrupt_disable();rt_context_swithc(); (注意,这个函数就会触发PendSV中断,即PendSV的中断状态标志位被设置为1,但是此时无法执行PendSV,因为有两个原因: > (1)此时中断全局开关是关着的。 > (2)此时触发的PendSV中的中断优先级是最低的。 > `rt_hw_interrupt_able() ` > 打开中断之后,依然无法执行PendSV中断,因为此时我们还在中断处理函数中。而PendSV的优先级是最低的。肯定比当前中断优先级低。但是,当当前的中断处理函数执行完毕之后,stm32硬件就会立刻执行PendSV中断,完成实际的线程切换,并切换到新的线程执行。
yongshi01
2013-01-30
这家伙很懒,什么也没写!
个人理解: 1)其他中断中释放信号量等操作,需要重新调度任务的,都会软件设置PendSV这类中断以实现线程的重新调度; 2)PendSV这类中断优先级最低,只能中断CPU线程运行,从而不会影响到其他中断的进入而破坏正常的信号操作;
yongshi01
2013-01-30
这家伙很懒,什么也没写!
[http://book.51cto.com/art/201210/359166.htm](http://book.51cto.com/art/201210/359166.htm) 2.PendSV PendSV是为系统级服务提供的中断驱动。在一个操作系统环境中,当没有其他异常正在执行时,可以使用PendSV来进行上下文的切换。 在进入PendSV处理函数时: - (1)xPSR、PC、LR、R12、R0~R3已经在处理栈中被保存。 - (2)处理模式切换到线程模式。 - (3)栈是主堆栈。 由于PendSV在系统中被设置为最低优先级,因此只有当没有其他异常或者中断在执行时才会被执行。
prife
2013-01-30
这家伙很懒,什么也没写!
楼主辛苦了 ^_^
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
yongshi01
这家伙很懒,什么也没写!
提问
4
回答
30
被采纳
0
关注TA
发私信
相关问题
1
simulator工程的线程调度存在缺陷,导致程序非常容易崩溃
2
线程调度问题,高低优先级线程不会一直占用CPU
3
求助:如何在串口接收线程中调度其他线程?
4
rt_mutex教程线程优先级高的没有delay,怎么会运行线程优先级低的
5
rtt是一个os时钟中断调度一次吗
6
RT-Thread Nano的线程切换机制?
7
多次调用rt_thread_startup出现stack overflow错误
8
有些线程,不希望被耗时的线程打断
9
请问 RT_OBJECT_HOOK_CALL 调用后会直接开始运行被勾起的函数嘛
10
使用canfestival软件包报错
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
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
【24嵌入式设计大赛】基于RT-Thread星火一号开发版的多功能智能家居系统
2
【24嵌入式设计大赛】基于RT-Thread VisionBoard开发版的视觉循迹小车
3
【24嵌入式设计大赛】基于腾讯云及WOL的PC远程开机系统
4
图解 slab 内存分配算法
5
mcxn947 dht11温湿度采集
热门标签
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
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
at_device
MicroPython
rt_mq_消息队列_msg_queue
ulog
C++_cpp
本月问答贡献
用户名由3_15位
3
个答案
1
次被采纳
rv666
3
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
道友
1
个答案
1
次被采纳
坐听风起
1
个答案
1
次被采纳
本月文章贡献
jaffer
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
4
次点赞
不灬忘初心
1
篇文章
2
次点赞
BRICK PORTER
1
篇文章
1
次点赞
程序猿Charlie
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部