前言
關(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 ,歡迎大家測試
審核編輯:湯梓紅
-
中斷
+關(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
發(fā)布評論請先 登錄
相關(guān)推薦
RT-Thread記錄(一、版本開發(fā)環(huán)境及配合CubeMX)
![<b class='flag-5'>RT-Thread</b>記錄(<b class='flag-5'>一</b>、版本開發(fā)環(huán)境及配合CubeMX)](https://file.elecfans.com//web2/M00/4C/58/pYYBAGKtyOGACMdxAABXG3HKIdk106.png)
rt-thread 優(yōu)化系列(二) 之 同步和消息關(guān)中斷分析
【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集
RT-Thread編程指南
RT-Thread學(xué)習(xí)筆記系列之OTA升級(1)
![<b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記<b class='flag-5'>系列</b><b class='flag-5'>之</b>OTA升級(1)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述
![<b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述](https://file.elecfans.com/web2/M00/52/31/pYYBAGLKk5WAA__jAADjdAdXhIs410.jpg)
RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
![<b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于RT-Thread Studio學(xué)習(xí)
![基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)](https://file1.elecfans.com/web2/M00/82/C1/wKgaomRhn_SAM7fdAACQhFt0KEA325.jpg)
基于 RT-Thread 的 RoboMaster 電控框架(一)
RT-Thread v5.0.2 發(fā)布
![<b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布](https://file1.elecfans.com//web2/M00/A8/7A/wKgaomUt2fWAVBHtAHiX-BnG6Ho342.gif)
評論