0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rt-thread 优化系列(一) 之 过多关中断

出出 来源:出出 作者:出出 2022-06-21 09:03 次阅读

前言

关于优化的话题永远不过时,没期限。
评价一个系统的好坏,并不仅仅是它有什么功能,能做到什么。在多大程度上,使用更少的资源,以更快的速度完成相同的工作,这是不可或缺的一个考察项。

rt-thread 值得优化的地方还很多。作为本系统优化系列开篇,先从关中断聊起。

提出问题

论坛上曾经有很多人反应丢数据啊,终端输入命令太快出现什么什么异常啦。
起初看到这些人反映的问题,第一反应是他们用法错误,代码有隐藏 bug 导致程序运行不正常。但是,当多人在不同的应用场景开始反映相似问题的时候,我也心虚了。我开始尝试着引导他们去做一些优化处理,试试能不能减轻问题的严重性。有时候可能只需要调整两句代码,但是结果是明显的,前后效果是有差别的。虽然他们的应用场景不一样,但是多数是要和中断打交道的,经过多方排查以及怀疑,最终我把目标转移到了关中断操作上。

我把这种现象叫过关中断,过度使用关中断进而引起副作用。

一个小例子

以 rt_thread_resume 函数为例,某次提交更改之前是这样的

   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 函数,开头关中断是这样的。

   /* 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 ,欢迎大家测试
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    898

    浏览量

    41476
  • 优化
    +关注

    关注

    0

    文章

    220

    浏览量

    23893
  • RT-Thread
    +关注

    关注

    31

    文章

    1286

    浏览量

    40097
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(、版本开发环境及配合CubeMX)

    RT-Thread 学习记录的第篇文章,RT-Thread记录(RT-Thread 版本、RT-T
    的头像 发表于 06-20 00:28 5234次阅读
    <b class='flag-5'>RT-Thread</b>记录(<b class='flag-5'>一</b>、版本开发环境及配合CubeMX)

    RT-Thread记录(九、RTT中断处理与阶段小结)

    RT-Thread 内核部分最后个点 中断管理,顺带着对前面所学知识做个小结。
    的头像 发表于 06-24 10:25 6243次阅读
    <b class='flag-5'>RT-Thread</b>记录(九、RTT<b class='flag-5'>中断</b>处理与阶段小结)

    rt-thread 优化系列(二) 同步和消息关中断分析

    书接前文,上篇优化聊的是关中断操作,在很多地方过保护,导致关中断时间太久,可能引起其它中断不能及时响应。今天特意说说线程间同步和通信,分析
    的头像 发表于 06-21 09:47 3958次阅读

    【原创精选】RT-Thread征文精选技术文章合集

    优化系列(零) SysTick 优化分析rt-thread 优化系列
    发表于 07-26 14:56

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南
    发表于 11-26 16:06 0次下载

    RT-Thread学习笔记系列OTA升级(1)

    RT-Thread学习笔记系列OTA升级前言硬件介绍和Bootloader配置需求与功能设计功能实现过程前言做个产品,首先是需要设计后期可升级更新功能,否则没有升级功能则每次出现问
    发表于 12-14 18:50 1次下载
    <b class='flag-5'>RT-Thread</b>学习笔记<b class='flag-5'>系列</b><b class='flag-5'>之</b>OTA升级(1)

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型
    的头像 发表于 07-09 11:27 4549次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文档_中断管理

    RT-Thread文档_中断管理
    发表于 02-22 18:30 1次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>中断</b>管理

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 3944次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习

    RT-Thread入门学习笔记-熟悉全局中断的操作

    RT-Thread中,全局中断的操作很多,大家都知道全局中断的【disable】与【enable】
    的头像 发表于 06-07 14:58 2161次阅读
    <b class='flag-5'>RT-Thread</b>入门学习笔记-熟悉全局<b class='flag-5'>中断</b>的操作

    基于 RT-Thread 的 RoboMaster 电控框架(

    。但也正是因为这些优点的覆盖面较广,很多初学者会觉得无从下手,但只要步入 RT-Thread 的大门,你就发现她的美好。这系列文档将作为本人基于 RT-Thread 开发 RoboMaster 电控框架
    的头像 发表于 09-19 19:55 762次阅读

    RT-Thread v5.0.2 发布

    一系列令人激动的变化和改进。 以下是些亮点和关键变更:  内核改进: ● 新增了AMP支持。 ● 新增了消息队列的消息优先级。 ● 新增了rt_hw_interrupt_is_disabled API ,用于检测是否关闭了
    的头像 发表于 10-10 18:45 1480次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布