<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 哪些工具可以在使用RTOS時(shí)發(fā)現實(shí)時(shí)系統的bug?

哪些工具可以在使用RTOS時(shí)發(fā)現實(shí)時(shí)系統的bug?

發(fā)布人:13261589816 時(shí)間:2022-07-19 來(lái)源:工程師 發(fā)布文章

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

一些專(zhuān)門(mén)設計的工具,可以幫助基于RTOS的程序開(kāi)發(fā)人員發(fā)現一些難以發(fā)現的錯誤。

RTOS是什么?

實(shí)時(shí)操作系統(RTOS或實(shí)時(shí)內核)是有效地管理CPU時(shí)間的軟件。大多數內核使用C編寫(xiě),僅需匯編語(yǔ)言編寫(xiě)小部分代碼,使內核適配不同的CPU體系結構。在使用RTOS內核設計應用程序時(shí),只需將工作分成任務(wù),每個(gè)任務(wù)負責工作的一部分。任務(wù)(也稱(chēng)為線(xiàn)程)是一個(gè)簡(jiǎn)單的程序,認為自己完全擁有CPU。在單核CPU上,在任何給定時(shí)間內只能執行一個(gè)任務(wù)。應用代碼還需要根據任務(wù)重要性為每個(gè)任務(wù)分配優(yōu)先級以及任務(wù)堆棧(RAM)。一般來(lái)說(shuō),增加低優(yōu)先級任務(wù)不會(huì )影響系統對高優(yōu)先級任務(wù)的響應。任務(wù)實(shí)現通常是一個(gè)無(wú)限循環(huán),內核負責任務(wù)的管理,稱(chēng)為多任務(wù)處理。多任務(wù)處理是在幾個(gè)順序任務(wù)之間調度和切換CPU的過(guò)程。多任務(wù)處理提供了具有多個(gè)CPU的錯覺(jué),最大化地使用CPU,如圖1所示。多任務(wù)處理還有助于創(chuàng )建模塊化的應用程序。使用實(shí)時(shí)內核后,應用程序更容易設計和維護。

圖片

大多數商業(yè)RTOS都是搶占式調度方式,內核總是運行就緒的最重要的任務(wù)。搶占式內核也是事件驅動(dòng)的,任務(wù)被設計為等待事件發(fā)生后才能執行。如果任務(wù)等待的事件沒(méi)有發(fā)生,內核將運行其它任務(wù)。等待狀態(tài)的任務(wù)不消耗CPU時(shí)間。通過(guò)內核API調用來(lái)完成事件的發(fā)生和等待操作,避免輪詢(xún)操作,提高CPU時(shí)間的利用率。典型的任務(wù)實(shí)現示例,如下所示:

圖片

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

硬件調試端口

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

? 動(dòng)態(tài)內存/外設訪(fǎng)問(wèn)(讀寫(xiě))

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

? 數據跟蹤

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

圖片

系統測試/調試工具

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

圖片

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

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

2、通過(guò)調試器,例如Segger J-Link,將代碼下載到目標系統。

3、J-Link連接到CoreSight調試端口,啟動(dòng)/停止CPU,下載代碼,編程板載Flash等。即使目標系統正在執行代碼,J-Link也可以讀寫(xiě)內存。

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

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

6、μC/Probe向J-Link發(fā)送讀取或寫(xiě)入內存的請求。

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

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

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

基于RTOS應用中的問(wèn)題

堆棧溢出

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

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

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

圖片

中斷響應

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

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

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

圖片

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

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。




相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>