Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
关中断
硬实时
rt-thread 系统优化系列(一) 之 泛滥的关中断操作
发布于 2021-07-30 15:26:50 浏览:4941
订阅该版
[tocm] # 前言 关于优化的话题永远不过时,没期限。 评价一个系统的好坏,并不仅仅是它有什么功能,能做到什么。在多大程度上,使用更少的资源,以更快的速度完成相同的工作,这是不可或缺的一个考察项。 rt-thread 值得优化的地方还很多。作为本系统优化系列开篇,先从关中断聊起。 ### 提出问题 论坛上曾经有很多人反应丢数据啊,终端输入命令太快出现什么什么异常啦。 起初看到这些人反映的问题,第一反应是他们用法错误,代码有隐藏 bug 导致程序运行不正常。但是,当多人在不同的应用场景开始反映相似问题的时候,我也心虚了。我开始尝试着引导他们去做一些优化处理,试试能不能减轻问题的严重性。有时候可能只需要调整两句代码,但是结果是明显的,前后效果是有差别的。虽然他们的应用场景不一样,但是多数是要和中断打交道的,经过多方排查以及怀疑,最终我把目标转移到了关中断操作上。 我把这种现象叫过关中断,过度使用关中断进而引起副作用。 ### 一个小例子 以 rt_thread_resume 函数为例,某次提交更改之前是这样的 ```c rt_timer_stop(&thread->thread_timer); /* enable interrupt */ rt_hw_interrupt_enable(temp); /* insert to schedule ready list */ rt_schedule_insert_thread(thread); ``` 更改之后 ``` rt_timer_stop(&thread->thread_timer); /* insert to schedule ready list */ rt_schedule_insert_thread(thread); /* enable interrupt */ rt_hw_interrupt_enable(temp); ``` 可以查到, `rt_schedule_insert_thread` 函数有它自己内部的关中断处理,这里调整这两句的操作是不是没有必要了? 上面代码执行的 `rt_hw_interrupt_disable` `rt_hw_interrupt_enable` 函数对数是一样的,不同的是更改前分成两部分,中间可以有开中断的机会,但是更改后这个机会没了,调整后最长关中断时间延长了。 如果这里的调整是必要的,也可以查到所有调用 `rt_schedule_insert_thread` 函数的其它地方都是关中断的。 那么 `rt_schedule_insert_thread` 自己内部的关中断操作是不是就多余了? 上面的 rt_timer_stop 执行位置也有延长关中断时间的副作用。 ### 其它可查过关中断 比如 rt_thread_suspend 函数,开头关中断是这样的。 ```c /* disable interrupt */ temp = rt_hw_interrupt_disable(); if (stat == RT_THREAD_RUNNING) { /* not suspend running status thread on other core */ RT_ASSERT(thread == rt_thread_self()); } ``` 其中,stat 的赋值没放到中断里,后面这个简短的判断就必须放进关中断? 其它的还有 `rt_ipc_list_resume_all` `stm32_pin_irq_enable` ... ### 影响 论坛里已经有多次反应的问题和中断有关,引起的后果不是丢失数据就是线程挂起和内核消息脱钩。如下是部分问题链接。 - https://club.rt-thread.org/ask/question/432195.html - https://club.rt-thread.org/ask/question/432183.html - https://club.rt-thread.org/ask/question/432083.html - https://club.rt-thread.org/ask/question/432048.html ### 结尾 接下来本优化系列计划:软定时器,消息机制;还有第三方组件部分,由于组件包太多,不可能把每一个都搞一遍,所以我会挑其中的一两个。敬请期待。 > 本优化系列所有提到的更改已经提交到 gitee ,欢迎大家测试 https://gitee.com/thewon/rt_thread_repo ### 相关文章: - [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)
21
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
出出啊
恃人不如自恃,人之为己者不如己之自为也
文章
43
回答
1518
被采纳
342
关注TA
发私信
相关文章
1
互斥量操作,关中断时间长
2
__disable_irq和rt_hw_interrupt_disable的区别
3
支持关中断时增加优先级限制吗?
4
关于关闭全局中断导致实时性问题求解决,PRIMASK 如何改用 BASEPRI
5
全局开关中断为什么能同步?
6
关于rt_hw_interrupt_disable的一点疑问
7
说rtthread-nano 是硬实时rtos,如何通过代码理解硬实时的概念
8
为了实现硬实时中断,减少关闭临界代码的延时,临界代码关中断,允许许定时器中断
9
rt-thread 如何原子操作时,如何实现不关闭总中断,只关闭指定优先级中断
10
GD32 外部中断时延
推荐文章
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总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
3
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部