當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導(dǎo)讀]越來越多的嵌入式系統(tǒng)依賴于實時操作系統(tǒng)(RTOS)的使用,以滿足實時需求,減少上市時間,簡化開發(fā),增加代碼可移植性。盡管RTOS有許多好處,但它也有其缺點,如可能引入分配不當(dāng)?shù)娜蝿?wù)優(yōu)先級、堆棧溢出、饑餓、死鎖、優(yōu)先級反轉(zhuǎn)等bug。一些專門設(shè)計的工具,可以幫助基于RTOS的程序開發(fā)...


越來越多的嵌入式系統(tǒng)依賴于實時操作系統(tǒng)(RTOS)的使用,以滿足實時需求,減少上市時間,簡化開發(fā),增加代碼可移植性。盡管RTOS有許多好處,但它也有其缺點,如可能引入分配不當(dāng)?shù)娜蝿?wù)優(yōu)先級、堆棧溢出、饑餓、死鎖、優(yōu)先級反轉(zhuǎn)等bug。


一些專門設(shè)計的工具,可以幫助基于RTOS的程序開發(fā)人員發(fā)現(xiàn)一些難以發(fā)現(xiàn)的錯誤。


RTOS是什么?


實時操作系統(tǒng)(RTOS或?qū)崟r內(nèi)核)是有效地管理CPU時間的軟件。大多數(shù)內(nèi)核使用C編寫,僅需匯編語言編寫小部分代碼,使內(nèi)核適配不同的CPU體系結(jié)構(gòu)。在使用RTOS內(nèi)核設(shè)計應(yīng)用程序時,只需將工作分成任務(wù),每個任務(wù)負(fù)責(zé)工作的一部分。任務(wù)(也稱為線程)是一個簡單的程序,認(rèn)為自己完全擁有CPU。



在單核CPU上,在任何給定時間內(nèi)只能執(zhí)行一個任務(wù)。應(yīng)用代碼還需要根據(jù)任務(wù)重要性為每個任務(wù)分配優(yōu)先級以及任務(wù)堆棧(RAM)。一般來說,增加低優(yōu)先級任務(wù)不會影響系統(tǒng)對高優(yōu)先級任務(wù)的響應(yīng)。任務(wù)實現(xiàn)通常是一個無限循環(huán),內(nèi)核負(fù)責(zé)任務(wù)的管理,稱為多任務(wù)處理。



多任務(wù)處理是在幾個順序任務(wù)之間調(diào)度和切換CPU的過程。多任務(wù)處理提供了具有多個CPU的錯覺,最大化地使用CPU,如圖1所示。多任務(wù)處理還有助于創(chuàng)建模塊化的應(yīng)用程序。使用實時內(nèi)核后,應(yīng)用程序更容易設(shè)計和維護(hù)。


大多數(shù)商業(yè)RTOS都是搶占式調(diào)度方式,內(nèi)核總是運行就緒的最重要的任務(wù)。搶占式內(nèi)核也是事件驅(qū)動的,任務(wù)被設(shè)計為等待事件發(fā)生后才能執(zhí)行。如果任務(wù)等待的事件沒有發(fā)生,內(nèi)核將運行其它任務(wù)。



等待狀態(tài)的任務(wù)不消耗CPU時間。通過內(nèi)核API調(diào)用來完成事件的發(fā)生和等待操作,避免輪詢操作,提高CPU時間的利用率。典型的任務(wù)實現(xiàn)示例,如下所示:


實時內(nèi)核提供了許多服務(wù),如多任務(wù)處理、中斷管理、任務(wù)間通信與同步、資源管理、時間管理、內(nèi)存分區(qū)管理等。RTOS可以用于少量任務(wù)的簡單應(yīng)用,在需要復(fù)雜和耗時的通信的應(yīng)用中,如TCP/IP、USB(主機(jī)和/或設(shè)備)、CAN、藍(lán)牙、Zigbee應(yīng)用等,RTOS是一個必備工具。當(dāng)應(yīng)用程序需要文件系統(tǒng)來存儲和檢索數(shù)據(jù),以及當(dāng)產(chǎn)品配備了圖形顯示(黑白、灰度或彩色)時,也強烈推薦使用RTOS。


硬件調(diào)試端口


ARM Cortex-M內(nèi)核配備了強大的調(diào)試硬件。CoreSight提供了非侵入性的功能,允許工具在不停止CPU的情況下監(jiān)視和控制實時系統(tǒng),例如:


? 動態(tài)內(nèi)存/外設(shè)訪問(讀寫)


? 指令跟蹤(芯片需包括一個執(zhí)行跟蹤宏單元,ETM)


? 數(shù)據(jù)跟蹤


下圖顯示了Core Sight調(diào)試端口、CPU和內(nèi)存外設(shè)之間的關(guān)系簡化框圖。


系統(tǒng)測試/調(diào)試工具


下圖顯示了CoreSight如何連接到開發(fā)環(huán)境:


1、嵌入式開發(fā)通常使用集成開發(fā)環(huán)境(IDE),IDE中通常包含代碼編輯器、編譯器、匯編器、鏈接器、調(diào)試器等工具。


IDE內(nèi)置的調(diào)試器只提供了最基本的功能:下載代碼、啟動/停止應(yīng)用、設(shè)置斷點等功能。一些調(diào)試器允許在目標(biāo)運行時顯示和更改變量(如Live Watch),但這些功能僅限于數(shù)值。許多調(diào)試器內(nèi)置RTOS插件,但通常需要停止應(yīng)用程序才能檢查RTOS的狀態(tài)(對于調(diào)試實時系統(tǒng)不太實用)。


2、通過調(diào)試器,例如Segger J-Link,將代碼下載到目標(biāo)系統(tǒng)。


3、J-Link連接到CoreSight調(diào)試端口,啟動/停止CPU,下載代碼,編程板載Flash等。即使目標(biāo)系統(tǒng)正在執(zhí)行代碼,J-Link也可以讀寫內(nèi)存。


4、Micrium的μC/Probe是一個獨立的、與CPU無關(guān)的Windows應(yīng)用程序,它讀取工具鏈生成的ELF文件。ELF文件包含下載到目標(biāo)系統(tǒng)的代碼以及所有全局變量的名稱、數(shù)據(jù)類型和內(nèi)存位置。


5、μC/Probe允許用戶在運行時顯示或更改連接的嵌入式目標(biāo)上的變量或內(nèi)存位置(包括I/O端口)的值。用戶只需在μC/Probe圖形環(huán)境填充量規(guī)、數(shù)字指示器、表格、圖表、虛擬LED、條形圖、滑塊、開關(guān)、按鈕等控件,并將控件與嵌入設(shè)備中的變量或內(nèi)存位置相關(guān)聯(lián),即可在運行時顯示或更改變量。通過μC/Probe圖形界面中添加的虛擬滑塊或開關(guān),你可以輕松地更改運行系統(tǒng)的參數(shù)(如過濾系數(shù)和PID回路增益)或啟動設(shè)備并測試I/O端口。


6、μC/Probe向J-Link發(fā)送讀取或?qū)懭雰?nèi)存的請求。


7、J-Link請求將轉(zhuǎn)換為CoreSight命令,獲取變量值并顯示到μC/Probe圖形界面。


8、測試/調(diào)試實時嵌入式系統(tǒng)的另一個非常有用的工具是SEGGER的SystemView。此工具通常與RTOS一起工作,按時間順序顯示任務(wù)和ISR的執(zhí)行,可以查看每個任務(wù)需要執(zhí)行的時間(最小/平均/最大),任務(wù)何時就緒,每個任務(wù)實際開始執(zhí)行時間,ISR何時執(zhí)行等。SystemView可以幫助你發(fā)現(xiàn)不易發(fā)現(xiàn)的錯誤。但SystemView需要向目標(biāo)系統(tǒng)添加記錄RTOS事件和ISR的駐留代碼(由SEGGER免費提供),SystemView還會消耗少量的RAM來緩存這些事件。


9、J-Link允許多個進(jìn)程同時訪問CoreSight,因此你可以同時使用這三個工具。


基于RTOS應(yīng)用中的問題


堆棧溢出


在基于實時內(nèi)核的應(yīng)用中,每個任務(wù)都需要自己的堆棧。任務(wù)所需堆棧的大小取決于應(yīng)用程序。如果堆棧大于任務(wù)要求,則會浪費內(nèi)存。如果堆棧太小,堆??赡芤绯?。我們可以通過分配更多內(nèi)存來減少堆棧溢出的機(jī)會,通常需要25-50%的額外堆??臻g。一些CPU,比如基于ARMv8M架構(gòu)的CPU,內(nèi)置了堆棧溢出檢測機(jī)制。然而,該特性并不能幫助確定合適的堆棧大小,它只是防止堆棧溢出的負(fù)面后果。


堆棧分配時,首先為任務(wù)堆棧分配更多空間,然后在已知最壞情況下運行應(yīng)用程序,監(jiān)視實際堆棧使用情況。


下圖顯示了μC/Probe對測試應(yīng)用程序的μ/OS-III內(nèi)核感知的截圖。Stack Usage列顯示每個任務(wù)在給定時間的最大堆棧使用情況。μC/Probe將更新并實時顯示堆棧使用信息,無需停止目標(biāo)應(yīng)用。綠色表示最大堆棧使用量一直保持在70%。黃色表示堆棧使用量在70%到90%之間。紅色表示堆棧使用量已超過90%。顯然,使用92%堆棧的任務(wù)應(yīng)該增大堆棧,使其回到70%以下。


中斷響應(yīng)


在臨界代碼處理時,RTOS和應(yīng)用程序代碼通常必須禁用中斷。關(guān)中斷會影響系統(tǒng)對事件的響應(yīng),RTOS應(yīng)用中盡量減少中斷禁用時間。


μC/OS-III會監(jiān)測每個任務(wù)最壞情況下的中斷禁用時間,下圖所示。如果應(yīng)用需要滿足實時截止時間,這些信息非常有用。


中斷被禁用的時間很大程度上取決于CPU、其時鐘速率、應(yīng)用程序和調(diào)用的RTOS服務(wù)。禁用中斷最長的任務(wù)用紅色高亮顯示,幫助用戶快速識別潛在的異常值。


如果最大中斷禁用時間是由RTOS引起的,可以:


查找并使用中斷禁用時間較低的RTOS API。


增加CPU的時鐘速率。


使用非內(nèi)核感知中斷來處理高度時間敏感的代碼。



優(yōu)先級反轉(zhuǎn)


優(yōu)先級反轉(zhuǎn)發(fā)生在低優(yōu)先級任務(wù)持有高優(yōu)先級任務(wù)需要的資源時。當(dāng)中等優(yōu)先級的任務(wù)搶占占用資源的低優(yōu)先級的任務(wù)時,問題就會加劇。“優(yōu)先級反轉(zhuǎn)”一詞指的是,低優(yōu)先級任務(wù)似乎比高優(yōu)先級任務(wù)具有更高的優(yōu)先權(quán),至少在共享該資源時是如此。


優(yōu)先級反轉(zhuǎn)是實時系統(tǒng)中的一個問題,當(dāng)使用基于優(yōu)先級的搶占式內(nèi)核時會發(fā)生。如下圖所示,SystemView展示了一個優(yōu)先級反轉(zhuǎn)場景。


App HPT具有最高優(yōu)先級,App MPT 具有中優(yōu)先級,App LPT優(yōu)先級最低。


可以使用RTOS的互斥量機(jī)制來解決上面描述的優(yōu)先級反轉(zhuǎn)問題。優(yōu)先級反轉(zhuǎn)被限定為LPT訪問共享資源所需的時間,下圖所示。LPT和HPT都使用互斥量而非信號量來獲得對共享資源的訪問權(quán)。如果沒有SystemView這樣的工具,優(yōu)先級反轉(zhuǎn)將很難識別和校正。


注意,如果LPT只是HPT的下一個優(yōu)先級級別,則可以使用信號量。在這種情況下,RTOS不需要更改LPT的優(yōu)先級,信號量是首選項,它比互斥信號量快。



死鎖


死鎖是至少兩個任務(wù)相互等待另一個任務(wù)擁有的資源。死鎖可能不會立即發(fā)生,它很大程度上取決于兩個任務(wù)何時需要彼此的資源。如圖8所示,μC/Probe的內(nèi)核感知視圖有一列,顯示每個任務(wù)的執(zhí)行頻率(RTOS切換任務(wù)的頻率)。通過監(jiān)視此列可以檢測死鎖。如果至少兩個任務(wù)的計數(shù)已停止(μC/Prboe在CPU運行時更新這些計數(shù)器),則可能存在死鎖。對于這種情況,不需要使用μC/Probe等工具也可以判定鎖定行為,該工具使它更加明顯。


可以通過以下方法來避免死鎖:


1、任務(wù)先獲取所有必需的資源,以相同的順序獲取它們,以相反的順序釋放它們。


2、在RTOS API調(diào)用中使用超時機(jī)制,以避免永遠(yuǎn)等待資源可用。檢查RTOS API返回的錯誤代碼,以確保對所需資源的請求成功。



任務(wù)饑餓


饑餓指高優(yōu)先級任務(wù)消耗了所有CPU帶寬,低優(yōu)先級任務(wù)沒有CPU時間或很少。饑餓的影響是響應(yīng)性和產(chǎn)品特性的下降,例如嵌入式目標(biāo)的顯示更新緩慢、通信堆棧中的數(shù)據(jù)包丟失、操作界面響應(yīng)遲緩等。為解決饑餓問題,可以:


1、優(yōu)化消耗大多數(shù)CPU帶寬的代碼。


2、提高CPU的時鐘速度。


總結(jié)


IDE內(nèi)置的調(diào)試器通常不足以調(diào)試基于RTOS的實時系統(tǒng)


幸運的是,有專門為調(diào)試基于RTOS的系統(tǒng)而設(shè)計的工具。其中一個工具是Segger的SystemView,它會按時間順序顯示ISR和任務(wù)的執(zhí)行,收集運行時統(tǒng)計數(shù)據(jù),如最小和最大執(zhí)行時間、ISR與任務(wù)之間的關(guān)系、CPU負(fù)載等。


另一個可以補充SystemView的工具是Micrium的μC/Probe,這是一個通用工具,它允許開發(fā)人員在不干擾CPU的情況下,可視化和改變正在運行的嵌入式目標(biāo)的行為。μC/Probe可以用于裸機(jī)或基于RTOS的應(yīng)用中。對于基于RTOS的應(yīng)用程序,μC/Probe包括非侵入性的、實時內(nèi)核感知以及TCP/IP協(xié)議棧感知功能。SystemView和μC/Probe可以在整個開發(fā)周期中使用,提供關(guān)于嵌入式目標(biāo)的運行時行為的反饋。





本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

這次我成功將妹子約到了公司附近的咖啡館,繼續(xù)探討RTOS的heap的技術(shù)特點。當(dāng)我把準(zhǔn)備好的數(shù)據(jù)和動圖展示在她面前,她立馬激動起來了。

關(guān)鍵字: RTOS heap FreeRTOS

很多RTOS之所以可以用于資源很少的單片機(jī),是因為它們可以配置,一般可以使用宏定義來選擇需要的功能,而裁剪掉不必要的功能,以減少對硬件的資源占用。

關(guān)鍵字: RTOS 單片機(jī)

處理特定任務(wù)的單片機(jī)可減輕主單片機(jī)或微處理器的任務(wù)和工作負(fù)荷,從而有助于簡化各種應(yīng)用的設(shè)計流程。

關(guān)鍵字: Microchip 單片機(jī) RTOS

關(guān)注星標(biāo)公眾號,不錯過精彩內(nèi)容作者|strongerHuang微信公眾號?|?嵌入式專欄不知道大家有沒有做過低功耗產(chǎn)品?低功耗產(chǎn)品看似很簡單,其實,要做好一款低功耗產(chǎn)品,特別是做到超低功耗,難度相對更高。今天就來講講在R...

關(guān)鍵字: RTOS 低功耗設(shè)計 單片機(jī) CPU

關(guān)注星標(biāo)公眾號,不錯過精彩內(nèi)容作者|strongerHuang微信公眾號?|?嵌入式專欄不知道大家有沒有做過低功耗產(chǎn)品?低功耗產(chǎn)品看似很簡單,其實,要做好一款低功耗產(chǎn)品,特別是做到超低功耗,難度相對更高。今天就來講講在R...

關(guān)鍵字: RTOS 低功耗設(shè)計

星標(biāo)「嵌入式大雜燴」,一起進(jìn)步!作者|strongerHuang微信公眾號|嵌入式專欄經(jīng)常在交流群都會看到有些小伙伴在問:**資料、**文檔、**源碼在哪里下載?資料、文檔、源碼在哪里找?很多初學(xué)小白,找資料、文檔、源碼...

關(guān)鍵字: RTOS 開源

AzureRTOS使資源受限的設(shè)備能夠連接到微軟的AzureIoT,這是全球領(lǐng)先的IoT生態(tài)系統(tǒng)之一。AzureRTOS為企業(yè)級應(yīng)用程序(如航空電子設(shè)備、醫(yī)療設(shè)備、運輸和工業(yè)控制)提供理想的軟件開發(fā)平臺而聞名,然而,其設(shè)...

關(guān)鍵字: RTOS 硬件 物聯(lián)網(wǎng)設(shè)備

一.序言?本資料是TrevorMartin編寫的《TheDesignersGuidetotheCortex-MProcessorFamily》的摘要,并得到Elsevier的再版許可。查詢更多細(xì)節(jié),請到本資料尾部進(jìn)階章節(jié)...

關(guān)鍵字: RTOS

星標(biāo)「嵌入式大雜燴」,一起進(jìn)步!來源|?小麥大叔概述嵌入式物聯(lián)網(wǎng)開發(fā)平臺是一個系統(tǒng),是微控制器物聯(lián)網(wǎng)開發(fā)平臺的系統(tǒng)組合。微控制器:是嵌入式控制的核心物:智能化的電子產(chǎn)品聯(lián):電子產(chǎn)品通訊或?qū)υ挼耐ǖ谰W(wǎng):互聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)開...

關(guān)鍵字: MCU RTOS 物聯(lián)網(wǎng)

1.說明在工作過程中,我發(fā)現(xiàn)在實際使用RTOS完成項目時,理解這些知識僅能達(dá)到會用RTOS的水平,要想用好RTOS,還需要了解一些比較細(xì)節(jié)的機(jī)制,否則容易掉坑進(jìn)去,花大量時間定位問題。本文結(jié)合TencentOS-Tiny...

關(guān)鍵字: RTOS 函數(shù)

嵌入式大雜燴

461 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉