国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

創建 MPU 進程表

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

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

未初始化的數據

零初始化數據

初始化數據

顧名思義,未初始化的數據對應于在編譯時未賦予初始值或未聲明為靜態的變量。

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

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

pYYBAGKgaeiAcEvuAACbPR5E-EY102.png

【圖2 | RAM 部分。]

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

poYBAGKgae-AWKT_AACu_X-6jGA358.png

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

創建命名的 RAM 部分

要按進程對數據進行分組,我們需要使用 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 =

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

按塊對 RAM 進行分組

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

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 指令允許您指定內存塊的大小和對齊方式。為了將塊的起始地址放置在 MPU 進程表中,兩個值必須相同,這一點很重要。此外,每個塊所需的 RAM 量取決于應用程序。為了便于說明,我決定使用 16K、8K、4K 和 2K 字節。

定位 RAM 塊

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

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 并非全部連續,則可能有不同的區域指令。

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

為每個任務創建 MPU 進程表

現在 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”

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

poYBAGKgaf2AEDSdAAPEVRXjNXg790.png

poYBAGKgageAGEBbAAO6FLgyE5w297.png

建議

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

在非特權模式下運行用戶代碼:

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

將 PRIVDEFENA 設置為 1:

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

ISR 具有完全訪問權限:

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

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

將 XN 位設置為 1:

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

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

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

限制 RTOS API

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

在 RTOS 空間中分配 RTOS 對象:

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

沒有全局堆:

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

不要禁用中斷:

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

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

保護對代碼的訪問:

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

減少進程間通信

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

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

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

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

有辦法記錄和報告故障:

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

結論

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

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

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

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

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

審核編輯:郭婷

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

    關注

    147

    文章

    18938

    瀏覽量

    398594
  • 寄存器
    +關注

    關注

    31

    文章

    5609

    瀏覽量

    130016
  • MPU
    MPU
    +關注

    關注

    0

    文章

    455

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Cortex-M0和Cortex-M0+的區別

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

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

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

    Cortex-M0 處理器介紹

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

    進程概念和特征

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

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

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

    Cortex-M產品的特色

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

    Cortex-M內核中的精確延時的方法

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

    Cortex-M級別的轉換

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

    M453 支持 MPU 嗎?

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

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

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

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

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

    瑞薩RZ/A3M HMI MPU介紹

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

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

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

    瑞薩RA8快速上手指南:Cortex-M85內核瑞薩RA8開發環境搭建 并點亮一個LED

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

    帶5MB片內RAM的RTOS微處理器RZ/A1M數據手冊

    RZ/A1M 系列微處理器單元(MPU)功能齊全,配備運行頻率為 400MHz 的 Arm? Cortex?-A9 內核以及 5MB的片上靜態隨機存取存儲器(SRAM)。憑借 5MB 的片上
    的頭像 發表于 03-11 15:04 ?1267次閱讀
    帶5MB片內<b class='flag-5'>RAM</b>的RTOS微處理器RZ/A1<b class='flag-5'>M</b>數據手冊