哪些工具可以在使用RTOS時(shí)發(fā)現(xiàn)實(shí)時(shí)系統(tǒng)的bug?
越來越多的嵌入式系統(tǒng)依賴于實(shí)時(shí)操作系統(tǒng)(RTOS)的使用,以滿足實(shí)時(shí)需求,減少上市時(shí)間,簡化開發(fā),增加代碼可移植性。盡管RTOS有許多好處,但它也有其缺點(diǎn),如可能引入分配不當(dāng)?shù)娜蝿?wù)優(yōu)先級(jí)、堆棧溢出、饑餓、死鎖、優(yōu)先級(jí)反轉(zhuǎn)等bug。
一些專門設(shè)計(jì)的工具,可以幫助基于RTOS的程序開發(fā)人員發(fā)現(xiàn)一些難以發(fā)現(xiàn)的錯(cuò)誤。
RTOS是什么?
實(shí)時(shí)操作系統(tǒng)(RTOS或?qū)崟r(shí)內(nèi)核)是有效地管理CPU時(shí)間的軟件。大多數(shù)內(nèi)核使用C編寫,僅需匯編語言編寫小部分代碼,使內(nèi)核適配不同的CPU體系結(jié)構(gòu)。在使用RTOS內(nèi)核設(shè)計(jì)應(yīng)用程序時(shí),只需將工作分成任務(wù),每個(gè)任務(wù)負(fù)責(zé)工作的一部分。任務(wù)(也稱為線程)是一個(gè)簡單的程序,認(rèn)為自己完全擁有CPU。在單核CPU上,在任何給定時(shí)間內(nèi)只能執(zhí)行一個(gè)任務(wù)。應(yīng)用代碼還需要根據(jù)任務(wù)重要性為每個(gè)任務(wù)分配優(yōu)先級(jí)以及任務(wù)堆棧(RAM)。一般來說,增加低優(yōu)先級(jí)任務(wù)不會(huì)影響系統(tǒng)對(duì)高優(yōu)先級(jí)任務(wù)的響應(yīng)。任務(wù)實(shí)現(xiàn)通常是一個(gè)無限循環(huán),內(nèi)核負(fù)責(zé)任務(wù)的管理,稱為多任務(wù)處理。多任務(wù)處理是在幾個(gè)順序任務(wù)之間調(diào)度和切換CPU的過程。多任務(wù)處理提供了具有多個(gè)CPU的錯(cuò)覺,最大化地使用CPU,如圖1所示。多任務(wù)處理還有助于創(chuàng)建模塊化的應(yīng)用程序。使用實(shí)時(shí)內(nèi)核后,應(yīng)用程序更容易設(shè)計(jì)和維護(hù)。
大多數(shù)商業(yè)RTOS都是搶占式調(diào)度方式,內(nèi)核總是運(yùn)行就緒的最重要的任務(wù)。搶占式內(nèi)核也是事件驅(qū)動(dòng)的,任務(wù)被設(shè)計(jì)為等待事件發(fā)生后才能執(zhí)行。如果任務(wù)等待的事件沒有發(fā)生,內(nèi)核將運(yùn)行其它任務(wù)。等待狀態(tài)的任務(wù)不消耗CPU時(shí)間。通過內(nèi)核API調(diào)用來完成事件的發(fā)生和等待操作,避免輪詢操作,提高CPU時(shí)間的利用率。典型的任務(wù)實(shí)現(xiàn)示例,如下所示:
實(shí)時(shí)內(nèi)核提供了許多服務(wù),如多任務(wù)處理、中斷管理、任務(wù)間通信與同步、資源管理、時(shí)間管理、內(nèi)存分區(qū)管理等。RTOS可以用于少量任務(wù)的簡單應(yīng)用,在需要復(fù)雜和耗時(shí)的通信的應(yīng)用中,如TCP/IP、USB(主機(jī)和/或設(shè)備)、CAN、藍(lán)牙、Zigbee應(yīng)用等,RTOS是一個(gè)必備工具。當(dāng)應(yīng)用程序需要文件系統(tǒng)來存儲(chǔ)和檢索數(shù)據(jù),以及當(dāng)產(chǎn)品配備了圖形顯示(黑白、灰度或彩色)時(shí),也強(qiáng)烈推薦使用RTOS。
硬件調(diào)試端口
ARM Cortex-M內(nèi)核配備了強(qiáng)大的調(diào)試硬件。CoreSight提供了非侵入性的功能,允許工具在不停止CPU的情況下監(jiān)視和控制實(shí)時(shí)系統(tǒng),例如:
? 動(dòng)態(tài)內(nèi)存/外設(shè)訪問(讀寫)
? 指令跟蹤(芯片需包括一個(gè)執(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)試器只提供了最基本的功能:下載代碼、啟動(dòng)/停止應(yīng)用、設(shè)置斷點(diǎn)等功能。一些調(diào)試器允許在目標(biāo)運(yùn)行時(shí)顯示和更改變量(如Live Watch),但這些功能僅限于數(shù)值。許多調(diào)試器內(nèi)置RTOS插件,但通常需要停止應(yīng)用程序才能檢查RTOS的狀態(tài)(對(duì)于調(diào)試實(shí)時(shí)系統(tǒng)不太實(shí)用)。
2、通過調(diào)試器,例如Segger J-Link,將代碼下載到目標(biāo)系統(tǒng)。
3、J-Link連接到CoreSight調(diào)試端口,啟動(dòng)/停止CPU,下載代碼,編程板載Flash等。即使目標(biāo)系統(tǒng)正在執(zhí)行代碼,J-Link也可以讀寫內(nèi)存。
4、Micrium的μC/Probe是一個(gè)獨(dú)立的、與CPU無關(guān)的Windows應(yīng)用程序,它讀取工具鏈生成的ELF文件。ELF文件包含下載到目標(biāo)系統(tǒng)的代碼以及所有全局變量的名稱、數(shù)據(jù)類型和內(nèi)存位置。
5、μC/Probe允許用戶在運(yùn)行時(shí)顯示或更改連接的嵌入式目標(biāo)上的變量或內(nèi)存位置(包括I/O端口)的值。用戶只需在μC/Probe圖形環(huán)境填充量規(guī)、數(shù)字指示器、表格、圖表、虛擬LED、條形圖、滑塊、開關(guān)、按鈕等控件,并將控件與嵌入設(shè)備中的變量或內(nèi)存位置相關(guān)聯(lián),即可在運(yùn)行時(shí)顯示或更改變量。通過μC/Probe圖形界面中添加的虛擬滑塊或開關(guān),你可以輕松地更改運(yùn)行系統(tǒng)的參數(shù)(如過濾系數(shù)和PID回路增益)或啟動(dòng)設(shè)備并測試I/O端口。
6、μC/Probe向J-Link發(fā)送讀取或?qū)懭雰?nèi)存的請(qǐng)求。
7、J-Link請(qǐng)求將轉(zhuǎn)換為CoreSight命令,獲取變量值并顯示到μC/Probe圖形界面。
8、測試/調(diào)試實(shí)時(shí)嵌入式系統(tǒng)的另一個(gè)非常有用的工具是SEGGER的SystemView。此工具通常與RTOS一起工作,按時(shí)間順序顯示任務(wù)和ISR的執(zhí)行,可以查看每個(gè)任務(wù)需要執(zhí)行的時(shí)間(最小/平均/最大),任務(wù)何時(shí)就緒,每個(gè)任務(wù)實(shí)際開始執(zhí)行時(shí)間,ISR何時(shí)執(zhí)行等。SystemView可以幫助你發(fā)現(xiàn)不易發(fā)現(xiàn)的錯(cuò)誤。但SystemView需要向目標(biāo)系統(tǒng)添加記錄RTOS事件和ISR的駐留代碼(由SEGGER免費(fèi)提供),SystemView還會(huì)消耗少量的RAM來緩存這些事件。
9、J-Link允許多個(gè)進(jìn)程同時(shí)訪問CoreSight,因此你可以同時(shí)使用這三個(gè)工具。
基于RTOS應(yīng)用中的問題
堆棧溢出
在基于實(shí)時(shí)內(nèi)核的應(yīng)用中,每個(gè)任務(wù)都需要自己的堆棧。任務(wù)所需堆棧的大小取決于應(yīng)用程序。如果堆棧大于任務(wù)要求,則會(huì)浪費(fèi)內(nèi)存。如果堆棧太小,堆棧可能溢出。我們可以通過分配更多內(nèi)存來減少堆棧溢出的機(jī)會(huì),通常需要25-50%的額外堆??臻g。一些CPU,比如基于ARMv8M架構(gòu)的CPU,內(nèi)置了堆棧溢出檢測機(jī)制。然而,該特性并不能幫助確定合適的堆棧大小,它只是防止堆棧溢出的負(fù)面后果。
堆棧分配時(shí),首先為任務(wù)堆棧分配更多空間,然后在已知最壞情況下運(yùn)行應(yīng)用程序,監(jiān)視實(shí)際堆棧使用情況。
下圖顯示了μC/Probe對(duì)測試應(yīng)用程序的μ/OS-III內(nèi)核感知的截圖。Stack Usage列顯示每個(gè)任務(wù)在給定時(shí)間的最大堆棧使用情況。μC/Probe將更新并實(shí)時(shí)顯示堆棧使用信息,無需停止目標(biāo)應(yīng)用。綠色表示最大堆棧使用量一直保持在70%。黃色表示堆棧使用量在70%到90%之間。紅色表示堆棧使用量已超過90%。顯然,使用92%堆棧的任務(wù)應(yīng)該增大堆棧,使其回到70%以下。
中斷響應(yīng)
在臨界代碼處理時(shí),RTOS和應(yīng)用程序代碼通常必須禁用中斷。關(guān)中斷會(huì)影響系統(tǒng)對(duì)事件的響應(yīng),RTOS應(yīng)用中盡量減少中斷禁用時(shí)間。
μC/OS-III會(huì)監(jiān)測每個(gè)任務(wù)最壞情況下的中斷禁用時(shí)間,下圖所示。如果應(yīng)用需要滿足實(shí)時(shí)截止時(shí)間,這些信息非常有用。
中斷被禁用的時(shí)間很大程度上取決于CPU、其時(shí)鐘速率、應(yīng)用程序和調(diào)用的RTOS服務(wù)。禁用中斷最長的任務(wù)用紅色高亮顯示,幫助用戶快速識(shí)別潛在的異常值。
如果最大中斷禁用時(shí)間是由RTOS引起的,可以:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。