Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
idle空闲线程
系统优化
rt-thread 系统优化系列(六) 之 让 idle 线程闲下来
发布于 2021-11-10 11:51:52 浏览:2869
订阅该版
[tocm] ## 前言 曾经,在论坛里跟某小伙伴探讨问题,说到 rt-thread 中的中断操作太频繁了。当时粗略看了一眼,虽然有怀疑,但也没发现 idle 线程里不合理的地方。 经过上篇对僵尸线程的销毁流程的梳理,才发现 idle 线程是可以做到更“空闲”的。 ### idle 线程 - idle 线程的主要工作就是清理僵尸线程。如果是动态线程对象,回收动态线程对象的内存工作也是 idle 线程的任务。 - 但是,在没有线程需要退出、删除的情况下,除了几句函数调用和判断是否有僵尸线程,是无事可做的。 想清楚了 idle 线程的这点儿特性后,接下来就容量理解了。 #### 无僵尸线程情况 如下,无僵尸线程情况下的最简化代码, ``` static void rt_defunct_execute(void) { while (1) { rt_base_t lock; rt_thread_t thread; void (*cleanup)(struct rt_thread *tid); /* disable interrupt */ lock = rt_hw_interrupt_disable(); thread = rt_thread_defunct_dequeue(); if (!thread) { rt_hw_interrupt_enable(lock); break; } ... } } static void rt_thread_idle_entry(void *parameter) { while (1) { rt_defunct_execute(); } } ``` - `rt_thread_idle_entry` 线程入口函数里一个 while 循环调用 `rt_defunct_execute`,`rt_defunct_execute` 函数里另一个 while 循环。 - 先关中断,然后获取僵尸线程,判断是否有僵尸线程,最后开中断。如此往复。。。几乎一半的时间是在关中断中。 #### 有僵尸线程情况 继续往下看 `rt_defunct_execute` 函数的其它操作,销毁僵尸线程的过程还有一次关开中断操作。经过仔细分析 `rt_defunct_execute` 其中的所有关中断操作都可以删掉。 #### 优化后 简化后的代码如下: ``` static void rt_defunct_execute(void) { /* Loop until there is no dead thread. So one call to rt_defunct_execute * will do all the cleanups. */ while (1) { rt_thread_t thread; void (*cleanup)(struct rt_thread *tid); #ifdef RT_USING_MODULE struct rt_dlmodule *module = RT_NULL; #endif /* get defunct thread */ thread = rt_thread_defunct_dequeue(); if (thread == RT_NULL) { break; } #ifdef RT_USING_MODULE module = (struct rt_dlmodule*)thread->module_id; if (module) { dlmodule_destroy(module); } #else #endif /* invoke thread cleanup */ cleanup = thread->cleanup; if (cleanup != RT_NULL) { cleanup(thread); } #ifdef RT_USING_SIGNALS rt_thread_free_sig(thread); #endif /* if it's a system object, not delete it */ if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) { /* detach this object */ rt_object_detach((rt_object_t)thread); } else { #ifdef RT_USING_HEAP /* release thread's stack */ RT_KERNEL_FREE(thread->stack_addr); /* delete thread object */ rt_object_delete((rt_object_t)thread); #endif } } } ``` `rt_defunct_execute` 函数中的所有中断操作全删掉。唯一需要关中断的地方是 `rt_thread_defunct_dequeue` 内部, ``` if (l->next != l) { thread = rt_list_entry(l->next, struct rt_thread, tlist); /* disable interrupt */ level = rt_hw_interrupt_disable(); rt_list_remove(&(thread->tlist)); rt_hw_interrupt_enable(level); } ``` ## 结束语 粗略估算 `rt_defunct_execute` 函数的执行时间砍半,这一指标没什么特别的,重要的是: **在没有任何线程退出的情况下,idle 线程里不需要任何关中断操作!!!** idle 线程更“空闲”了。 > 本系列文章均个人原创,难免有疏漏之处,欢迎各位小伙伴指正。 相关文章: [rt-thread 系统优化系列(一) 之 关中断](https://club.rt-thread.org/ask/article/2931.html) [rt-thread 系统优化系列(二) 之 线程间同步和通信对中断的影响](https://club.rt-thread.org/ask/article/2939.html) [rt-thread 系统优化系列(三) 之 软定时器](https://club.rt-thread.org/ask/article/2967.html) [ rt-thread 系统优化系列(四) 之 再谈 ipc 中的 bug](https://club.rt-thread.org/ask/article/3044.html) [rt-thread 系统优化系列(五) 之 线程销毁谜题](https://club.rt-thread.org/ask/article/3138.html) [rt-thread 系统优化系列(六) 之 让 idle 线程闲下来](https://club.rt-thread.org/ask/article/3141.html)
6
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
出出啊
恃人不如自恃,人之为己者不如己之自为也
文章
43
回答
1516
被采纳
342
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
出出啊
1516
个答案
342
次被采纳
小小李sunny
1440
个答案
289
次被采纳
张世争
799
个答案
171
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部