痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(11.0)- FlexSPI NOR啟動時間(RT1170)

来源:https://www.cnblogs.com/henjay724/archive/2020/06/14/13125636.html
-Advertisement-
Play Games

痞子衡剛剛拿到i.MXRT1170 B0版本的晶元,迫不及待地在上面跑了一些A0版本上早已驗證過的demo,功能一切正常,沒有什麼額外遷移工作。因為目前只有B0版本晶元,沒有配套EVK,所以痞子衡是在RT1170內部Validation板上做測試的(RT主晶元以及Flash晶元全部放在Socket里... ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1170 FlexSPI NOR啟動時間

  痞子衡剛剛拿到i.MXRT1170 B0版本的晶元,迫不及待地在上面跑了一些A0版本上早已驗證過的demo,功能一切正常,沒有什麼額外遷移工作。因為目前只有B0版本晶元,沒有配套EVK,所以痞子衡是在RT1170內部Validation板上做測試的(RT主晶元以及Flash晶元全部放在Socket里的,非常方便更換),正好痞子衡最近整理工位,找到了非常多來自不同廠家的串列Flash樣片,何不趁此時順便測一下Serial NOR啟動時間,畢竟Serial NOR是i.MXRT啟動首選設備,啟動時間肯定是大家比較感興趣的。

  關於i.MXRT1170啟動時間,痞子衡之前在A0版本上測過 《SEMC NAND啟動時間》,有了之前的測試基礎,本篇文章就是照葫蘆畫瓢。不過由於Serial NOR的特殊性,本文會同時測XIP和Non-XIP時間,以及兩種典型的Flash工作模式下(四線SDR,八線DDR)的時間,工作量要稍微大一些,讓我們開始吧。

一、準備工作

1.1 知識儲備

  Serial NOR可以說是大家最熟悉的啟動設備了,雖然這個設備可以支持兩類App(XIP和Non-XIP)去啟動,但大家用得最多的無疑是XIP App,因為XIP下App代碼長度可以和Flash容量一樣大,這對於複雜功能的應用很重要,但是編寫XIP App代碼也有一些需要註意的地方,比如在配置系統時鐘(不能影響FlexSPI模塊)或者擦寫Flash時(不支持RWW的話需要拷貝到RAM里執行)有一些限制。

  至於Non-XIP,相比XIP會多一個App拷貝過程,啟動時間難免會變長。拷貝目標設備選擇種類很多,可以是內部RAM(包含TCM和OCRAM),也可以是外部RAM(SDRAM或者HyperRAM)。如果是為了提高代碼執行效率,通常會搬移到內部TCM里執行。當然也有搬移到外部SDRAM執行的,不過這種情況需要額外利用DCD功能來完成SEMC模塊的初始化之後才能做搬移工作。

1.2 時間界定

  關於時間終點,參考《SEMC NAND啟動時間》 里的1.2節,方法保持一致。而關於時間起點,本次的測試選點做了一些優化,測NAND啟動時為了圖方便選在了最靠近POR引腳的電壓轉換器NC7SP125P5X的輸入腳(Pin1)所在的Header上,但是我們知道任何一個被動電源器件都有轉換時間,為了儘可能精確測量啟動時間,我們應該消除這種誤差,因此本次選點放在了NC7SP125P5X的輸出腳(Pin4),這個腳與主晶元POR引腳是直連的。

  為了讓大家對電源器件轉換時間有個深刻感受,痞子衡這次還特地量了一下Validation板上原始電源輸入(5V Jack)到POR引腳上電的時間,這個時間足有210ms,根據電源電路設計以及器件選型的不同,這個時間是不同的,所以應該從啟動時間里拋除出來。

1.3 製作應用程式

  關於應用程式製作,依舊是參考《SEMC NAND啟動時間》 里的1.3節,只有一個微小改進,就是把翻轉GPIO的代碼放在SystemInit()函數最前面,儘可能地靠近Reset_Handler。

void SystemInit (void) {
    {
        CLOCK_EnableClock(kCLOCK_Iomuxc);
        gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
        IOMUXC_SetPinMux(IOMUXC_GPIO_AD_03_GPIO9_IO02, 0U);
        GPIO_PinInit(GPIO9, 2, &led_config);
        GPIO_PinWrite(GPIO9, 2, 1u);
    }

	// 關開門狗和SysTick

    while (1);

    // ...
}

1.4 下載應用程式

  應用程式的下載需藉助痞子衡開發的NXP-MCUBootUtility工具(v2.3版本及以上),本次痞子衡一共測試了兩款Flash,針對不同的Flash,在下載時選擇的模型不一樣:

  下麵模型適用華邦W25Q256系列,配置成了四線、SDR、133MHz工作模式去啟動:

  下麵模型適用旺巨集MX25UM51345系列,配置成了八線、DDR、166MHz工作模式去啟動:

1.5 示波器抓取信號

  一切準備就緒,可以用示波器抓Serial NOR啟動時間了。通道一監測原始5V電源輸入信號,通道二監測晶元POR信號,通道三來監測Flash片選信號(FSPI1A_SS0_B),通道四監測LED GPIO信號。

二、開始測試

2.1 測試結果

  在公佈結果之前,痞子衡先帶大家分析一下示波器抓取的啟動時間波形,方便大家理解後續表格裡的各項組成。

  先來看大家相對陌生的Non-XIP啟動的波形(MX25UM51345G,247KB App)。通道二連接POR引腳,電平拉高是啟動計時的開始,啟動後會先經歷BootROM時間(CM7內核先執行ROM代碼,做一些常規系統初始化,讀取用戶啟動配置,然後配置好FlexSPI模塊),底下再經歷BootFlash時間(還是在ROM里執行,不過此時開始訪問外部Flash,從Flash里讀取FDCB、IVT、BootData以及搬移App,所以你會看到通道三(Flash的片選信號)上會有持續的波形變化,搬移完成之後便跳轉到App里執行),最後你會看到通道四電平拉高了(App在執行)。

  作為比較,再來看一下XIP啟動的波形(MX25UM51345G,246KB App)。BootROM時間跟Non-XIP基本差不多,這是可以理解的,同樣的ROM代碼在執行,消耗的機器周期是不變的。BootFlash的時間明顯縮短了,Flash片選的波形只有屈指可數的幾次,這是因為ROM此時只需要讀取FDCB、IVT、BootData,根據IVT里的鏈接地址信息得知App不需要搬移就直接跳轉了。

  分析完了啟動時間組成,讓我們看結果吧。痞子衡基於Flash工作模式、App長度、App執行地址的組合一共做了8個測試,結果如下表所示(註:表中結果都是在1.25M次/秒的採樣率下所得):

Flash型號
Timing模式
App長度
(bytes)
App執行位置 BootROM時間 BootFlash時間 總啟動時間
W25Q256J
4bit, SDR, 133MHz
16390 XIP 6.926 ms 1.611 ms 8.537 ms
17922 ITCM 6.939 ms 2.203 ms 9.142 ms
251910 XIP 6.920 ms 1.612 ms 8.532 ms
253442 ITCM 6.953 ms 8.795 ms 15.748 ms
MX25UM51345G
8bit, DDR, 166MHz
16390 XIP 6.942 ms 1.618 ms 8.560 ms
17922 ITCM 6.944 ms 2.312 ms 9.256 ms
251910 XIP 6.916 ms 1.647 ms 8.563 ms
253442 ITCM 6.935 ms 8.897 ms 15.832 ms

2.2 結果分析

  從上面表格裡的結果我們可以得到如下三個結論:

  • 結論1:不管是哪種Flash連接,BootROM時間差不多是固定的,大概在6.9ms
  • 結論2:XIP啟動的情況下,BootFlash時間幾乎也是固定的,跟App長度無關,大概在1.6ms
  • 結論3:Non-XIP啟動的情況下,BootFlash時間跟App長度成正比,但是跟Flash工作模式(速度)不是正比(甚至可以說關係不太大)

  關於結論3里的BootFlash時間跟Flash工作模式(速度)不是正比這點有必要展開研究一下。痞子衡的測試結果是ROM從Flash拷貝247KB數據到ITCM,無論是從QSPI Flash拷貝還是從Octal Flash拷貝所花時間竟然幾乎是一致的,這個看起來挺奇怪的,畢竟僅從Flash自身讀訪問速度而言,Octal Flash應該是QSPI Flash的五倍(8bit x 2 x 166MHz) / (4bit x 1 x 133MHz)。

  為瞭解開謎題,痞子衡對時序圖裡CS信號做了進一步分析,下圖是QSPI Flash的啟動時序圖,ROM拷貝247KB的數據耗時約7.833ms,每個CS周期是114.4us,扣除時序前期的空閑時間以及讀Boot Header,拷貝App期間共有62個CS周期,那麼每個CS周期實際拷貝了4KB數據,這代表ROM配置了FlexSPI prefetch buffer的長度為4KB(RT1170最大是4KB,RT1060最大是1KB)並且使能了Prefetch功能。從QSPI Flash本身速度理論計算,讀4KB數據應該耗時 4KB / (4bit x 133MHz) = 61.59us,這與實際測量的CS信號的低電平時間是吻合的。再來看CS信號周期的高電平(idle)時間足有52.8us,為什麼會有這麼長的空閑時間?疑問先放在這裡。

  同樣的方法再來分析一下Octal Flash的啟動時序圖。從Octal Flash本身速度理論計算,讀4KB數據應該耗時 4KB / (8bit x 2 x 166MHz) = 12.33us,這與實際測量的CS信號的低電平時間依然是吻合的。結合上面分析的QSPI Flash CS低有效時間來看,兩者確實是五倍的關係。但是此時的CS信號周期的高電平時間比QSPI Flash下的時間要更長,達到了100.47us,最終導致兩種不同性能Flash下拷貝時間差不多。

  分析到這裡,我們已經找到了線索,ROM從Flash prefetch buffer里拷貝4KB數據到TCM固定耗時約112us,因此速度瓶頸不在Flash本身讀速率,而在於搬移時的開銷,那麼是什麼導致了這個固定開銷?

  因為ROM代碼是個黑盒子,我們看不見,痞子衡為了找到這個系統開銷,在Octal Flash Non-XIP啟動的App里用memcpy做了同樣的數據搬移。根據上面表格裡的結果,我們知道ROM里搬移230KB數據需耗時6.576ms,經測試App里搬移230KB數據僅需3.265ms,ROM和App的區別主要是執行效率不一樣(ROM預設配置的CPU主頻是400MHz(註:最高可以配到696MHz),App配置的CPU主頻是996MHz),所以CPU主頻是影響固定開銷的因素。

    memcpy((void *)0x6000, (const void *)0x30002000, 230 * 1024);

  因為Non-XIP App沒有為FlexSPI映射地址開啟cache,痞子衡特地開了cache再次做了測試,這次拷貝230KB數據僅需724us,這個值幾乎已經逼近了理論計算值(230KB/4KB) x 12.33us = 708.9us,所以ROM是在沒有使能cache下做的數據搬移,Cache是否使能也是影響固定開銷的因素。

//#if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
    /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back. */
    MPU->RBAR = ARM_MPU_RBAR(7, 0x30000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);
//#endif

  這個發現也告訴我們使用memcpy()函數搬移Flash數據,是否使能cache對執行效率影響非常大。使能cache之後,做數據搬移時,CPU往TCM寫數據與cache從Flash里預取數據可以更大程式的並行,並且cache的讀都是burst操作,能加速搬移。而如果不使能cache,下一次的Flash讀需要等待上一次CPU寫完TCM才會開始,搬移時間會長。

  至此,恩智浦i.MX RT1170 FlexSPI NOR啟動時間痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 在開發UIBarChart的過程中,需要繪製Y軸的刻度,數據作圖時,縱橫坐標軸刻度範圍及刻度值的取法,很大程度上取決於數據的分佈。對某一組數據,我們很容易就能知道如何選取這些值才能使圖畫得漂亮。但是要想找到一個通用的演算法,用以對任意分佈的數據決定這些值,並不是一件容易的事 ...
  • ExceptionFilter 主要是為了捕捉系統異常。通常我們會繼承 ExceptionFilterAttribute ,實現自定義系統異常捕捉。 版本:.Net Core 3.1 一、基本創建過程 新建 .Net Core Mvc 並新建控制器 ExceptionFilterController ...
  • 我們來創建動態菜單吧 首先,先對動態菜單的概念、操作、流程進行約束:1.Host和各個Tenant有自己的自定義菜單2.Host和各個Tenant的許可權與自定義菜單相關聯2.Tenant有一套預設的菜單,規定對應的TenantId=-1,在添加租戶時自動將標準菜單和標準菜單的許可權初始化到添加的租戶 ...
  • 直接上代碼 1 public static class ImageCompress 2 { 3 /// <summary> 4 /// 圖片壓縮 5 /// </summary> 6 /// <param name="imagePath">圖片文件路徑</param> 7 /// <param na ...
  • 看了看原生UWP的ScrollViewer,滑動很流暢(例如 開始菜單),但是WPF自帶的ScrollViewer滾動十分生硬.. 突發奇想,今天來實現一個流暢滾動的ScrollViewer. 一、目標 查閱網上的實現方法,要麼直接重寫控制項,要麼一堆Storyboard..很是無奈,還有些許bug. ...
  • 無論是開發app還是網站,可能都需要一個廣告功能,比如我們常見的在首頁有個輪播廣告,裡面會輪播顯示多個圖片。還有比如一個新聞門戶網站 很常見的 banner橫幅廣告,還有js特效廣告等。本篇說說在abp(5.9)中如何實現廣告模塊。 源碼地址:https://gitee.com/bxjg1987/a ...
  • 一:背景 1. 講故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客園和公號里的閱讀量都達到了新高,甚是欣慰,不管大家對新特性是多頭還是空頭,起碼還是對它抱有一種極為關註的態度,所以我的這個系列還得跟,那就繼續開擼吧,今天繼續帶來 ...
  • 系列文章 基於 abp vNext 和 .NET Core 開發博客項目 - 使用 abp cli 搭建項目 基於 abp vNext 和 .NET Core 開發博客項目 - 給項目瘦身,讓它跑起來 基於 abp vNext 和 .NET Core 開發博客項目 - 完善與美化,Swagger登場 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...