痞子衡嵌入式:簡析i.MXRT1170 MECC64功能特點及其保護片內OCRAM1,2之道

来源:https://www.cnblogs.com/henjay724/archive/2023/12/28/17933552.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170 MECC64功能特點及其保護片內OCRAM1,2之道。 ECC是 “Error Correcting Code” 的簡寫,ECC 能夠實現錯誤檢查和糾正,含有 ECC 功能的記憶體一般稱為 ECC 記憶體,使用了 EC ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170 MECC64功能特點及其保護片內OCRAM1,2之道

  ECC是 “Error Correcting Code” 的簡寫,ECC 能夠實現錯誤檢查和糾正,含有 ECC 功能的記憶體一般稱為 ECC 記憶體,使用了 ECC 記憶體的系統在穩定性和可靠性上得到很大提升。相比前幾代不帶 ECC 的 i.MXRT10xx 型號,新一代 i.MXRT1170 在ECC上做了全面武裝,從 eFuse 到 FlexRAM,從 OCRAM 到外部存儲空間全都加上了 ECC 功能。如下表所示,不同類型的存儲由不同的 ECC 控制器來守護:

  今天痞子衡給大家簡單介紹一下 i.MXRT1170 上用於保護片內 OCRAM1,2 的 MECC64 功能:

一、MECC64功能簡介

1.1 MECC64特點

  從用戶角度來說,其實 MECC64 的設計特別簡單,當 MECC64 使能後,任何對受保護的 OCRAM1/2 發起的 AXI 訪問都會被 MECC64 模塊接管,MECC64 組件負責根據用戶寫入的數據產生 ECC 校驗值並將其存放於專用 OCRAM1/2_ECC 里,讀訪問時根據用戶讀取的地址從相應 OCRAM1/2_ECC 地址處獲取 ECC 檢驗值並做檢驗處理後再返回數據。

  從模塊框圖裡看一個 MECC64 里有四個 ECC 小單元(也對應四個 RAM Bank 控制器),這其實是跟單個 512KB OCRAM 由四個 128KB Bank 組成一一對應的,這樣便於轉化 AXI64 介面到 RAM 介面。

1. OCRAM 四個 Bank 掛載在 AXI64 系統匯流排上,AXI[1:0] 決定了訪問得是 Bank0-3,這樣的設計可以支持對不同 Bank 的讀、寫操作同時進行。
2. ECC 計算單元是 64bits,這 64bits 數據必須在同一 Bank 里,這個設計對 ECC 初始化操作影響較大,因此避免用 memset 函數去做初始化(STR指令是 byte access)。

  MECC64 模塊一共有兩個,分別是 MECC1、MECC2,分別對應保護 OCRAM1、OCRAM2。此外還有兩個專用 OCRAM1_ECC、 OCRAM2_ECC 存放 ECC 校驗值(當 MECC64 沒使能時,OCRAM1/2_ECC 也可當作普通 OCRAM 使用)。

MECC1 base address: 4001_4000h
MECC2 base address: 4001_8000h

1.2 關於MECC64設計細節

  關於 MECC64 基本概念,參看《簡析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特點、開啟步驟、性能影響》 的 1.2節,這裡不予贅述。

1.2.1 MECC64檢驗能力

  MECC64 中每 64bits 數據就會計算出一個 ECC 校驗值(8bits),ECC 演算法用得是經典的 Hsiao Hamming。

存儲類型 ECC校驗數據塊大小 ECC校驗值長度 ECC校驗能力
Raw NAND 512 bytes 4 bytes 5-bit檢錯,4-bit糾錯
MECC64 64bits 8bits 2-bit檢錯,1-bit糾錯
1.2.2 ECC錯誤觸發處理

  ECC 錯誤分兩種,分別是 1-bit 錯誤和 2-bit 錯誤(針對 64bits 數據而言)。從軟體層面來看,1-bit 錯誤可以不用管,MECC64 模塊會自動糾錯。我們主要處理 2-bit 錯誤,由於 2-bit 錯誤僅能檢錯,無法糾錯,所以發生了這個錯誤,就意味著讀取的數據不可靠了。對於 1/2 bit錯誤,MECC64 均提供了中斷響應(MECCx_INT_IRQn / MECCx_FATAL_INT_IRQn)。

  這裡還需要特別提醒一下,當讀訪問是 64bits 時,發生 ECC 錯誤僅產生一次 ECC 中斷,但是如果是 32/16/8bits 讀訪問則會連續產生兩次 ECC 中斷,因為 ECC 校驗總是以 64bits 為基本數據單元。

二、開啟MECC64的步驟

2.1 激活MECC64特性

  晶元出廠,預設是沒有激活 MECC64 特性的,如果需要開啟 MECC64,需要燒寫 efuse,fusemap 中 0x840[2] 對應的是 MECC_ENABLE bit,我們需要將這個 bit 燒寫成 1,才能激活 MECC64 特性。

2.2 SDK驅動初始化MECC64

  然後可以直接利用 SDK 里的 fsl_mecc 驅動對 MECC64 模塊進行初始化,代碼非常簡單,如下示例代碼就是初始化 MECC1,使能 OCRAM1 區域的讀寫 ECC 功能:

#include "fsl_mecc.h"

void init_mecc(void)
{
    mecc_config_t config;
    MECC_GetDefaultConfig(&config);

    // 使能 MECC64,並且指明受保護的 OCRAM 空間
    config.enableMecc         = true;
    config.Ocram1StartAddress = 0x20240000;
    config.Ocram1EndAddress   = 0x202BFFFF;

    // 初始化 MECC64 模塊,並且初始化 OCRAM 區域為全 0
    MECC_Init(MECC1, &config);
}

  進 MECC_Init() 函數內部可以看到其對 OCRAM 區域的初始化用得是 64bits 賦值,這樣可以保證正確生成首次 ECC 校驗值,等 OCRAM 區域全部初始化過後,底下就可以對 OCRAM 進行任意數據長度的訪問了。

2.3 AXI方式讀寫OCRAM區域

  現在我們直接調試 \SDK_2_14_0_MIMXRT1170-EVKB\boards\evkbmimxrt1170\driver_examples\mecc\mecc_single_error\cm7\iar 工程,跑到 MECC 初始化結束後,打開 Memory 視窗,可以看到 OCRAM1 區域(0x20240000 - 0x202BFFFF) 已經是全 0,OCRAM1_ECC 區域(0x20340000 - 0x2034FFFF)也是全 0。但是往 0x20240020 處寫入 8 位元組測試數據後,並沒有看到 OCRAM1_ECC 區域有數據上的變化,說明 ECC 校驗碼數據是受保護的,僅能被 MECC64 模塊訪問,對用戶不可見。

三、激活MECC64特性後的影響

  前面講到 fusemap 中 0x840[2] 對應的是 MECC_ENABLE bit,這個 bit 被燒錄為 1 後,我們還需要初始化 MECC64 模塊里(打開MECC->PIPE_ECC_EN[ECC_EN])才能真正開啟 OCRAM ECC 功能,但是別忘了晶元參考手冊里 MECC64 章節有一個提醒:

  是的,BootROM 上電運行,第一件事就是檢查 fuse MECC_ENABLE bit 位,如果已經置 1,那就立刻開啟 MECC1 和 MECC2 模塊的 PIPE_ECC_EN[ECC_EN],即啟用 OCRAM ECC,但是 BootROM 並沒有初始化全部 OCRAM1 和 OCRAM2 區域,僅僅初始化了 OCRAM1 前 48KB,這部分是 BootROM 程式的 RW 區。

  痞子衡找了兩塊 RT1170 板卡做了對比測試(晶元設為 Serial Downloader模式,掛上 JLink 讀取記憶體),未激活 MECC64 特性的晶元 OCRAM 區域讀取出來全是隨機值,而激活了 MECC64 特性的晶元僅 ROM RW 區被初始化了以及 OCRAMx_ECC 不可訪問外,其餘區域全是隨機值(這裡的讀取其實不太可靠,畢竟使能了 ECC 後首次訪問必須是寫,然後才能正常被讀寫)。

  對於激活了 MECC64 特性之後的晶元,無論是設計下載演算法還是 IDE 里的初始化腳本,或者 App 應用里的變數訪問,如果涉及到 ROM RW 區之外的 OCRAM1,OCRAM2 區域,建議一律做先寫後讀處理,否則可能會出現奇怪的錯誤。

  至此,i.MXRT1170 MECC64功能特點及其保護片內OCRAM1,2之道痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下是一個通過 Flask 構建 Web API 服務的詳細示例,包含了各類請求(GET、POST、文件上傳、靜態資源下載)、每個方法獨立配置路由、參數接收和解析、請求日誌記錄以及異常日誌記錄。請確保你已經安裝了 Flask,你可以使用以下命令進行安裝: pip install Flask 接下來是 ...
  • 在C++中,由於該語言本身不提供直接處理Excel文件的標準庫,常常需要藉助第三方類庫。以下是一些在C++中用於處理Excel的熱門開源類庫: SimpleXlsxWriter: 功能: SimpleXlsxWriter是一個輕量級的C++庫,用於生成Microsoft Excel 2007+ xl ...
  • 在日常應用中,當滑鼠放置在某些控制項上時,都會有相應的信息提示,從軟體易用性上來說,這是一個非常友好的功能設計。那在WPF中,如何進行控制項信息提示呢?這就是本文需要介紹的ToolTip【工具提示】內容,本文以一些簡單的小例子,簡述如何在WPF開發中,應用工具提示,僅供學習分享使用,如有不足之處,還請指... ...
  • 問題 Can not create proxy for type xxx because type xxx is not accessible. Make it public, or internal and mark your assembly with [assembly: InternalsV ...
  • 前言: 繼上篇:Taurus .Net Core 微服務開源框架:Admin 插件【4-6】 - 配置管理-Mvc【Plugin-Doc 介面測試及文檔】 本篇繼續介紹下一個內容: 系統配置節點:Mvc - Plugin - Metric 介面調用次數統計: 配置界面如下: 1、Metric.IsE ...
  • 在Winform系統開發中,為了對系統的工具欄/菜單進行動態的控制,我們對系統的工具欄/菜單進行動態配置,這樣可以把系統的功能彈性發揮到極致。通過動態工具欄/菜單的配置方式,我們可以很容易的為系統新增所需的功能,通過許可權分配的方式,可以更有效的管理系統的菜單分配到不同的角色用戶,也就是插件化的處理方... ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170內部RAM的ECC初始化工作可全部由ROM完成。 痞子衡之前寫了三篇文章 《M7 FlexRAM ECC》、《M4 L-MEM ECC》、《MECC64》 分別介紹了 i.MXRT1170 片上 2MB RAM 的不 ...
  • 一.安裝anaconda3 前往清華園鏡像下載anaconda3的安裝包 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D 選擇最新鏡像Anaconda3-2023.09-0-Linux-x86_64.sh 安裝 1 bas ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...