吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

rt-thread 優(yōu)化系列(一) 之 過多關(guān)中斷

出出 ? 來源:出出 ? 作者:出出 ? 2022-06-21 09:03 ? 次閱讀

前言

關(guān)于優(yōu)化的話題永遠不過時,沒期限。
評價一個系統(tǒng)的好壞,并不僅僅是它有什么功能,能做到什么。在多大程度上,使用更少的資源,以更快的速度完成相同的工作,這是不可或缺的一個考察項。

rt-thread 值得優(yōu)化的地方還很多。作為本系統(tǒng)優(yōu)化系列開篇,先從關(guān)中斷聊起。

提出問題

論壇上曾經(jīng)有很多人反應(yīng)丟數(shù)據(jù)啊,終端輸入命令太快出現(xiàn)什么什么異常啦。
起初看到這些人反映的問題,第一反應(yīng)是他們用法錯誤,代碼有隱藏 bug 導(dǎo)致程序運行不正常。但是,當(dāng)多人在不同的應(yīng)用場景開始反映相似問題的時候,我也心虛了。我開始嘗試著引導(dǎo)他們?nèi)プ鲆恍﹥?yōu)化處理,試試能不能減輕問題的嚴重性。有時候可能只需要調(diào)整兩句代碼,但是結(jié)果是明顯的,前后效果是有差別的。雖然他們的應(yīng)用場景不一樣,但是多數(shù)是要和中斷打交道的,經(jīng)過多方排查以及懷疑,最終我把目標(biāo)轉(zhuǎn)移到了關(guān)中斷操作上。

我把這種現(xiàn)象叫過關(guān)中斷,過度使用關(guān)中斷進而引起副作用。

一個小例子

以 rt_thread_resume 函數(shù)為例,某次提交更改之前是這樣的

   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 函數(shù)有它自己內(nèi)部的關(guān)中斷處理,這里調(diào)整這兩句的操作是不是沒有必要了?
上面代碼執(zhí)行的 rt_hw_interrupt_disable rt_hw_interrupt_enable 函數(shù)對數(shù)是一樣的,不同的是更改前分成兩部分,中間可以有開中斷的機會,但是更改后這個機會沒了,調(diào)整后最長關(guān)中斷時間延長了。
如果這里的調(diào)整是必要的,也可以查到所有調(diào)用 rt_schedule_insert_thread 函數(shù)的其它地方都是關(guān)中斷的。那么 rt_schedule_insert_thread 自己內(nèi)部的關(guān)中斷操作是不是就多余了?

上面的 rt_timer_stop 執(zhí)行位置也有延長關(guān)中斷時間的副作用。

其它可疑過關(guān)中斷

比如 rt_thread_suspend 函數(shù),開頭關(guān)中斷是這樣的。

   /* 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 的賦值沒放到中斷里,后面這個簡短的判斷就必須放進關(guān)中斷?

其它的還有 rt_ipc_list_resume_all stm32_pin_irq_enable ...

影響

論壇里已經(jīng)有多次反應(yīng)的問題和中斷有關(guān),引起的后果不是丟失數(shù)據(jù)就是線程掛起和內(nèi)核消息脫鉤。如下是部分問題鏈接。
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

結(jié)尾

接下來本優(yōu)化系列計劃:軟定時器,消息機制;還有第三方組件部分,由于組件包太多,不可能把每一個都搞一遍,所以我會挑其中的一兩個。敬請期待。

> 本優(yōu)化系列所有提到的更改已經(jīng)提交到 gitee ,歡迎大家測試
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    900

    瀏覽量

    41760
  • 優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    220

    瀏覽量

    23961
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1305

    瀏覽量

    40392
收藏 人收藏

    評論

    相關(guān)推薦

    RT-Thread記錄(、版本開發(fā)環(huán)境及配合CubeMX)

    RT-Thread 學(xué)習(xí)記錄的第篇文章,RT-Thread記錄(RT-Thread 版本、RT-T
    的頭像 發(fā)表于 06-20 00:28 ?5343次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(<b class='flag-5'>一</b>、版本開發(fā)環(huán)境及配合CubeMX)

    RT-Thread記錄(九、RTT中斷處理與階段小結(jié))

    RT-Thread 內(nèi)核部分最后個點 中斷管理,順帶著對前面所學(xué)知識做個小結(jié)。
    的頭像 發(fā)表于 06-24 10:25 ?6363次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(九、RTT<b class='flag-5'>中斷</b>處理與階段小結(jié))

    rt-thread 優(yōu)化系列(二) 同步和消息關(guān)中斷分析

    書接前文,上篇優(yōu)化聊的是關(guān)中斷操作,在很多地方過保護,導(dǎo)致關(guān)中斷時間太久,可能引起其它中斷不能及時響應(yīng)。今天特意說說線程間同步和通信,分析
    的頭像 發(fā)表于 06-21 09:47 ?4014次閱讀

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    優(yōu)化系列(零) SysTick 優(yōu)化分析rt-thread 優(yōu)化系列
    發(fā)表于 07-26 14:56

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實時操作系統(tǒng),本文是RT-Thread實時操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread學(xué)習(xí)筆記系列OTA升級(1)

    RT-Thread學(xué)習(xí)筆記系列OTA升級前言硬件介紹和Bootloader配置需求與功能設(shè)計功能實現(xiàn)過程前言做個產(chǎn)品,首先是需要設(shè)計后期可升級更新功能,否則沒有升級功能則每次出現(xiàn)問
    發(fā)表于 12-14 18:50 ?1次下載
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記<b class='flag-5'>系列</b><b class='flag-5'>之</b>OTA升級(1)

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為名 RTOS 的初學(xué)者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型
    的頭像 發(fā)表于 07-09 11:27 ?4611次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 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 上手指南
    發(fā)表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_中斷管理

    RT-Thread文檔_中斷管理
    發(fā)表于 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 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?4141次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    RT-Thread入門學(xué)習(xí)筆記-熟悉全局中斷的操作

    RT-Thread中,全局中斷的操作很多,大家都知道全局中斷的【disable】與【enable】
    的頭像 發(fā)表于 06-07 14:58 ?2278次閱讀
    <b class='flag-5'>RT-Thread</b>入門學(xué)習(xí)筆記-熟悉全局<b class='flag-5'>中斷</b>的操作

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

    。但也正是因為這些優(yōu)點的覆蓋面較廣,很多初學(xué)者會覺得無從下手,但只要步入 RT-Thread 的大門,你就發(fā)現(xiàn)她的美好。這系列文檔將作為本人基于 RT-Thread 開發(fā) RoboMaster 電控框架
    的頭像 發(fā)表于 09-19 19:55 ?818次閱讀

    RT-Thread v5.0.2 發(fā)布

    一系列令人激動的變化和改進。 以下是些亮點和關(guān)鍵變更: ?內(nèi)核改進: ●?新增了AMP支持。 ●?新增了消息隊列的消息優(yōu)先級。 ●?新增了rt_hw_interrupt_is_disabled API ,用于檢測是否關(guān)閉了
    的頭像 發(fā)表于 10-10 18:45 ?1566次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布
    韩国百家乐的玩法技巧和规则| 百家乐游戏真钱游戏| 卡迪拉娱乐城开户| 网上百家乐真实度| 百家乐官网赌博规律| 大发888线上娱乐百家乐| 澳门百家乐官网官网| 怎么玩百家乐网上赌博| 百家乐官网可以破解吗| 百家乐官网在发牌技巧| 在线棋牌游戏平台| 豪门百家乐的玩法技巧和规则| 百家乐起步多少| 网上赌百家乐官网正规吗| 姚记百家乐的玩法技巧和规则 | 百家乐官网视频游戏网站| 千亿娱乐| 大发888手机版| 百家乐合法| 百家乐洗码全讯网| 名仕百家乐官网的玩法技巧和规则| 百家乐官网下注所有组合| 足球赌博网站| 大发888网上支付| 威尼斯人娱乐棋牌下载| 百家乐一起多少张牌| 百家乐已破解的书籍| 做生意养猫风水| 真人百家乐官网娱乐场开户注册 | bet365主页器| 大发888娱乐城客服| 威尼斯人娱乐网站安全吗| 百家乐最新缆| 破解百家乐游戏机| 富二代百家乐官网的玩法技巧和规则 | 大发888娱乐场下载 df888ylc3403| 金沙百家乐的玩法技巧和规则| 合肥百家乐赌博游戏机| 百家乐游戏规测| 百家乐筹码多少钱| 百家乐吹|