<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>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/202205/434625.htm

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

  在某些架構上,MPU甚至可以幫助你檢測NULL指針取消引用,因為你可以設置MPU區域以防止非特權代碼訪(fǎng)問(wèn)0x0處的內存。

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

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

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

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

  你還應該警惕,使用MPU可能很困難,有時(shí)甚至令人沮喪。嵌入式開(kāi)發(fā)人員設計應用程序需要更多時(shí)間,因為必須為每個(gè)任務(wù)考慮MPU區域。這些區域中的錯誤,例如不正確的區域長(cháng)度、權限或未正確鏈接應用程序的數據,可能會(huì )導致調試混亂。



關(guān)鍵詞: MPU

評論


相關(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>