新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 業(yè)界動(dòng)態(tài) > 嵌入式開(kāi)發(fā):為什么要使用 MPU?

嵌入式開(kāi)發(fā):為什么要使用 MPU?

作者: 時(shí)間:2022-05-30 來(lái)源:網(wǎng)絡(luò) 收藏

  在你的嵌入式項(xiàng)目中使用可以為你節(jié)省大量的挫折、時(shí)間和金錢。對(duì)嵌入式開(kāi)發(fā)人員的最大單一好處是它能夠在開(kāi)發(fā)早期捕獲錯(cuò)誤,盡早發(fā)現(xiàn)錯(cuò)誤可顯著縮短開(kāi)發(fā)時(shí)間,在項(xiàng)目后期修復(fù)代碼中的錯(cuò)誤可以減少文檔和測(cè)試代碼所需的返工,另一方面,盡早修復(fù)錯(cuò)誤將減少項(xiàng)目后期代碼中存在的錯(cuò)誤數(shù)量,這將簡(jiǎn)化識(shí)別和修復(fù)剩余錯(cuò)誤的過(guò)程,因?yàn)橥瑫r(shí)出現(xiàn)多個(gè)錯(cuò)誤的可能性較小,這有助于你保持更可預(yù)測(cè)的時(shí)間表并防止意外延遲。

本文引用地址:http://butianyuan.cn/article/202205/434625.htm

  如何實(shí)現(xiàn)這一點(diǎn)?最明顯的方法是保護(hù)所有與當(dāng)前正在執(zhí)行的代碼無(wú)關(guān)的數(shù)據(jù)。一個(gè)簡(jiǎn)單的例子可以只用兩個(gè)RTOS任務(wù)A和B來(lái)構(gòu)建。任務(wù)A和B不應(yīng)相互交互,但存在一個(gè)錯(cuò)誤,任務(wù)A可能會(huì)意外寫(xiě)入任務(wù)B偶爾使用的某些數(shù)據(jù),覆蓋此數(shù)據(jù)不影響任務(wù)A的正確運(yùn)行。但是當(dāng)任務(wù)B嘗試使用損壞的數(shù)據(jù)時(shí),任務(wù)B可能會(huì)出現(xiàn)意外故障。如果沒(méi)有配置MPU來(lái)防止任務(wù)A寫(xiě)入任務(wù)B的數(shù)據(jù),這個(gè)錯(cuò)誤可能需要嵌入式開(kāi)發(fā)人員很長(zhǎng)時(shí)間才能找到。如果錯(cuò)誤很微妙或任務(wù)B很少使用該數(shù)據(jù),則此問(wèn)題將特別難以解決。然而,對(duì)于MPU,錯(cuò)誤的寫(xiě)入操作會(huì)立即導(dǎo)致異常,從而讓你能夠確定導(dǎo)致錯(cuò)誤的代碼行。

  在某些架構(gòu)上,MPU甚至可以幫助你檢測(cè)NULL指針取消引用,因?yàn)槟憧梢栽O(shè)置MPU區(qū)域以防止非特權(quán)代碼訪問(wèn)0x0處的內(nèi)存。

  應(yīng)用程序中設(shè)計(jì)良好的一組MPU區(qū)域可以明確保護(hù)重要的內(nèi)存區(qū)域以防止出現(xiàn)特定問(wèn)題。一個(gè)很好的例子是通過(guò)將緩沖區(qū)放在MPU區(qū)域的末尾來(lái)防止緩沖區(qū)溢出。你還可以將你的任務(wù)堆棧放置在任何非特權(quán)代碼無(wú)法訪問(wèn)的區(qū)域。如果這樣做,那么每個(gè)任務(wù)必須使用自己的MPU區(qū)域之一來(lái)明確授予自己對(duì)自己堆棧的訪問(wèn)權(quán)限。使用MPU迫使你真正考慮應(yīng)用程序的結(jié)構(gòu),以便你在任務(wù)之間干凈地分離數(shù)據(jù),從而產(chǎn)生更健壯和可維護(hù)的代碼庫(kù)。

  什么時(shí)候不使用MPU?

  有兩種主要情況使嵌入式開(kāi)發(fā)人員不會(huì)在處理器上使用MPU;一個(gè)簡(jiǎn)單的項(xiàng)目和一個(gè)性能關(guān)鍵的項(xiàng)目。第一個(gè)很簡(jiǎn)單;一個(gè)非常簡(jiǎn)單的應(yīng)用程序可能無(wú)法從使用MPU所增加的復(fù)雜性中受益。無(wú)需設(shè)置涵蓋閃存、RAM和外圍設(shè)備的MPU區(qū)域,你的閃爍演示可能就可以完成。

  如果你需要處理器的每一滴性能,那么使用MPU的開(kāi)銷可能會(huì)讓你大吃一驚。使用MPU的FreeRTOS端口中的任務(wù)上下文切換例程更長(zhǎng),因?yàn)槊總€(gè)任務(wù)都有多個(gè)MPU區(qū)域需要編程。當(dāng)新任務(wù)被上下文切換時(shí),RTOS必須對(duì)每個(gè)任務(wù)MPU區(qū)域進(jìn)行編程,并執(zhí)行其通常的職責(zé),例如堆疊使用過(guò)的寄存器。此外,由于內(nèi)核代碼和數(shù)據(jù)受MPU保護(hù),因此所有內(nèi)核函數(shù)調(diào)用都必須受包裝函數(shù)保護(hù)。這個(gè)包裝函數(shù)只是在調(diào)用內(nèi)核函數(shù)之前提升處理器的特權(quán)級(jí)別,然后恢復(fù)特權(quán)并返回。這不僅會(huì)增加運(yùn)行代碼所需的時(shí)間,而且可能會(huì)增加任務(wù)所需的堆棧大小。任務(wù)的控制塊還必須在其MPU區(qū)域上存儲(chǔ)信息,并且在某些安全關(guān)鍵RTOS(如SAFERTOS)的情況下,也將存儲(chǔ)此數(shù)據(jù)的鏡像。

  你還應(yīng)該警惕,使用MPU可能很困難,有時(shí)甚至令人沮喪。嵌入式開(kāi)發(fā)人員設(shè)計(jì)應(yīng)用程序需要更多時(shí)間,因?yàn)楸仨殲槊總€(gè)任務(wù)考慮MPU區(qū)域。這些區(qū)域中的錯(cuò)誤,例如不正確的區(qū)域長(zhǎng)度、權(quán)限或未正確鏈接應(yīng)用程序的數(shù)據(jù),可能會(huì)導(dǎo)致調(diào)試混亂。



關(guān)鍵詞: MPU

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉