Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
线程调度
rtt是一个os时钟中断调度一次吗
发布于 2022-03-22 18:30:21 浏览:878
订阅该版
比如我用stm32,systick 1ms中断一次 那么每个线程最少得运行1ms,再去systick中断里检查线程优先级和等待资源超时 同样,某个线程结束,假如等到下一次systick中断到来之前,系统没有执行任何程序吗? idel线程也只会到下个中断到来后才执行
查看更多
3
个回答
默认排序
按发布时间排序
张世争
2022-03-22
学以致用
可以搜下:`rt_schedule();`,这是执行调度的,
crystal266
2022-03-22
嵌入式
是在内核滴答计时器的中断中进行判断和线程的调度的。 内核滴答计时器中断的处理函数如下: ``` /* libraries/HAL_Drivers/drv_common.c */ void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); HAL_IncTick(); rt_tick_increase(); // 检查线程的状态进行调度;检查定时器列表的状态 /* leave interrupt */ rt_interrupt_leave(); } ``` rt_tick_increase() 的源码如下:里面判断了是否有就绪的线程有的话进行调度器的调度,最后查看了定时器列表查看是都有定时器到时,有的话执行定时器的回调函数。 ``` /* rt-thread/src/clock.c */ void rt_tick_increase(void) { struct rt_thread *thread; rt_base_t level; level = rt_hw_interrupt_disable(); /* increase the global tick */ #ifdef RT_USING_SMP rt_cpu_self()->tick ++; #else ++ rt_tick; #endif /* RT_USING_SMP */ /* check time slice */ thread = rt_thread_self(); // 获取当前运行的线程 -- thread->remaining_tick; // 剩余的时间片计数自减1 if (thread->remaining_tick == 0) // 剩余的时间片计数检查 { /* change to initialized tick */ thread->remaining_tick = thread->init_tick; thread->stat |= RT_THREAD_STAT_YIELD; rt_hw_interrupt_enable(level); rt_schedule(); // 调度器 } else { rt_hw_interrupt_enable(level); } /* check timer */ rt_timer_check(); // 定时器列表检查 } ``` rt_schedule() 的源码如下:进行线程优先级的判断进行调度。 ``` /* rt-thread/src/scheduler.c */ void rt_schedule(void) { ...... /* 关中断 */ level = rt_hw_interrupt_disable(); ...... /* 获取优先级最高的线程 */ to_thread = _get_highest_priority_thread(&highest_ready_priority); ...... /* 如果当前线程的优先级低于获取到线程的优先级,则让出处理器资源 */ rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; need_insert_from_thread = 1; ...... /* 开启切换 */ rt_current_priority = (rt_uint8_t)highest_ready_priority; from_thread = rt_current_thread; rt_current_thread = to_thread; ...... /* 将要切换线程从ready队列移除 */ rt_schedule_remove_thread(to_thread); /* 将要切换线程的状态设为运行状态 */ to_thread->stat = RT_THREAD_RUNNING | (to_thread->stat & ~RT_THREAD_STAT_MASK); ...... /* 栈溢出检查 */ _rt_scheduler_stack_check(to_thread); ...... /* 这里假设是正常的切换,不是中断触发,所以进入该分支 */ rt_hw_context_switch((rt_ubase_t)&from_thread->sp, (rt_ubase_t)&to_thread->sp); ...... } ```
出出啊
2022-03-23
恃人不如自恃,人之为己者不如己之自为也
几种调度方式。 1. 线程时间片耗尽,这个时候是在 systick 中断里进行的调度。时间片轮换式。 2. 线程等待资源自动挂起,这个时候可能出现在任何时间,不一定是 systick 中断。让出 cpu 资源给低优先级线程,比如 idle。 3. 其它外设中断里,资源可用,引起线程调度,可能出现挂起当前线程,转向更高优先级线程。抢占式。
撰写答案
登录
注册新账号
关注者
0
被浏览
878
关于作者
zyxwd
这家伙很懒,什么也没写!
提问
4
回答
1
被采纳
0
关注TA
发私信
相关问题
1
simulator工程的线程调度存在缺陷,导致程序非常容易崩溃
2
线程调度问题,高低优先级线程不会一直占用CPU
3
求助:如何在串口接收线程中调度其他线程?
4
rt_mutex教程线程优先级高的没有delay,怎么会运行线程优先级低的
5
RT-Thread Nano的线程切换机制?
6
多次调用rt_thread_startup出现stack overflow错误
7
有些线程,不希望被耗时的线程打断
8
请问 RT_OBJECT_HOOK_CALL 调用后会直接开始运行被勾起的函数嘛
9
使用canfestival软件包报错
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部