眾所周知,單獨(dú)的源代碼并不給出基于RTOS的固件實(shí)際行為的全貌表現(xiàn)。實(shí)時(shí)行為還取決于許多其他因素,如任務(wù)和中斷的定時(shí),輸入和實(shí)時(shí)操作系統(tǒng)的配置。
Tracealyzer提供了前所未有的洞察基于RTOS的軟件的運(yùn)行世界功能,從而改善開(kāi)發(fā)效率,減少上市時(shí)間,及更好的軟件質(zhì)量。使用Tracealyzer,可以記錄RTOS及應(yīng)用的實(shí)時(shí)行為,并具有強(qiáng)大的可視化功能,提供前所未有的洞察運(yùn)行時(shí)狀態(tài)的能力。這有助于加速基于RTOS的軟件開(kāi)發(fā)、驗(yàn)證和調(diào)試。
Tracealyzer支持FreeRTOS,uC/OS-III,VxWorks以及Linux的跟蹤。
近日,由《嵌入式系統(tǒng)編程》雜志的前任主編兼行業(yè)資深人士邁克爾?巴爾(Michael Barr)撰寫(xiě)的三本關(guān)于軟件漏洞主題的書(shū)籍,不僅列出了錯(cuò)誤,還提出了避免它們的設(shè)計(jì)模式。
良好的設(shè)計(jì)模式是非常寶貴的,但無(wú)論如何錯(cuò)誤總是難以避免的。在調(diào)試嵌入式軟件時(shí),使用Percepio Tracealyzer等RTOS跟蹤工具可以找到并分析這些錯(cuò)誤中的至少五個(gè)。
1、抖動(dòng)
如果軟件系統(tǒng)中有一項(xiàng)需要定期執(zhí)行的任務(wù),例如每10毫秒讀取一次模數(shù)轉(zhuǎn)換器,那么它就擁有一個(gè)對(duì)隨機(jī)延遲敏感的系統(tǒng) - 也稱為抖動(dòng)。如果10 ms間隔降低到10±2 ms,則計(jì)算精度會(huì)相應(yīng)降低。
為了最大限度地減少抖動(dòng),邁克爾?巴爾指出需要微調(diào)任務(wù)優(yōu)先級(jí),并可能使用定時(shí)器中斷來(lái)處理最敏感的代碼。Tracealyzer在定位系統(tǒng)中的抖動(dòng)方面非常有用。
2、優(yōu)先級(jí)分配不正確
設(shè)置合適的任務(wù)優(yōu)先級(jí)對(duì)于基于RTOS的系統(tǒng)的性能和可靠性至關(guān)重要,因?yàn)椴捎眠^(guò)高優(yōu)先級(jí)運(yùn)行的任務(wù)可能會(huì)導(dǎo)致其他任務(wù)中出現(xiàn)無(wú)法接受的延遲。
邁克爾?巴爾指出,速率單調(diào)分析(RMA)是一種在具有固定優(yōu)先級(jí)和搶占式調(diào)度的系統(tǒng)中分配任務(wù)優(yōu)先級(jí)的正式方法。但是,這需要有足夠的有關(guān)任務(wù)行為的信息,并且任務(wù)的行為符合此分析方法的假設(shè)。
找到在所有情況下都能正常工作的任務(wù)優(yōu)先級(jí)的正確組合可能非常困難,除非有一個(gè)良好的跟蹤工具來(lái)顯示RTOS中正在發(fā)生的事情。 Tracealyzer允許檢查執(zhí)行時(shí)間,執(zhí)行模式以及任務(wù)的最終響應(yīng)時(shí)間。這使開(kāi)發(fā)者可以評(píng)估和優(yōu)化其優(yōu)先級(jí)分配,以實(shí)現(xiàn)更快的響應(yīng)時(shí)間和更可靠的行為。
3、優(yōu)先級(jí)反轉(zhuǎn)
具有固定優(yōu)先級(jí)調(diào)度程序的RTOS的核心思想是,應(yīng)該在具有較低優(yōu)先級(jí)的任務(wù)之前安排高優(yōu)先級(jí)任務(wù),但是當(dāng)兩個(gè)或多個(gè)任務(wù)需要協(xié)調(diào)其工作與全局?jǐn)?shù)據(jù)區(qū)等共享資源或外圍設(shè)備時(shí),可能會(huì)導(dǎo)致系統(tǒng)出錯(cuò)。
其中一個(gè)可能出錯(cuò)的事情就是優(yōu)先級(jí)反轉(zhuǎn)(priority inversion),低優(yōu)先級(jí)任務(wù)無(wú)意中阻止了具有更高優(yōu)先級(jí)的任務(wù)。 如果你意識(shí)到這個(gè)陷阱,這也很容易地避免。 但是,如果發(fā)現(xiàn)系統(tǒng)的響應(yīng)性偶爾會(huì)出現(xiàn)延遲,則可能是因?yàn)閮?yōu)先級(jí)反轉(zhuǎn)。 使用Tracealyzer,可以通過(guò)繪制任務(wù)的響應(yīng)時(shí)間來(lái)發(fā)現(xiàn)此類延遲。 要查看此圖中任何極端值的原因,只需雙擊以顯示相應(yīng)的任務(wù)執(zhí)行跟蹤。
4、死鎖
死鎖是兩個(gè)或多個(gè)任務(wù)之間的循環(huán)依賴。 例如,如果任務(wù)1已經(jīng)獲得A,并且被阻止等待B,而任務(wù)2先前已獲得B,并且被阻止等待A,則這兩個(gè)任務(wù)都不會(huì)被喚醒。 盡管沒(méi)有更高優(yōu)先級(jí)的任務(wù)正在運(yùn)行,但是當(dāng)多個(gè)任務(wù)突然停止執(zhí)行時(shí),可能是出現(xiàn)死鎖問(wèn)題的明確跡象。 同樣,死鎖的檢測(cè)是Tracealyzer可以展示的內(nèi)容。
如果希望避免死鎖,首先要注意的是,只有當(dāng)任務(wù)試圖同時(shí)持有兩個(gè)資源時(shí)才會(huì)發(fā)生死鎖。 因此:構(gòu)建代碼時(shí),使任何任務(wù)在同一時(shí)間都不會(huì)持有多個(gè)共享資源,這樣不會(huì)產(chǎn)生死鎖。
5、內(nèi)存泄漏
通常不建議在嵌入式軟件中進(jìn)行動(dòng)態(tài)內(nèi)存分配,但有時(shí)會(huì)出于各種原因(對(duì)或錯(cuò))進(jìn)行動(dòng)態(tài)內(nèi)存分配。問(wèn)題在于,如果使用它,則必須確保一旦內(nèi)存塊不再使用時(shí),就釋放每個(gè)已分配的內(nèi)存塊。如果在某些情況下遺漏了這一點(diǎn),就會(huì)出現(xiàn)內(nèi)存泄漏,并最終耗盡內(nèi)存。請(qǐng)記住:即使在項(xiàng)目中禁止動(dòng)態(tài)內(nèi)存分配,也可能有第三方軟件庫(kù)或外部開(kāi)發(fā)團(tuán)隊(duì)在不知情的情況下使用動(dòng)態(tài)內(nèi)存分配。
如果內(nèi)存泄漏只是偶爾發(fā)生,那么它就特別危險(xiǎn),因?yàn)樵诠δ軠y(cè)試期間很容易錯(cuò)過(guò)“緩慢”的內(nèi)存泄漏,但在部署單元一段時(shí)間后,可能會(huì)導(dǎo)致嚴(yán)重錯(cuò)誤。考慮到許多嵌入式系統(tǒng)的長(zhǎng)期運(yùn)行特性,以及一些安全關(guān)鍵系統(tǒng)可能存在的致命或嚴(yán)重故障,內(nèi)存泄漏是絕對(duì)不希望在軟件中出現(xiàn)的一個(gè)錯(cuò)誤。
Tracealyzer可以監(jiān)視RTOS對(duì)動(dòng)態(tài)內(nèi)存分配的調(diào)用,并可以突出顯示可疑的內(nèi)存泄漏。
-
嵌入式軟件
+關(guān)注
關(guān)注
4文章
240瀏覽量
26620 -
RTOS
+關(guān)注
關(guān)注
22文章
809瀏覽量
119439
原文標(biāo)題:在調(diào)試嵌入式軟件時(shí),使用跟蹤工具可以找到一些典型錯(cuò)誤!
文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論