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

    文章

    884

    浏览量

    41023
  • 优化
    +关注

    关注

    0

    文章

    220

    浏览量

    23714
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38868
收藏 人收藏

    评论

    相关推荐

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

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

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4414次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

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

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

    rt-thread 入门系列先用后学

    rt-thread 入门系列先用后学,学样新东西, 从心底都是抵触的, 我们需要不断在获取正反馈, 才能快速掌握新新知识.1 rt
    发表于 07-16 08:31

    【原创精选】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开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物联网开发套
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    RT-Thread开源作品秀】基于RT-Thread的星务平台研究

    本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,...
    发表于 01-25 18:26 5次下载
    【<b class='flag-5'>RT-Thread</b>开源作品秀】基于<b class='flag-5'>RT-Thread</b>的星务平台研究

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

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

    RT-Thread已经全面支持极海APM32F1系列MCU

    近日,RT-Thread 和其高级会员合作伙伴极海半导体宣布:正式完成APM32F4系列MCU的RT-Thread 物联网操作系统适配及RT-Thread Studio IDE的支持。
    发表于 08-30 09:45 983次阅读

    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文档_中断管理
    发表于 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 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

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

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

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 775次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布