91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何按進程對RAM進行分組與Cortex-M MPU使用建議

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Jean Labrosse ? 2022-06-10 07:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在本系列關(guān)于將 RTOS 與 MPU 結(jié)合使用的最后一部分中,我們將了解如何按進程對 RAM 進行分組,并以使用 Cortex-M MPU 時的建議列表作為結(jié)尾。

到目前為止,我們已經(jīng)了解了 MPU 是什么以及它如何幫助將任務和流程相互隔離。我們還研究了如何設置 Cortex-M MPU,發(fā)現(xiàn)它非常易于使用。使用 MPU 的復雜性更多地與組織應用程序的內(nèi)存有關(guān),而不是更新這個非常有用的設備的機制。

在本系列關(guān)于將 RTOS 與 MPU 結(jié)合使用的最后一部分中,我們將了解如何按進程對 RAM 進行分組,并以使用 Cortex-M MPU 時的建議列表作為結(jié)尾。

創(chuàng)建 MPU 進程表

使用 MPU 時最大的困難可能是按進程對內(nèi)存進行分組并創(chuàng)建 MPU 進程表。這部分是因為您需要更深入地了解您的工具鏈:編譯器、匯編器和鏈接器/定位器。

假設我使用的是 IAR 工具鏈(即 EWARM),但概念非常相似,您可以根據(jù)自己使用的工具調(diào)整這些概念。除非另有說明,否則鏈接器會將數(shù)據(jù)(即 RAM)放置在圖 2 所示的三個部分之一中。

未初始化的數(shù)據(jù)

零初始化數(shù)據(jù)

初始化數(shù)據(jù)

顧名思義,未初始化的數(shù)據(jù)對應于在編譯時未賦予初始值或未聲明為靜態(tài)的變量。

零初始化數(shù)據(jù)對應于聲明為靜態(tài)并在啟動時初始化為零的數(shù)據(jù)。鏈接器將其分組為一個連續(xù)的塊,以便啟動代碼可以執(zhí)行塊集(為 0)。

初始化數(shù)據(jù)對應于具有初始值的數(shù)據(jù)(例如 int x = 10;)。同樣,鏈接器將這些數(shù)據(jù)分組到一個連續(xù)的塊中,但在 ROM 中創(chuàng)建一個并行塊,其中包含 RAM 中每個相應變量的初始值。啟動時,整個塊從 ROM 復制到 RAM。

pYYBAGKgaeiAcEvuAACbPR5E-EY102.png

【圖2 | RAM 部分。]

如前所述,進程的 RAM 必須連續(xù)分組,如圖 3 所示。為此,我們需要繞過編譯器/鏈接器標準部分并創(chuàng)建將按進程分組的新部分。工具鏈通常能夠創(chuàng)建多個零塊和初始化部分,如圖 3 所示。

poYBAGKgae-AWKT_AACu_X-6jGA358.png

【圖3 | 基于 MPU 的應用程序的 RAM 部分。]

創(chuàng)建命名的 RAM 部分

要按進程對數(shù)據(jù)進行分組,我們需要使用 EWARM #pragma 指令 default_variable_attributes 并將所有要在一個進程中分組的變量包裝在一起。

#pragma default_variable_attributes = @”.Process1”

// All variables that we want to be part of the section named “.Process1”。

#pragma default_variable_attributes =

如果您的應用程序包含在匯編語言文件中聲明的變量,那么您還需要確保匯編語言文件包含適當?shù)膮R編程序指令。

按塊對 RAM 進行分組

您的應用程序肯定會包含不一定與任何特定進程相關(guān)聯(lián)的代碼。在這種情況下,最好為這些模塊創(chuàng)建命名部分,然后將這些部分組合成一個公共代碼塊。然后,您將使用上述#pragma 指令創(chuàng)建不同的命名段,每個模塊一個,并使用鏈接器的 塊 指令(如下所示)對這些段進行分組。

define block COMMON_RAM_BLOCK with alignment = 4K, size = 4K

{

section .DRIVER_RAM,

section .COMMOM_RAM,

section .MATH_RAM,

section .STRING_RAM,

}

define block PROCESS_AI_RAM_BLOCK with alignment = 16K, size = 16K

{

section .AI_DRIVER_RAM, // Analog input driver

section .RTD_LIN_RAM, // RTD linearization

section .THERMOCOUPLE_LIN_RAM, // Thermocouple linearization

section .UNIT_CONVERSION_RAM, // Shared RAM with AO module

}

define block PROCESS_AO_RAM_BLOCK with alignment = 8K, size = 8K

{

section .AO_DRIVER_RAM, // Analog output driver

section .4_20MA_LIN_RAM, // 4-20 mA linearization

section .ACTUATOR_LIN_RAM, // Actuator linearization

section .UNIT_CONVERSION_RAM, // Shared RAM with AI module

}

define block SHARED_RAM_BLOCK with alignment = 2K, size = 2K

{

}

您會注意到 block 指令允許您指定內(nèi)存塊的大小和對齊方式。為了將塊的起始地址放置在 MPU 進程表中,兩個值必須相同,這一點很重要。此外,每個塊所需的 RAM 量取決于應用程序。為了便于說明,我決定使用 16K、8K、4K 和 2K 字節(jié)。

定位 RAM 塊

我們現(xiàn)在可以使用兩個鏈接器指令將所有塊放置在 MCU 的可尋址空間中:區(qū)域和位置:

define region RAM = Mem:[from 0x20000000 size 64K];

place in RAM

{

block RAM_ALL with fixed order

{

block PROCESS_AI_RAM_BLOCK,

block PROCESS_AO_RAM_BLOCK,

block COMMON_RAM_BLOCK,

block SHARED_RAM_BLOCK

}

}

region 指令指定 MCU 的可尋址存儲器。如果您的 RAM 并非全部連續(xù),則可能有不同的區(qū)域指令。

RAM 指令中的位置指定在 RAM 區(qū)域中定位塊。您會注意到我們需要將塊放入塊中以指定塊放置的順序。事實上,為了減少浪費的空間量,應該先使用較大的塊。

為每個任務創(chuàng)建 MPU 進程表

現(xiàn)在 RAM 按進程分組,您可以返回并編輯每個任務/進程的 MPU 表。但是,要做到這一點,編譯器必須知道塊的名稱,因此,您需要使用 #pragma section 指令,如下所示:

#pragma section = “COMMON_RAM_BLOCK”

#pragma section = “PROCESS_AI_RAM_BLOCK”

#pragma section = “PROCESS_AO_RAM_BLOCK”

#pragma section = “SHARED_RAM_BLOCK”

這兩個進程表現(xiàn)在可以如下所示(假設您沒有使用包含上一節(jié)中描述的每個任務回調(diào)的版本):

poYBAGKgaf2AEDSdAAPEVRXjNXg790.png

poYBAGKgageAGEBbAAO6FLgyE5w297.png

建議

以下是使用 Armv7-M MPU 時的一些建議。

在非特權(quán)模式下運行用戶代碼:

可以使用 MPU,但仍以特權(quán)模式運行所有應用程序代碼。當然,這意味著應用程序代碼將能夠更改 MPU 設置,因此會破壞擁有 MPU 的目的之一。最初以特權(quán)模式運行應用程序可能會更容易遷移應用程序代碼。但是,在某些時候,您的大部分應用程序代碼都需要在非特權(quán)模式下運行,因此您需要添加 SVC 處理程序。

將 PRIVDEFENA 設置為 1:

這允許特權(quán)代碼訪問完整的內(nèi)存映射。理想情況下,您的大多數(shù)應用程序?qū)⒃诜翘貦?quán)模式下運行,只有 ISR 和 RTOS 將在特權(quán)模式下運行。此建議可避免為每個任務使用三個 MPU 區(qū)域,以授予特權(quán)代碼訪問任何 RAM 位置、任何代碼和任何外圍設備。將 PRIVDEFENA 設置為 1 的決定可能已經(jīng)由 RTOS 供應商做出,您無法更改。

ISR 具有完全訪問權(quán)限:

每當識別到中斷并啟動 ISR 時,處理器就會切換到特權(quán)模式。由于 PRIVDEFENA 將設置為 1,因此 ISR 無論如何都可以訪問 I/O 位置的任何內(nèi)存。您根本不想在進入 ISR 時重新配置 MPU,并在退出時重新配置它。因此,ISR 應該被視為系統(tǒng)級代碼,因此確實應該被允許具有完全訪問權(quán)限。

此外,ISR 應始終盡可能短,并簡單地向任務發(fā)出信號以執(zhí)行中斷設備所需的大部分工作。當然,這假設 ISR 是內(nèi)核感知的,并且任務有相當多的工作來處理中斷設備。例如,處理以太網(wǎng)數(shù)據(jù)包不應該在 ISR 級別完成。但是,可以直接在 ISR 中切換 LED 或更新脈沖寬度調(diào)制 (PWM) 定時器的占空比。

將 XN 位設置為 1:

如果您的應用程序代碼不希望在 RAM 外執(zhí)行代碼,則應為所有 RAM 或外圍區(qū)域設置 RASR 寄存器的 eXecute Never 位。為外圍設備設置 XN 位可能看起來很奇怪,但它不會傷害并防止黑客試圖進入您的系統(tǒng)。

限制外圍設備對其進程的訪問:

您應該留出一個或多個 MPU 區(qū)域來限制進程只能訪問其自己的外圍設備。換句話說,如果一個進程管理 USB 端口,那么它應該只能訪問 USB 外圍設備或與 USB 控制器需求相關(guān)的外圍設備,例如 DMA。

限制 RTOS API

系統(tǒng)設計人員需要確定哪些 RTOS API 應可用于應用程序代碼。具體來說,您想防止應用程序代碼在系統(tǒng)初始化后創(chuàng)建和刪除任務或其他 RTOS 對象(如信號量、隊列等)嗎?換句話說,RTOS 對象是否應該只在系統(tǒng)啟動時創(chuàng)建,而不是在運行時創(chuàng)建?如果是這樣,那么 SVC 處理程序查找表應該只包含您想要向應用程序公開的 API。然而,即使 ISR 在特權(quán)模式下運行并因此可以訪問任何 RTOS API,一個好的 RTOS 仍會阻止從 ISR 創(chuàng)建和刪除 RTOS 對象。

在 RTOS 空間中分配 RTOS 對象:

任務堆棧位于進程的內(nèi)存空間內(nèi)。然而,RTOS 對象(信號量、隊列、任務控制塊等)最好分配在內(nèi)核空間中并通過引用進行訪問。換句話說,您不想在進程的內(nèi)存空間中分配 RTOS 對象,因為這意味著應用程序代碼可以有意或無意地修改這些對象,而無需通過 RTOS API。

沒有全局堆:

將 MPU 設置為使用全局堆(即所有進程使用的堆)幾乎是不可能的,因此您應該盡可能避免使用這些堆。相反,如前所述,如果進程需要動態(tài)分配的內(nèi)存(例如以太網(wǎng)幀緩沖區(qū)),則應允許進程特定的堆。

不要禁用中斷:

如果您的應用程序在非特權(quán)模式下運行,任何禁用中斷的嘗試都將被忽略。這樣做的問題是,您不會從 CPU 獲得中斷 未被 禁用的指示。

如果您的應用程序在非特權(quán)模式下運行并且您嘗試通過 NVIC 禁用中斷,則會觸發(fā)總線故障。

保護對代碼的訪問:

盡管 MPU 區(qū)域通常用于提供或限制對 RAM 和外圍設備的訪問,但如果您有空閑區(qū)域并且能夠按進程組織代碼(通過鏈接器命令),那么限制代碼對代碼的訪問可能很有用。這可以防止某些類型的安全攻擊,例如 Return-to-libc [2]。

減少進程間通信

就像任務應該設計得盡可能獨立一樣,流程也應該遵循同樣的規(guī)則。因此,要么進程不相互通信,要么將進程間通信保持在最低限度。

如果您必須與其他進程通信,只需留出一個包含輸出和輸入緩沖區(qū)的共享區(qū)域。發(fā)送方將其數(shù)據(jù)放入輸出緩沖區(qū),然后觸發(fā)中斷以喚醒接收進程。一旦數(shù)據(jù)被處理,響應(如果需要)可以放在發(fā)送者的緩沖區(qū)中,并且可以使用中斷來通知發(fā)送者。

確定遇到 MPU 故障時該怎么做:

理想情況下,在開發(fā)過程中檢測并糾正所有 MPU 故障。您應該計劃由于意外故障或錯誤或您的系統(tǒng)受到安全攻擊而在現(xiàn)場發(fā)生故障。在大多數(shù)情況下,建議對每個任務或每個進程都有一個受控的關(guān)閉順序。是否重新啟動有問題的任務、進程內(nèi)的所有任務或整個系統(tǒng)取決于故障的嚴重程度。

有辦法記錄和報告故障:

理想情況下,您有辦法記錄(可能記錄到文件系統(tǒng))并顯示故障原因,以允許開發(fā)人員解決問題。

結(jié)論

內(nèi)存保護單元 (MPU) 是將對內(nèi)存和外圍設備的訪問限制為僅需要訪問這些資源的代碼的硬件。如果任務試圖訪問其分配空間之外的內(nèi)存位置或外圍設備,則會觸發(fā) CPU 異常,并且根據(jù)應用程序,必須采取糾正措施。

Cortex-M MCU 中的 MPU 是一個相當簡單的設備,并且相對容易配置。然而,使用 MPU 的復雜性更傾向于按進程分配存儲(主要是 RAM)以及創(chuàng)建將在上下文切換期間加載到 MPU 中的 MPU 進程表。

最后,我提供了一個建議列表,這些建議可以更好地在您的應用程序中使用 MPU。

單獨的軟件無法阻止對未分配給 RTOS 環(huán)境中任務的內(nèi)存或外圍設備的訪問。您需要硬件來實現(xiàn)這一點,而 MPU 是目前 Cortex-M (Armv7-M) 上唯一可以做到這一點的機制。

遷移應用程序以使用 MPU 是一個相當簡單但乏味的過程。添加 MPU 也會給您的應用程序帶來開銷:在上下文切換期間您需要加載額外的寄存器,并且用戶代碼應該在非特權(quán)模式下運行以避免此類代碼更改 MPU 設置。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18954

    瀏覽量

    399115
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5611

    瀏覽量

    130076
  • MPU
    MPU
    +關(guān)注

    關(guān)注

    0

    文章

    456

    瀏覽量

    51371
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Cortex-M0和Cortex-M0+的區(qū)別

    咱們芯源MCU主要是Cortex-M0+處理器,那么Cortex-M0+比Cortex-M0處理器強在哪里呢?下面針對2者的關(guān)鍵特性對比進行簡單區(qū)別,如下: 1、處理器流水線 Cor
    發(fā)表于 01-22 06:23

    最小化ARM Cortex-M CPU功耗的方法與技巧分享

    1 理解Thumb-2   首先,讓我們從一個看起來并不明顯的起點開始討論節(jié)能技術(shù)—指令集。所有Cortex-M CPU都使用Thumb-2指令集,它融合了32位ARM指令集和16位Thumb指令集
    發(fā)表于 01-21 06:19

    Cortex-M0 處理器介紹

    功耗的32位處理器。 Cortex-M0是Cortex-M家族中的M0系列。最大特點是低功耗的設計。Cortex-M0為32位、3級流水線RISC處理器,其核心仍為馮.諾依曼結(jié)構(gòu),是指
    發(fā)表于 01-16 08:04

    進程概念和特征

    的間斷性,即進程各自獨立的、 不可預知的速度向前推進。異步性會導致執(zhí)行結(jié)果的不可再現(xiàn)性,為此,在操作系統(tǒng)中必須配置相應的進程同步機制。   5. 結(jié)構(gòu)性:每個進程都配置一個PCB對
    發(fā)表于 01-15 06:39

    RZ/T2M MPU:工業(yè)控制與自動化應用的理想之選

    RZ/T2M MPU:工業(yè)控制與自動化應用的理想之選 在當今的工業(yè)控制與自動化領(lǐng)域,對高性能、高可靠性微處理器單元(MPU)的需求日益增長。Renesas Electronics的RZ/T2M
    的頭像 發(fā)表于 12-29 16:30 ?424次閱讀

    Cortex-M產(chǎn)品的特色

    與外部設備進行通信。 指令集:Cortex-M系列處理器支持ARM Thumb指令集,包括16位和32位的Thumb-2指令集,以及可選的DSP指令和浮點單元,提供了高性能的信號處理能力
    發(fā)表于 11-26 07:22

    Cortex-M內(nèi)核中的精確延時的方法

    使用 CYCCNT寄存器來測量執(zhí)行某個任務所花的周期數(shù),這也可以用作時間基準相關(guān)的目的(操作系統(tǒng)中統(tǒng)計 CPU使用率可以用到它)。” Cortex-M中的DWT它有一個32位的寄存器叫CYCCNT
    發(fā)表于 11-21 07:51

    Cortex-M級別的轉(zhuǎn)換

    一、 簡述 Cortex-M 里面有特權(quán)級別的概念,不同級別可以設定不同的權(quán)限,如何轉(zhuǎn)換特權(quán)級別基本是本章的內(nèi)容。 二、操作模式 ARM M 核操作模式有兩個: 線程(Thread)模式:在復位時或
    發(fā)表于 11-19 07:32

    M453 支持 MPU 嗎?

    M453 支持 MPU 嗎?如果是這樣,如何啟用它?
    發(fā)表于 08-28 06:37

    請問NuMicro? Cortex-M? 系列芯片是否支持 I2C 監(jiān)視器功能?

    NuMicro? Cortex-M? 系列芯片是否支持 I2C 監(jiān)視器功能?
    發(fā)表于 08-21 06:04

    如何使用 SPI 全雙工在兩個 5LP MPU 之間連接 RAM?

    我需要將兩個 5LP MPU 連接在一起以鏡像兩個 5LP MPU 內(nèi)的 RAM。 我認為這將是 DMA 的一個功能,但我不確定如何實現(xiàn)該功能。 我的主 SPI 單元將向從屬 MPU
    發(fā)表于 07-15 06:20

    瑞薩RZ/A3M HMI MPU介紹

    對于高質(zhì)量圖形顯示的應用要求,用戶通常采用功能強大及搭載DDR高速接口的MPU來實現(xiàn)更多功能和更流暢的畫面。但在開發(fā)過程會遇到DDR高速總線設計的難題,同時Linux系統(tǒng)難以實現(xiàn)類似MCU的快速啟動性能。瑞薩新推出的RZ/A3M HMI
    的頭像 發(fā)表于 05-27 16:14 ?1126次閱讀
    瑞薩RZ/A3<b class='flag-5'>M</b> HMI <b class='flag-5'>MPU</b>介紹

    國產(chǎn)!瑞芯微RK3506 3核ARM+Cortex-A7 + ARM Cortex-M0 工業(yè)評估板說明書

    創(chuàng)龍科技TL3506-EVM是一款基于瑞芯微RK3506J/RK3506B處理器設計的3核ARM Cortex-A7 + ARM Cortex-M0國產(chǎn)工業(yè)評估板,主頻高達1.5GHz。評估板由
    的頭像 發(fā)表于 04-29 15:42 ?3063次閱讀
    國產(chǎn)!瑞芯微RK3506 3核ARM+<b class='flag-5'>Cortex</b>-A7 + ARM <b class='flag-5'>Cortex-M</b>0 工業(yè)評估板說明書

    瑞芯微RK3506(3核ARM+Cortex-A7 + ARM Cortex-M0)工業(yè)核心板選型資料

    創(chuàng)龍科技SOM-TL3506是一款基于瑞芯微RK3506J/RK3506B處理器設計的3核ARM Cortex-A7 + ARM Cortex-M0全國產(chǎn)工業(yè)核心板,主頻高達1.5GHz。核心板CPU、ROM、RAM、電源、晶振
    的頭像 發(fā)表于 04-09 09:04 ?3666次閱讀
    瑞芯微RK3506(3核ARM+<b class='flag-5'>Cortex</b>-A7 + ARM <b class='flag-5'>Cortex-M</b>0)工業(yè)核心板選型資料

    瑞薩RA8快速上手指南:Cortex-M85內(nèi)核瑞薩RA8開發(fā)環(huán)境搭建 并點亮一個LED

    因為Cortex-M內(nèi)核,瑞薩RA8系列單片機支持多種市面上常見的開發(fā)環(huán)境,像Keil MDK、IAR EWARM等,而本文講述的是瑞薩自家官方的IDE(e2 studio)。
    的頭像 發(fā)表于 03-17 14:35 ?1964次閱讀
    瑞薩RA8快速上手指南:<b class='flag-5'>Cortex-M</b>85內(nèi)核瑞薩RA8開發(fā)環(huán)境搭建 并點亮一個LED