前言
關于優化的話題永遠不過時,沒期限。
評價一個系統的好壞,并不僅僅是它有什么功能,能做到什么。在多大程度上,使用更少的資源,以更快的速度完成相同的工作,這是不可或缺的一個考察項。
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 ,歡迎大家測試
審核編輯:湯梓紅
相關推薦
1、這篇文章主要講解如何適配串口V2驅動,下面以STM32F411RE-NUCLEO的BSP為例,講解如何快速適配到該開發板上
...
發表于 06-23 15:29 ?
1951次
閱讀
系統環境
armv8-a 64位 4核cortex-a35
移植到rt-smart分支系統中
由于rt沒有線程支持aarch64 cortex-a35,因此參考cortex-a72...
發表于 06-23 14:57 ?
978次
閱讀
基于NK-980IoT的國學唐詩學習機 1 項目背景 最近一直在陪小孩學習國學精髓,比如唐詩、宋詞這....
一、開發板介紹1. 前言很感謝RT-Thread 和 新唐給予的這次評測機會,本次評測的開發板是 新唐的 Nuvoton M487,我們拿到手的...
發表于 06-23 14:36 ?
1080次
閱讀
??無論是在家里還是在公司,安防都尤為的重要,與其亡羊補牢,更重要的是防患于未然。安全是目的,防范是....
測試環境開發板:NK-980IOT V1.0
開發環境:RT-Thread studio 2.2.1 + NuWriter v1.18
RT-Thread版本:4.0.5
開...
發表于 06-23 14:20 ?
1160次
閱讀
SPI協議其實是包括:Standard SPI、Dual SPI和Queued SPI三種協議接口,分別對應3-wire, 4-wire, 6-wire。
(1)...
發表于 06-23 12:05 ?
1254次
閱讀
一、M487 PWM簡介1、EPWM
? 8個獨立PWM 輸出,16位計數器,12位預分頻,最大時鐘 192MHz
? 12位死區時間
? 計...
發表于 06-23 11:56 ?
455次
閱讀
續接上一篇文章,分析LVGL的demo源碼。官方的widget例程代碼lv_demo_widgets()函數體如下,下面逐步分析。雖然之前也簡單看過...
發表于 06-23 11:42 ?
358次
閱讀
簡單記錄下fdcan調試:
1.打開FDCAN組件,啟用FDCAN1 FDCAN2(我修改過KConfig,默認只能啟用FDCAN1)
...
發表于 06-23 11:31 ?
346次
閱讀
1、NK880IOT-NK9TIMER簡介開發環境簡介NK-980IOT V1.0 (NUC980DK61Y)RT-Thread Studio + J-Link ...
發表于 06-23 11:21 ?
775次
閱讀
1、基于RT-Thread和N32G457的運動姿態解算基本框架如上圖所示,設計框架由硬件和軟件兩部分組成,其中硬件主要包括N32G45...
發表于 06-23 10:24 ?
1076次
閱讀
很久之前就開始整理下面的優化項列表了,但是有很多問題研究不深,一時不敢冒失推出。
出出 發表于 06-23 10:21
?
858次
閱讀
記得最初學習 RT-Thread ,對于內存管理我也是簡單看看然后一筆帶過,當時覺得用不上,在我做的....
矜辰所致 發表于 06-23 10:11
?
188次
閱讀
區別于 rt-thread 內核實現的兩種定時器,這種定時器依賴芯片內置的定時器外設,依靠穩定高速的....
出出 發表于 06-23 10:10
?
858次
閱讀
信號 signal,并不是線程間同步的信號量 semaphore。后者是線程間同步機制的一種,而前者....
出出 發表于 06-23 09:51
?
848次
閱讀
所謂軟定時器,是由一個線程運行維護的定時器列表。由線程調用定時器回調函數。
出出 發表于 06-23 09:35
?
856次
閱讀
? 手把手教你使用RT-Thread制作GD32 RISC-V系列BSP 熟悉RT-Thread的朋....
嵌入式大雜燴 發表于 06-22 19:44
?
1548次
閱讀
講完了線程同步的機制,我們要開始線程通訊的學習,
矜辰所致 發表于 06-22 10:06
?
181次
閱讀
本周筆者花了好多天的時間,計劃從多個方面對串口驅動做個比較。下面就從以下幾個角度做個對比測試。
出出 發表于 06-22 09:22
?
1247次
閱讀
在前一篇文章里,大致提出了我的串口驅動框架理論。里面做了一些對串口驅動特性的幻想。也在 NUC970....
出出 發表于 06-22 09:03
?
1345次
閱讀
熟悉RT-Thread的朋友都知道,RT-Thread提供了許多BSP,但不是所有的板子都能找到相應....
嵌入式大雜燴 發表于 06-22 08:54
?
1286次
閱讀
上文說到 RT-Thread 對臨界區的處理方式有多種,其中已經分析了關閉調度器和屏蔽中斷的方式,
....
矜辰所致 發表于 06-21 10:40
?
2217次
閱讀
串口驅動三種工作模式:輪詢、中斷、DMA。
出出 發表于 06-21 10:37
?
2012次
閱讀
書接前文,上篇優化聊的是關中斷操作,在很多地方過保護,導致關中斷時間太久,可能引起其它中斷不能及時響....
出出 發表于 06-21 09:47
?
1838次
閱讀
論壇里有人提出了一個疑問,說 STM32 系列 bsp 在初始化系統時鐘的過程中使用到了 tick ....
出出 發表于 06-21 08:55
?
1249次
閱讀
本文聊聊臨界區,以及RT-Thread對臨界區的處理
矜辰所致 發表于 06-20 16:06
?
2097次
閱讀
調試 stm32 的usb host 的艱辛歷程。希望有遇到相同問題的人能從中發現點兒什么。
出出 發表于 06-20 15:24
?
176次
閱讀
RT-Thread第4課,聽聽 RT-Thread 的心跳,再學習一下基于心跳的軟件定時器使用。
矜辰所致 發表于 06-20 11:50
?
2066次
閱讀
serialX 作為一個非阻塞串口驅動框架,在遇到一些異常時,需要做一些特殊處理,今天,筆者帶大家來....
出出 發表于 06-20 11:43
?
239次
閱讀
講完了RT-Thread開發環境,啟動流程,啟動以后當然是開始跑線程了,那么自然我們得學會如何創建線....
矜辰所致 發表于 06-20 00:31
?
1731次
閱讀
在前面我們RT-Thread Studio工程基礎之上講一講RT-Thread內核啟動流程.
矜辰所致 發表于 06-20 00:30
?
1797次
閱讀
RT-Thread 學習記錄的第一篇文章,RT-Thread記錄(一、RT-Thread 版本、RT....
矜辰所致 發表于 06-20 00:28
?
1801次
閱讀
開發環境: RT-Thread版本:4.0.3 操作系統:Windows10 Keil版本:V5.3....
嵌入式大雜燴 發表于 06-20 00:26
?
1836次
閱讀
? 開發環境: RT-Thread版本:4.0.3 操作系統:Windows10 Keil版本:V5....
嵌入式大雜燴 發表于 06-20 00:20
?
1763次
閱讀
小伙伴們大家好,好久不更新RT-Thread實戰筆記啦,今天來搞一搞MPU6050,話不多說,淦!
??在開發中由于單片機自帶的 RAM 空間比較小,有時候需要擴展片外的 RAM 以供使用,RT-Th....
??在分析之前首先查閱 RT-Thread 的官方文檔 [RT-Thread 自動初始化機制](ht....
終于來到了 serialX 的實踐篇,期待很久了。
出出 發表于 06-16 11:29
?
241次
閱讀
AT組件的核心處理邏輯是將收到的 AT 模組的應答信息放到 recv_line_buf 緩沖區中,然....
人類經歷了三次工業革命,無論是蒸汽機、電力還是電子信息技術,每一次革命都給人類的生產力帶來了幾十倍的....
科技綠洲 發表于 06-14 14:29
?
729次
閱讀
在進行調試和維護時,常常需要與單片機進行交互,獲取、設置某些參數或執行某些操作,nr_micro_s....
一提 GPIO 可能會讓很多人覺得不屑,這么簡單的東西有什么可說的,也就是一個拉低拉高,誰不會呢。
出出 發表于 06-13 09:48
?
400次
閱讀
1、中斷方式是在數據緩沖寄存區滿后,發中斷請求,CPU進行中斷處理。
自筆者提出 serialX 串口驅動到今天近半年了,當初只在 STM32F4 NUC970 兩個系列....
出出 發表于 06-10 10:21
?
303次
閱讀
近日,在龍芯中科與睿賽德科技的共同努力下,RT-Thread專業版已實現了對LoongArch32和....
科技綠洲 發表于 06-09 16:45
?
756次
閱讀
目前,龍芯中科業務已全部轉向 LoongArch 自主指令系統架構,龍芯 2K1000LA 處理器的....
科技綠洲 發表于 06-08 11:10
?
331次
閱讀
在 RT-Thread 4.1.0 正式發布版中,添加了對 Arm Compiler 6 的支持,用....
科技綠洲 發表于 06-01 15:20
?
335次
閱讀
在Cortex‐M0內核上搭載了一個異常響應系統,支持眾多的系統異常和外部中斷。其中,編號為1-15....
安芯教育科技 發表于 06-01 14:41
?
328次
閱讀
ArmClang 相較于 Armcc, 支持的架構更多,Armcc支持到Armv7架構,armcla....
RT-Thread 是一款開源實時操作系統,包括 RT-Thread 內核、FinSH 命令行工具、....
科技綠洲 發表于 05-31 11:17
?
370次
閱讀
眾所周知,產品已經量產的情況下,一顆物料的缺失,足以導致企業砍掉一條賴以生存的產品線,甚至全面停....
打開pack安裝包查看如下的顯示為安裝好的RT-Rhread。
API太多導致不知道用哪些,分類亂沒有規律,協議棧文件太多,代碼處理復雜導致代碼冗長
倩倩 發表于 05-28 15:17
?
507次
閱讀
在RT-Thread全球技術大會上,開發者詳細介紹了RNDIS主機驅動軟件的應用說明,據圖如下圖:
姚小熊27 發表于 05-28 14:57
?
580次
閱讀
在RT-Thread全球技術大會直播上,開發者詳細介紹了RNDIS通信協議的原理及主機驅動框架,具體....
姚小熊27 發表于 05-28 14:43
?
480次
閱讀
評論