Multi Source Translation Content

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Multi Source Translation Content

Discussions

Sort by:
S32DSコマンドラインを使用してTCPIPスタックのサンプルをインポート、コードを更新、クリーンビルドする方法 拝啓、 S32DSコマンドラインを使用して、コードのインポート、更新、およびクリーンビルドを実行したい。 RTD のサンプル (Dio_Example_S32K388) は正常に実行できますが、lwip_FreeRTOS_s32k388 のようなスタック内のサンプルは失敗します。 確認を手伝っていただけますか?あるいは、その方法を教えていただけますか? 以下に示すように、S32K388とS32K344のいくつかの例をテストしました。 現在はlwip_FreeRTOS_s32k388のみが失敗しています。 lwip_FreeRTOS_s32k344 は問題ありません。 FreeRTOS_Toggle_Led_Example_S32K388 と FreeRTOS_Toggle_Led_Example_S32K344 は問題ありません。 Dio_Example_S32K388とUart_Example_S32K388は問題ありません。   そして、私の顧客は現在lwip_FreeRTOS_s32k388を使用しているので、この問題を解決する必要があります。   テスト環境: S32DS3.6.3 RTD : S32K3_S32M27x リアルタイム・ドライバ ASR R21-11 バージョン 6.0.0 QLP04 FREERTOS: SW32K3 FreeRTOS 11.1.0バージョン6.0.0 コードドロップ TCPIP スタック: SW32K3_S32M27X_TCPIP_STACK_3.0.0_D2507 ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 以前そのThreadを読んで、そこに書かれていたコマンドを試してみました。しかし、それでも失敗した。 -HeadlessToolが必要です。そうでない場合、S32DS GUIウィンドウがポップアップ表示されてしまいますが、これはお客様のご要望とは異なります。 lwip_FreeRTOS_s32k344 は私のコマンドで動作しました。 ご提案いただいたコマンドを使用して、lwip_FreeRTOS_s32k388 を試していただけますでしょうか? 私の顧客はlwip_FreeRTOS_s32k388を使用しているため、この問題を解決する必要があります。   ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 この関連Threadに基づくと: CLIでの設定の読み込みとビルドに失敗しました プロジェクトに合わせて、以下の手順を実行する必要があります(プロジェクトによっては、アップデートが必要になる場合があります)。 -Load %PROJECT_PATH% \ %PROJECT_NAME% .mexで mex をロードします この行は「コードの更新」とは同等ではありません。-HeadlessTool ペリフェラル を削除してください。 -MCU S32K388で MCU を明示的に設定します -SDKVersion PlatformSDK_S32K3 を使用してください。 「コードの更新をクリック」 -ExportAll %PROJECT_PATH% あるいは、デバッグ情報を追加して、-consoleLog オプションで何が起こっているかを確認してください。 つまり、「更新コード」は次のようになります。 .\s32dsc.exe -noSplash ^ -アプリケーション com.nxp.swtools.framework.application ^ --launcher.ini %DS_INSTALL% \eclipse\s32ds.ini ^ -データ%WORKSPACE% ^ -sdkPath %RTD_PATH% ^ -MCU S32K388 ^ -SDKVersion PlatformSDK_S32K3 ^ -Load %PROJECT_PATH% \ %PROJECT_NAME% .mex^ -ExportAll %PROJECT_PATH% サンプルコードlwip_FreeRTOS_s32k344は、デフォルト設定が原因で偶然にしか動作しない場合があります。 よろしくお願いいたします。 パベル Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 「 tcpip_stack_1」を確認し、tcpip_itm_manifest.xmlに「S32K388」を追加します。 S32DSは「コードの更新」後にフォルダを生成できますが、コマンドラインでは生成できません。 ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 mexファイルをダブルクリックしてください。「ペリフェラル」アイコンをクリックしてください。これが見えますか? tcpip_stack が表示されず、SDK コンポーネント管理ウィンドウでもスタックが表示されない場合は、このThreadS32K388 tcpip stack 4.0.0 missing lwip folder while compiling で議論されているように、tcpip_itm_manifest.xml を修正してみてください。 よろしくお願いいたします。 パベル Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 コマンドライン(添付ファイル参照)を使用してlwip_FreeRTOS_s32k388の「コードを更新」しましたが、以下のように「FreeRTOS」 、 「RTD」 、 「stacks」フォルダとフォルダ内のファイルが生成されません(画像はS32DSを使用した「コードの更新」です)。 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 インストール設定は正しいようです。 「失敗した」とはどういう意味ですか?ビルドエラーか、TCP/IP機能の問題でしょうか? 私の例であるExample S32K388 GMAC0 lwIP FreeRTOS S32DS 3.6.1 RTD600をご確認ください。変更点の一覧も記載しています。 よろしくお願いいたします。 パベル
View full article
RT1170 EVKB M4 メモリ速度 RT1170 EVKB上でM4コアのメモリアクセスに関するベンチマークテストを実施しています。これらの数値は、M4がボード上のSDRAMとOCRAMにアクセスする際に想定される値ですか?非常に動作が遅いようです。 M4のアクセス時間がAxiファブリックなどの関係で長くなるという情報をいくつか読みましたが、これは非常に遅いように思えます。設定のどこかに何か見落としがあって、必要以上に動作が遅くなっているのでしょうか? このベンチマークにはいくつかの異なるメモリソース/デスティネーションが含まれていますが、私が最も改善したいのはSDRAMとOCRAM間のEDMAです。私は、SDRAM非キャッシュからOCRAM非キャッシュへのM4セットのEDMA転送を行うマルチトラックオーディオストリーミングエンジンを実装しています。M7コアは、共有ocramからバッファを消費します。 しかし、このテストは独立して実施されるため、仲裁は発生しないか、ごくわずかしか発生しないはずです。 SDRAMとOCRAM領域は両方ともキャッシュ不可に設定されており、OCRAM領域はMPUConfigで共有可能にも設定されている、という理解で合っていますか? オーディオストリーマーのコピーベンチマーク、Cortex-M4 @ 400 MHz 操作: 再生 16 x 4096 B SDRAM_NC->OCRAM、記録 8 x 4096 B OCRAM->SDRAM_NC バイト数: 再生=65536 記録=32768 合計=98304   CPU memcpy: 再生コピー              1532202 cyc 3830.505 us レコードコピー                  530291 cyc 1325.727 us 散布図合計                2062493 cyc 5156.232 us シングル96Kバルク              2301811 cyc 5754.527 us チェックサム=239   メモリ領域コピーマトリックス(1行あたり32768バイト): リージョン src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/キャッシュ: CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d EDMAは、両方のエンドポイントがキャッシュ不可/DMAセーフの場合にのみ実行されます。 SDRAM_C->OCRAM_CACHE        バイト数=32768、CPU=1201410、サイクル数=3003.525、US=10.90 MB/秒 | edma=スキップ、キャッシュ可能、チェックサム=338 SDRAM_NC->OCRAM_CACHE        バイト数=32768、CPU=1037590、サイクル数2593.975、US値12.63 MB/秒 | edma=スキップ、キャッシュ可能、チェックサム=602 SDRAM_NC->SHARED_OCRAM      バイト=32768 CPU=  781109 cyc 1952.772 us 16.78 MB/s | edma=ok  779805 cyc 1949.512 us 16.80 MB/s checksum=602/602 | edma+cache=ok  858144 cyc 2145.360 us 15.27 MB/s チェックサム=602 SDRAM_NC->NCACHE_OCRAM      バイト=32768 CPU=  777897 cyc 1944.742 us 16.84 MB/s | edma=ok  751101 cyc 1877.752 us 17.45 MB/s checksum=602/602 | edma+cache=ok  853273 cyc 2133.182 us 15.36 MB/s チェックサム=602 OCRAM_CACHE->SDRAM_NC        バイト=32768 CPU=  750396 cyc 1875.990 us 17.46 MB/s | edma=キャッシュ可能チェックサムをスキップ=1204 SHARED_OCRAM->SDRAM_NC      バイト=32768 CPU=  531143 cyc 1327.857 us 24.67 MB/s | edma=ok  570792 cyc 1426.980 us 22.96 MB/s checksum=610/610 | edma+cache=ok  670564 サイクル 1676.410 us 19.54 MB/秒 チェックサム=610 NCACHE_OCRAM->SDRAM_NC      バイト=32768 CPU=  541568 cyc 1353.920 us 24.20 MB/s | edma=ok  549911 cyc 1374.777 us 23.83 MB/s checksum=940/940 | edma+cache=ok  649852 サイクル 1624.630 us 20.16 MB/秒 チェックサム=940 SDRAM_NC->SDRAM_NC          バイト=32768 CPU=  896656 cyc 2241.640 us 14.61 MB/s | edma=ok  997686 cyc 2494.215 us 13.13 MB/s checksum=602/602 | edma+cache=ok  1130798 サイクル 2826.995 us 11.59 MB/秒 チェックサム=602 OCRAM_CACHE->OCRAM_CACHE    バイト=32768 CPU=  768904 cyc 1922.260 us 17.04 MB/s | edma=スキップ キャッシュ可能 チェックサム=1204 SHARED_OCRAM->SHARED_OCRAM  バイト=32768 CPU=  425929 cyc 1064.822 us 30.77 MB/s | edma=ok  433498 cyc 1083.745 us 30.23 MB/s checksum=610/610 | edma+cache=ok  542913 cyc 1357.282 us 24.14 MB/s チェックサム=610   EDMAスキャッター/ギャザー 24 x 4K、Nバイト=4096: ops=24 nbytes=4096 ok=1 ディスクリプタの設定+開始          58942 サイクル 147.355 米ドル 完了するまで待機/エラー        2031292 cyc 5078.230 us 合計                        2090234 cyc 5225.585 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=1 ビット元=1   EDMAスキャッター/ギャザー 24 x 4K、Nバイト=32: ops=24 nbytes=32 ok=1 ディスクリプタの設定+開始          47526サイクル 118.815米ドル 完了するまで待機/エラー        2055017 cyc 5137.542 us 合計                        2102543 cyc 5256.357 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残り=0 csr=0x0088 引用=128 ビット=128   EDMAシングル4K、NBYTES=4096: ops=1 nbytes=4096 ok=1 ディスクリプタの設定+開始          5713サイクル 14.282米国 完了するまで待機/エラー          93592 cyc 233.980 us 合計                          99305 cyc 248.262 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=1 ビット元=1   EDMAシングル4K、NBYTES=32: ops=1 nbytes=32 ok=1 ディスクリプタの設定+開始          5344サイクル 13.360米ドル 完了するまで待機/エラー          94609 cyc 236.522 us 合計                          99953 cyc 249.882 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残り=0 csr=0x0088 引用=128 ビット=128   EDMAシングル96K、NBYTES=4096: ops=1 nbytes=4096 ok=1 ディスクリプタの設定+開始          5867サイクル 14.667米ドル 完了するまで待機/エラー        2230360 cyc 5575.900 us 合計                        2236227 cyc 5590.567 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=24 ビット数=24   EDMAシングル96K、NBYTES=32: ops=1 nbytes=32 ok=1 ディスクリプタの設定+開始          5713サイクル 14.282米国 完了するまで待機/エラー        2256234 cyc 5640.585 us 合計                        2261947 cyc 5654.867 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=3072 ビット元=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ 私のリンカー: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * ITCM/DTCMホットセクションとSDRAMを備えたM4 XIP-from-FlexSPI * OCRAMパーティション(1MB @ 0x2024_0000): * - 128KB DMAセーフ / デバイス/非キャッシュ : 0x20240000..0x2025FFFF * - 128KB M4 キャッシュ可能なローカルスクラッチ: 0x20260000..0x2027FFFF * - 768KB 共有 (M4<->M7) 非キャッシュ : 0x20280000..0x2033FFFF * - SHARED の最後の 8KB は M7 専用に予約されています: 0x2033E000..0x2033FFFF (M4 リンカー領域には含まれません) * * 追加の固定カーブアウト(両方で共有される領域内、M7 DMA スライスの前): * - M4 用の 36KB 固定共有 SysView/RTT ウィンドウ : 0x20335000..0x2033DFFF * - 共有メイン(IPCなど用):0x20280000..0x20334FFF */ エントリ(リセットハンドラー) HEAP_SIZE = DEFINED(__heap_size __) ? __ heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size __) ? __ stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB キャッシュ可能 */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ SDRAM_NC_SIZE = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* ローカルOCRAM合計 = DMA 128KB + キャッシュ可能なスクラッチ 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMAセーフな非キャッシュローカルウィンドウ(最初の128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 キャッシュ可能なスクラッチウィンドウ (次の 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* 共有OCRAMは0x20280000から開始します(残り768KB)*/ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* 共有OCRAMの最後の8KBをM7専用のDMAバッファ用に予約します(M4領域は除外します) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* 共有領域(36KB)の末尾にあるM4用のSysView/RTTの切り出しを修正しました*/ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* 共有メインサイズ(固定36KBウィンドウを除くすべて) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 ベース (修正済み) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ メモリ { m_interrupts (RX) : ORIGIN = M4_FLASH_BASE、LENGTH = 0x00000400 m_text (RX) : ORIGIN = M4_FLASH_BASE + 0x400、LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) : ORIGIN = 0x1FFE0000、LENGTH = 0x00020000 m_dtcm (RW) : ORIGIN = 0x20000000、LENGTH = 0x00020000 /* OCRAMパーティション */ m_ncache_local (RW) : ORIGIN = OCRAM_DMA_NC_BASE、LENGTH = OCRAM_DMA_NC_SIZE m_ocram_cache (RW) : ORIGIN = OCRAM_LOCAL_C_BASE、LENGTH = OCRAM_LOCAL_C_SIZE m_shared_ocram_main (RW) : ORIGIN = OCRAM_SHARED_BASE、LENGTH = OCRAM_SHARED_MAIN_SIZE m_shared_sysview_m4 (RW) : ORIGIN = OCRAM_SYSVIEW_M4_BASE、LENGTH = OCRAM_SYSVIEW_M4_SIZE m_sdram_c (RW) : ORIGIN = SDRAM_BASE、LENGTH = SDRAM_C_SIZE m_sdram_nc (RW) : ORIGIN = SDRAM_NC_BASE、LENGTH = SDRAM_NC_SIZE } セクション { __NCACHE_REGION_START = OCRAM_BASE; __NCACHE_REGION_SIZE = OCRAM_SIZE; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __SHARED_OCRAM_START__ = .; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __SHARED_OCRAM_END__ = .; ASSERT((__SHARED_OCRAM_END __ - __ SHARED_OCRAM_START__) <= LENGTH(m_shared_ocram_main), 「shared_ocramセクションが大きすぎます」 } > m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __SYSVIEW_M4_START__ = .; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __SYSVIEW_M4_END__ = .; ASSERT((__SYSVIEW_M4_END __ - __ SYSVIEW_M4_START__) <= LENGTH(m_shared_sysview_m4), 「shared_sysview_m4 セクションが大きすぎます (最大 36KB)」 } > m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __OCRAM_CACHE_START__ = .; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __OCRAM_CACHE_END__ = .; ASSERT((__OCRAM_CACHE_END __ - __ OCRAM_CACHE_START__) <= LENGTH(m_ocram_cache), 「ocram_cache セクションが大きすぎます」 } > m_ocram_cache .割り込み: { __VECTOR_TABLE = .; __ベクトル = .; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > m_interrupts /* ================================================================ * ITCM のホット コード (VMA=ITCM、LMA は後で計算されます) * ======================================================================= */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = .; *(.itcm_text*) *(ITCM_TEXT*) /* あなたのホットなTU */ */DspParameterManager.cpp.obj(.text。文章。*) */audio_param_task.cpp.obj(.text。文章。*) */StepSequencer.cpp.obj(.text。文章。*) */sequencer_task.cpp.obj(.text。文章。*) /* MU ISR(複数ユニット割り込みサービスルーチン) - シンボルセクション名別 */ *(.text.MUB_IRQHandler) /* FreeRTOS のホットビット - シンボルセクション名別 */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = .; } > m_itcm /* ================================================================ * DTCMにおけるホットロードデータ(LMAは後日計算) * ======================================================================= */ .dtcm_rodata : AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = .; */DspParameterManager.cpp.obj(.rodata.rodata.*) */audio_param_task.cpp.obj(.rodata.rodata.*) */StepSequencer.cpp.obj(.rodata.rodata.*) */sequencer_task.cpp.obj(.rodata.rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = .; } > m_dtcm /* ================================================================ * DTCMにおけるホットデータ(LMAは後日算出) * ======================================================================= */ .dtcm_data : AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = .; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = .; } > m_dtcm /* ================================================================ * FLASH XIP TEXT/RODATA (すべて) * ======================================================================= */ 。文章 : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); } > m_text .ARM.extab : { *(.ARM.extab*.gnu.linkonce.armextab.*)} > m_text Arm : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } > m_text .ctors : { __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o).ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; } > m_text .dtors : { __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o).dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __DTOR_END__ = .; } > m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } > m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } > m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } > m_text /* ================================================================ * 重大な修正: * 上記のすべての flash-resident セクションの後に load-images を開始してください。 * この時点で、「.」はFlashコンテンツの本当の終わりです。 * ======================================================================= */ __DATA_ROM = .; __itcm_text_load __ = __ DATA_ROM; __dtcm_rodata_load __ = __ itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load __ = __ dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* NXP の起動時に .data が期待されますLMA at __etext */ __etext = __ dtcm_data_load__ + SIZEOF(.dtcm_data); .data : AT(__etext) { . = ALIGN(4); __DATA_RAM = .; __data_start__ = .; *(。データ) *(。データ*) *(データクイックアクセス) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = .; } > m_dtcm __NDATA_ROM = __etext + (__データ終了__ - __データ開始__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = .; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = .; } > m_ncache_local .ncache (NOLOAD) : { (キャッシュ不可) . = ALIGN(4); __noncachedata_end__ = .; } > m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss) *(.bss*) *(一般) . = ALIGN(4); __bss_end__ = .; } > m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = .; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = .; } > m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end __ - __ noncachedata_start__); .sdram_c_data : AT(__SDRAM_C_DATA_ROM) { . = ALIGN(32); __sdram_c_data_start__ = .; *(.sdram_c_data*) *(SDRAM_C_DATA*) . = ALIGN(32); __sdram_c_data_end__ = .; } > m_sdram_c __sdram_c_data_load __ = __ SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = .; *(.sdram_c_bss*) *(SDRAM_C_BSS*) . = ALIGN(32); __sdram_c_bss_end__ = .; } > m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = .; *(.sdram_nc_bss*) *(SDRAM_NC_BSS*) . = ALIGN(32); __sdram_nc_bss_end__ = .; } > m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = .; . += HEAP_SIZE; __HeapLimit = .; __heap_limit = .; } > m_dtcm .stack : { . = ALIGN(8); . += STACK_SIZE; __StackEnd = .; } > m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __ StackTop - STACK_SIZE; PROVIDE( __stack = __ StackTop); .ARM.attributes 0 : { *(.ARM.attributes)} __SDRAM_BASE = SDRAM_BASE; __SDRAM_SIZE = SDRAM_SIZE; __SDRAM_C_BASE = SDRAM_BASE; __SDRAM_C_SIZE = SDRAM_C_SIZE; __SDRAM_NC_BASE = SDRAM_NC_BASE; __SDRAM_NC_SIZE = SDRAM_NC_SIZE; } MPU設定: /* -------------------------------------------------------------------------- */ /* CM7 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU ( void ) { #if defined ( __ICCARM__ ) || defined ( __GNUC__ ) extern uint32_t __NCACHE_REGION_START [] ; extern uint32_t __NCACHE_REGION_SIZE [] ; uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START; uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE; #それ以外 uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif ( void )nonCacheStart; ( void )size; #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR )) { SCB_DisableICache (); } #endif #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR )) { SCB_DisableDCache (); } #endif ARM_MPU_Disable (); /* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB); /* リージョン 1: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 2: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 3: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB); /* リージョン 4: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* リージョン 5: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */ /* 領域 6: 0x20240000..0x2027FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); /* 領域 7: 0x20280000..0x202FFFFF (512KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB); /* 領域 10: 0x20300000..0x2033FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */ MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB); #それ以外 /* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 ) /* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */ MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB); #endif /* ペリフェラル ウィンドウ */ MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB); MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB); MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache (); #endif #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache (); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU ( void ) { /* ---- コードバスキャッシュ (LMEM) を無効にする ---- */ if ( LMEM_PCCCR_ENCACHE_MASK == ( LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR )) { LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK ; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {} LMEM -> PCCCR &= ~ ( LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK ); LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK ; } /* ---- システムバスキャッシュ (LMEM) を無効にする ---- */ if ( LMEM_PSCCR_ENCACHE_MASK == ( LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR )) { LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK ; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {} LMEM -> PSCCR &= ~ ( LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK ); LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK ; } ARM_MPU_Disable (); /* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> デバイス/非キャッシュ。 * 元の属性はここに保持します: UART/SPI/SD DMA バッファはここに存在します * ウィンドウがあり、CM4 LMEM で実証済みの非キャッシュ動作が必要です。*/ MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /*共有推奨*/ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_128KB ); /* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* バッファリング可能 (WB) */ 0 、 ARM_MPU_REGION_SIZE_128KB ); /* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 元の非キャッシュ属性 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_512KB ); /* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 元の非キャッシュ属性 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_256KB ); #if USE_SDRAM /* リンカー分割: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * MPUは56MBを直接表現できないため、領域4で64MB全体を構成する。 * SDRAM ウィンドウ デバイス/非キャッシュおよび領域 5 は最初の 8MB をオーバーレイします * キャッシュ可能。番号の大きいMPU領域が優先されます。*/ ( void ) SDRAM_NC_BASE ; ( void ) SDRAM_NC_SIZE ; /* 領域 4: フル SDRAM デフォルト、0x80000000..0x83FFFFFF -> デバイス/非キャッシュ */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , SDRAM_BASE_EXPECTED ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 2 、 /* デバイス */ 0 、 /* 共有不可 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_64MB ); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトスルー */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 0 、 /* ライトスルー */ 0 、 ARM_MPU_REGION_SIZE_8MB); #それ以外 /* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトバック */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* ライトバック */ 0 、 ARM_MPU_REGION_SIZE_8MB ); #endif #endif /* USE_SDRAM */ ARM_MPU_Enable ( MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk ); /* システムバスキャッシュ (PSCCR) を無効化および有効化します */ LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK ; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {} LMEM -> PSCCR &= ~ ( LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK ); LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK ; /* コードバスキャッシュ(PCCCR)を無効化および有効化する */ LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK ; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {} LMEM -> PCCCR &= ~ ( LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK ); LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK ; } #endif /* __CORTEX_M == 4 */ 私も同様の結果で試してみましたが、キャッシュ不可能なOCRAMからキャッシュ不可能なSDRAMへDMAを使用して書き込む際に、チェックサムの不一致が発生しました。 #if __CORTEX_M == 7 void BOARD_ConfigMPU ( void ) { #if defined ( __ICCARM__ ) || defined ( __GNUC__ ) extern uint32_t __NCACHE_REGION_START [] ; extern uint32_t __NCACHE_REGION_SIZE [] ; uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START; uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE; #それ以外 uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif ( void )nonCacheStart; ( void )size; #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR )) { SCB_DisableICache (); } #endif #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR )) { SCB_DisableDCache (); } #endif ARM_MPU_Disable (); /* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB); /* リージョン 1: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 2: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 3: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB); /* リージョン 4: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* リージョン 5: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */ /* 領域 6: 0x20240000..0x2027FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); /* 領域 7: 0x20280000..0x202FFFFF (512KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB); /* 領域 10: 0x20300000..0x2033FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */ MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB); #それ以外 /* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 ) /* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */ MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB); #endif /* ペリフェラル ウィンドウ */ MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB); MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB); MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache (); #endif #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache (); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU ( void ) { /* ---- コードバスキャッシュ (LMEM) を無効にする ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR )) { LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {} LMEM -> PCCCR &= ~ (LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK; } /* ---- システムバスキャッシュ (LMEM) を無効にする ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR )) { LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {} LMEM -> PSCCR &= ~ (LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable (); /* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 通常のキャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /*共有推奨*/ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_128KB); /* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* バッファリング可能 (WB) */ 0 、 ARM_MPU_REGION_SIZE_128KB); /* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 通常 (共有可能) */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_512KB); /* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 通常 (共有可能) */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_256KB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* システムバスキャッシュ (PSCCR) を無効化および有効化します */ LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {} LMEM -> PSCCR &= ~ (LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* コードバスキャッシュ(PCCCR)を無効化および有効化する */ LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {} LMEM -> PCCCR &= ~ (LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ 評価ボード Re: RT1170 EVKB M4 memory speed こんにちは、 @cyberhelmer さん。 NXP MIMXRTシリーズにご関心をお寄せいただきありがとうございます! NXPはRT1050に基づいたテスト結果を提供した。このアプリケーションノートと関連ソフトウェアは、以下のリンクからご覧いただけます。https: //www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 簡単な比較を行ったところ、SDRAM書き込みテスト中にANSWは以下の設定を使用していることがわかりました。通常のメモリ特性、純粋な32ビットシーケンシャル書き込み、書き込み後のDSB。 該当する実験を実施する際には、このANSWを参照することをお勧めします。 よろしくお願いします、 ギャビン
View full article
RT1170 EVKB M4 memory speed I'm doing some benchmarks for M4 core memory access on the RT1170 evkb. Are these numbers expected when the M4 accesses sdram and ocram on the board? It seems extremely slow.  I have read some information on longer access times for M4 because of the axi fabric etc but this seem very slow. Have I missed something in my configs somewhere making it slower than neccesary?  The benchmark includes a few different memory sources/destinations but what I'm most interested in improving is edma between sdram and ocram. I'm implementing a multi track audio streaming engine where M4 sets of edma transfers from sdram non cacheable to ocram non cacheable. The M7 core then consumes buffers from shared ocram.  But the test is run freestanding and there should be none or very little arbitration happeningen.  Both sdram and the ocram regions are set non cacheable, ocram region is also set sharable in MPUConfig, if I'm not misstaken?  Audio streamer copy benchmark, Cortex-M4 @ 400 MHz ops: playback 16 x 4096 B SDRAM_NC->OCRAM, record 8 x 4096 B OCRAM->SDRAM_NC bytes: playback=65536 record=32768 total=98304   CPU memcpy: playback copies               1532202 cyc 3830.505 us record copies                  530291 cyc 1325.727 us scatter total                 2062493 cyc 5156.232 us single 96K bulk               2301811 cyc 5754.527 us checksum=239   Memory region copy matrix (32768 B per row): regions src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/cache: CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d EDMA is only run when both endpoints are non-cacheable/DMA-safe. SDRAM_C->OCRAM_CACHE         bytes=32768 cpu= 1201410 cyc 3003.525 us 10.90 MB/s | edma=skip cacheable checksum=338 SDRAM_NC->OCRAM_CACHE        bytes=32768 cpu= 1037590 cyc 2593.975 us 12.63 MB/s | edma=skip cacheable checksum=602 SDRAM_NC->SHARED_OCRAM       bytes=32768 cpu=  781109 cyc 1952.772 us 16.78 MB/s | edma=ok   779805 cyc 1949.512 us 16.80 MB/s checksum=602/602 | edma+cache=ok   858144 cyc 2145.360 us 15.27 MB/s checksum=602 SDRAM_NC->NCACHE_OCRAM       bytes=32768 cpu=  777897 cyc 1944.742 us 16.84 MB/s | edma=ok   751101 cyc 1877.752 us 17.45 MB/s checksum=602/602 | edma+cache=ok   853273 cyc 2133.182 us 15.36 MB/s checksum=602 OCRAM_CACHE->SDRAM_NC        bytes=32768 cpu=  750396 cyc 1875.990 us 17.46 MB/s | edma=skip cacheable checksum=1204 SHARED_OCRAM->SDRAM_NC       bytes=32768 cpu=  531143 cyc 1327.857 us 24.67 MB/s | edma=ok   570792 cyc 1426.980 us 22.96 MB/s checksum=610/610 | edma+cache=ok   670564 cyc 1676.410 us 19.54 MB/s checksum=610 NCACHE_OCRAM->SDRAM_NC       bytes=32768 cpu=  541568 cyc 1353.920 us 24.20 MB/s | edma=ok   549911 cyc 1374.777 us 23.83 MB/s checksum=940/940 | edma+cache=ok   649852 cyc 1624.630 us 20.16 MB/s checksum=940 SDRAM_NC->SDRAM_NC           bytes=32768 cpu=  896656 cyc 2241.640 us 14.61 MB/s | edma=ok   997686 cyc 2494.215 us 13.13 MB/s checksum=602/602 | edma+cache=ok  1130798 cyc 2826.995 us 11.59 MB/s checksum=602 OCRAM_CACHE->OCRAM_CACHE     bytes=32768 cpu=  768904 cyc 1922.260 us 17.04 MB/s | edma=skip cacheable checksum=1204 SHARED_OCRAM->SHARED_OCRAM   bytes=32768 cpu=  425929 cyc 1064.822 us 30.77 MB/s | edma=ok   433498 cyc 1083.745 us 30.23 MB/s checksum=610/610 | edma+cache=ok   542913 cyc 1357.282 us 24.14 MB/s checksum=610   EDMA scatter/gather 24 x 4K, NBYTES=4096: ops=24 nbytes=4096 ok=1 descriptor setup+start          58942 cyc 147.355 us wait until done/error         2031292 cyc 5078.230 us total                         2090234 cyc 5225.585 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA scatter/gather 24 x 4K, NBYTES=32: ops=24 nbytes=32 ok=1 descriptor setup+start          47526 cyc 118.815 us wait until done/error         2055017 cyc 5137.542 us total                         2102543 cyc 5256.357 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA single 4K, NBYTES=4096: ops=1 nbytes=4096 ok=1 descriptor setup+start           5713 cyc 14.282 us wait until done/error           93592 cyc 233.980 us total                           99305 cyc 248.262 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA single 4K, NBYTES=32: ops=1 nbytes=32 ok=1 descriptor setup+start           5344 cyc 13.360 us wait until done/error           94609 cyc 236.522 us total                           99953 cyc 249.882 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA single 96K, NBYTES=4096: ops=1 nbytes=4096 ok=1 descriptor setup+start           5867 cyc 14.667 us wait until done/error         2230360 cyc 5575.900 us total                         2236227 cyc 5590.567 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=24 biter=24   EDMA single 96K, NBYTES=32: ops=1 nbytes=32 ok=1 descriptor setup+start           5713 cyc 14.282 us wait until done/error         2256234 cyc 5640.585 us total                         2261947 cyc 5654.867 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=3072 biter=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ My linker: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * M4 XIP-from-FlexSPI with ITCM/DTCM hot sections + SDRAM * OCRAM partition (1MB @ 0x2024_0000): * - 128KB DMA-safe / Device/non-cache : 0x20240000..0x2025FFFF * - 128KB M4 cacheable local scratch : 0x20260000..0x2027FFFF * - 768KB SHARED (M4<->M7) non-cache : 0x20280000..0x2033FFFF * - LAST 8KB of SHARED reserved for M7-only : 0x2033E000..0x2033FFFF (NOT in M4 linker region) * * Additional fixed carve-out (within shared-for-both, before M7 DMA slice): * - 36KB fixed SHARED SysView/RTT window for M4 : 0x20335000..0x2033DFFF * - Shared main (for IPC etc) : 0x20280000..0x20334FFF */ ENTRY(Reset_Handler) HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB cacheable */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ SDRAM_NC_SIZE = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* Local OCRAM total = DMA 128KB + cacheable scratch 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMA-safe non-cache local window (first 128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 cacheable scratch window (next 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* Shared OCRAM starts at 0x20280000 (rest = 768KB) */ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* Reserve LAST 8KB of shared OCRAM for M7-only DMA buffers (exclude from M4 region) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* Fixed SysView/RTT carve-out for M4 at end of shared-for-both (36KB) */ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* Shared main size (everything except the fixed 36KB window) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 base (fixed) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ MEMORY { m_interrupts (RX) : ORIGIN = M4_FLASH_BASE, LENGTH = 0x00000400 m_text (RX) : ORIGIN = M4_FLASH_BASE + 0x400, LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) : ORIGIN = 0x1FFE0000, LENGTH = 0x00020000 m_dtcm (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 /* OCRAM partition */ m_ncache_local (RW) : ORIGIN = OCRAM_DMA_NC_BASE, LENGTH = OCRAM_DMA_NC_SIZE m_ocram_cache (RW) : ORIGIN = OCRAM_LOCAL_C_BASE, LENGTH = OCRAM_LOCAL_C_SIZE m_shared_ocram_main (RW) : ORIGIN = OCRAM_SHARED_BASE, LENGTH = OCRAM_SHARED_MAIN_SIZE m_shared_sysview_m4 (RW) : ORIGIN = OCRAM_SYSVIEW_M4_BASE, LENGTH = OCRAM_SYSVIEW_M4_SIZE m_sdram_c (RW) : ORIGIN = SDRAM_BASE, LENGTH = SDRAM_C_SIZE m_sdram_nc (RW) : ORIGIN = SDRAM_NC_BASE, LENGTH = SDRAM_NC_SIZE } SECTIONS { __NCACHE_REGION_START = OCRAM_BASE; __NCACHE_REGION_SIZE = OCRAM_SIZE; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __SHARED_OCRAM_START__ = .; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __SHARED_OCRAM_END__ = .; ASSERT((__SHARED_OCRAM_END__ - __SHARED_OCRAM_START__) <= LENGTH(m_shared_ocram_main), "shared_ocram section too large"); } > m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __SYSVIEW_M4_START__ = .; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __SYSVIEW_M4_END__ = .; ASSERT((__SYSVIEW_M4_END__ - __SYSVIEW_M4_START__) <= LENGTH(m_shared_sysview_m4), "shared_sysview_m4 section too large (max 36KB)"); } > m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __OCRAM_CACHE_START__ = .; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __OCRAM_CACHE_END__ = .; ASSERT((__OCRAM_CACHE_END__ - __OCRAM_CACHE_START__) <= LENGTH(m_ocram_cache), "ocram_cache section too large"); } > m_ocram_cache .interrupts : { __VECTOR_TABLE = .; __Vectors = .; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > m_interrupts /* ================================================================ * HOT CODE IN ITCM (VMA=ITCM, LMA computed later) * ================================================================ */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = .; *(.itcm_text*) *(ITCM_TEXT*) /* your hot TUs */ */DspParameterManager.cpp.obj(.text .text.*) */audio_param_task.cpp.obj(.text .text.*) */StepSequencer.cpp.obj(.text .text.*) */sequencer_task.cpp.obj(.text .text.*) /* MU ISR(s) - by symbol section name */ *(.text.MUB_IRQHandler) /* FreeRTOS hot bits - by symbol section name */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = .; } > m_itcm /* ================================================================ * HOT RODATA IN DTCM (LMA computed later) * ================================================================ */ .dtcm_rodata : AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = .; */DspParameterManager.cpp.obj(.rodata .rodata.*) */audio_param_task.cpp.obj(.rodata .rodata.*) */StepSequencer.cpp.obj(.rodata .rodata.*) */sequencer_task.cpp.obj(.rodata .rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = .; } > m_dtcm /* ================================================================ * HOT DATA IN DTCM (LMA computed later) * ================================================================ */ .dtcm_data : AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = .; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = .; } > m_dtcm /* ================================================================ * FLASH XIP TEXT/RODATA (catch-all) * ================================================================ */ .text : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); } > m_text .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text .ARM : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } > m_text .ctors : { __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; } > m_text .dtors : { __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __DTOR_END__ = .; } > m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } > m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } > m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } > m_text /* ================================================================ * CRITICAL FIX: * Start load-images AFTER ALL flash-resident sections above. * At this point, '.' is at the real end of flash content. * ================================================================ */ __DATA_ROM = .; __itcm_text_load__ = __DATA_ROM; __dtcm_rodata_load__ = __itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load__ = __dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* NXP startup expects .data LMA at __etext */ __etext = __dtcm_data_load__ + SIZEOF(.dtcm_data); .data : AT(__etext) { . = ALIGN(4); __DATA_RAM = .; __data_start__ = .; *(.data) *(.data*) *(DataQuickAccess) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = .; } > m_dtcm __NDATA_ROM = __etext + (__data_end__ - __data_start__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = .; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = .; } > m_ncache_local .ncache (NOLOAD) : { *(NonCacheable) . = ALIGN(4); __noncachedata_end__ = .; } > m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss) *(.bss*) *(COMMON) . = ALIGN(4); __bss_end__ = .; } > m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = .; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = .; } > m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__); .sdram_c_data : AT(__SDRAM_C_DATA_ROM) { . = ALIGN(32); __sdram_c_data_start__ = .; *(.sdram_c_data*) *(SDRAM_C_DATA*) . = ALIGN(32); __sdram_c_data_end__ = .; } > m_sdram_c __sdram_c_data_load__ = __SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = .; *(.sdram_c_bss*) *(SDRAM_C_BSS*) . = ALIGN(32); __sdram_c_bss_end__ = .; } > m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = .; *(.sdram_nc_bss*) *(SDRAM_NC_BSS*) . = ALIGN(32); __sdram_nc_bss_end__ = .; } > m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = .; . += HEAP_SIZE; __HeapLimit = .; __heap_limit = .; } > m_dtcm .stack : { . = ALIGN(8); . += STACK_SIZE; __StackEnd = .; } > m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __StackTop - STACK_SIZE; PROVIDE(__stack = __StackTop); .ARM.attributes 0 : { *(.ARM.attributes) } __SDRAM_BASE = SDRAM_BASE; __SDRAM_SIZE = SDRAM_SIZE; __SDRAM_C_BASE = SDRAM_BASE; __SDRAM_C_SIZE = SDRAM_C_SIZE; __SDRAM_NC_BASE = SDRAM_NC_BASE; __SDRAM_NC_SIZE = SDRAM_NC_SIZE; } MPUconfig: /* -------------------------------------------------------------------------- */ /* CM7 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; extern uint32_t __NCACHE_REGION_SIZE[]; uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; #else uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif (void)nonCacheStart; (void)size; #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* Region 0: deny all (speculative prefetch workaround) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 2: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 3: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); /* Region 4: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 5: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */ /* Region 6: 0x20240000..0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7: 0x20280000..0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 10: 0x20300000..0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 12: overlay first 8MB as cacheable (WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 12: overlay first 8MB as cacheable (WB) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) /* Region 8: XIP external flash, RO, cacheable WB, cover full 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB); #endif /* Peripheral windows */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache(); #endif #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache(); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /* ---- Disable code bus cache (LMEM) ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK; } /* ---- Disable system bus cache (LMEM) ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable(); /* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Device/non-cache. * Keep the original attributes here: UART/SPI/SD DMA buffers live in this * window and require the proven non-cache behavior with CM4 LMEM. */ MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable recommended */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* bufferable (WB) */ 0, ARM_MPU_REGION_SIZE_128KB); /* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Linker split: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * The MPU cannot describe 56MB directly, so region 4 makes the full 64MB * SDRAM window Device/non-cache and region 5 overlays the first 8MB as * cacheable. Higher-numbered MPU regions take precedence. */ (void)SDRAM_NC_BASE; (void)SDRAM_NC_SIZE; /* Region 4: full SDRAM default, 0x80000000..0x83FFFFFF -> Device/non-cache */ MPU->RBAR = ARM_MPU_RBAR(4, SDRAM_BASE_EXPECTED); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, /* Device */ 0, /* not shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-through */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 0, /* write-through */ 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-back */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* write-back */ 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* Invalidate and enable system bus cache (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* Invalidate and enable code bus cache (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ I also tried this with similar results but got missmatching checksums when writing from non cacheable ocram to non cacheable sdram using dma:  #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; extern uint32_t __NCACHE_REGION_SIZE[]; uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; #else uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif (void)nonCacheStart; (void)size; #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* Region 0: deny all (speculative prefetch workaround) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 2: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 3: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); /* Region 4: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 5: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */ /* Region 6: 0x20240000..0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7: 0x20280000..0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 10: 0x20300000..0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 12: overlay first 8MB as cacheable (WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 12: overlay first 8MB as cacheable (WB) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) /* Region 8: XIP external flash, RO, cacheable WB, cover full 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB); #endif /* Peripheral windows */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache(); #endif #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache(); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /* ---- Disable code bus cache (LMEM) ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK; } /* ---- Disable system bus cache (LMEM) ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable(); /* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Normal non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 1, /* shareable recommended */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* bufferable (WB) */ 0, ARM_MPU_REGION_SIZE_128KB); /* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> Normal (shareable) */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> Normal (shareable) */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal*/ 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_256KB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* Invalidate and enable system bus cache (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* Invalidate and enable code bus cache (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ Evaluation Board Re: RT1170 EVKB M4 memory speed Hi @cyberhelmer , Thanks for your interest in NXP MIMXRT series! NXP has provided test results based on the RT1050. You can view this application note and the corresponding software: https://www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 I did a quick comparison and found that during the SDRAM write test, ANSW used the following settings: Normal memory property, pure 32-bit sequential writes, and DSB after write. We recommend that you refer to this ANSW to conduct the corresponding experiment. Best regards, Gavin
View full article
RT1170 EVKB M4 内存速度 我正在对 RT1170 evkb 的 M4 内核内存访问进行一些基准测试。当 M4 访问主板上的 同步动态随机存取存储器 (SDRAM) 和 ocram 时,这些数字是预期的吗?看起来非常慢。 我读到过一些关于 M4 的访问时间较长的信息,因为有 axi 织物等,但这似乎非常慢。我是否在配置中遗漏了什么,导致速度慢于需要? 基准测试包括一些不同的内存源/目的地,但我最感兴趣的改进是 同步动态随机存取存储器(SDRAM) 和 ocram 之间的 edma。我正在实现一个多轨音频流媒体引擎,其中 M4 组 edma 从同步动态随机存取存储器(SDRAM)不可缓存传输到 ocram 不可缓存。然后,M7 内核消耗共享 ocram 的缓冲区。 但测试是独立进行的,应该没有或很少有仲裁发生。 如果我没猜错的话,同步动态随机存取存储器(SDRAM) 和 ocram 区域都设置为不可缓存,在 mpuConfig 中也将 ocram 区域设置为可共享? 音频流复制基准,Cortex-M4 @ 400 MHz 操作:回放 16 x 4096 B SDRAM_NC->OCRAM,记录 8 x 4096 B OCRAM->SDRAM_NC 字节:回放=65536 记录=32768 总计 =98304   CPU memcpy: 播放副本 1532202 Cyc 3830.505 us 记录副本 530291 cyc 1325.727 us scatter total 2062493 cyc 5156.232 us 单个 96K 散装 2301811 cyc 5754.527 us 校验和=239   内存区域复制矩阵(每行 32768 B): regions src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/ 缓存:CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d 只有当两个端点都是非高速缓存/DMA 安全时,才会运行 EDMA。 SDRAM_C-> OCRAM_CACHE 字节 =32768 cpu= 1201410 cyc 3003.525 us 10.90 MB/s | edma=跳过可缓存校验和=338 SDRAM_NC-> OCRAM_CACHE 字节 =32768 cpu= 1037590 cyc 2593.975 us 12.63 MB/s | edma=跳过可缓存校验和=602 SDRAM_NC-> SHARED_OCRAM 字节=32768 cpu= 781109 cyc 1952.772 美国 16.78 MB/s | edma=ok 779805 cyc 1949.512 美国 16.80 MB/s 校验和=602/602 | edma+cache=ok 858144 cyc 2145.360 美国 15.27 MB/s checksum=602 SDRAM_NC-> NCACHE_OCRAM 字节=32768 cpu= 777897 cyc 1944.742 美国 16.84 MB/s | edma=ok 751101 cyc 1877.752 我们 17.45 MB/s checksum=602 | edma+cache=ok 853273 cyc 2133.182 美国 15.36 MB/s checksum=602 OCRAM_CACHE-> SDRAM_NC 字节=32768 cpu= 750396 cyc 1875.990 美国 17.46 MB/s | edma=跳过可缓存校验和 =1204 SHARED_OCRAM-> SDRAM_NC 字节=32768 cpu= 53 1143 cyc 1327.857 美国 24.67 MB/s | edma=ok 570792 cyc 1426.980 美国 22.96 MB/s checksum=610 | edma+cache=ok 670564 cyc 1676.410 us 19.54 Mb/s checksum=610 NCACHE_OCRAM-> SDRAM_NC 字节=32768 cpu= 541568 cyc 1353.920 美国 24.20 Mb/s | edma=ok 549911 cyc 1374.777 美国 23.83 Mb/s checksum=940 | edma+cache=ok 649852 cyc 1624.630 us 20.16 Mb/s checksum=940 SDRAM_NC-> SDRAM_NC 字节=32768 cpu= 896 656 cyc 2241.640 我们 14.61 Mb/s | edma=ok 997686 cyc 2494.215 我们 13.13 MB/s checksum=602/602 | edma+cache=ok 1130798 cyc 2826.995 美国 11.59 MB/s checksum=602 OCRAM_CACHE-> OCRAM_CACHE 字节 =32768 cpu= 768904 cyc 1922.260 us 17.04 MB/s | edma=跳过可缓存校验和 =1204 SHARED_OCRAM-> SHARED_OCRAM 字节 =32768 cpu= 425929 cyc 1064.822 美国 30.77 MB/s | edma=ok 433498 cyc 1083.745 美国 30.23 MB/s 校验和=610/610 | edma+cache=ok 542913 cyc 1357.282 us 24.14 Mb/s checksum=610   EDMA 散射/采集 24 x 4K,NBYTES=4096: ops=24 nbytes=4096 ok=1 描述符 设置+启动 58942 cyc 147.355 us 等待完成/出错 2031292 cyc 5078.230 us 共计 2090234 Cyc 5225.585 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA 散射/采集 24 x 4K,NBYTES=32: ops=24 nbytes=32 ok=1 描述符设置+启动 47526 cyc 118.815 us 等待完成/错误 2055017 Cyc 5137.542 us 共计 2102543 Cyc 5256.357 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA 单 4K,NBYTES=4096: ops=1 nbytes=4096 ok=1 描述符设置+启动 5713 Cyc 14.282 us 等待完成/出错 93592 Cyc 233.980 us 共计 99305 cyc 248.262 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA 单 4K,NBYTES=32: ops=1 nbytes=32 ok=1 描述符 设置+启动 5344 Cyc 13.360 us 等待完成/出错 94609 cyc 236.522 us 共计 99953 cyc 249.882 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA 单通道 96K,NBYTES=4096: ops=1 nbytes=4096 ok=1 描述符 设置+启动 5867 cyc 14.667 us 等待完成/出错 2230360 Cyc 5575.900 us 共计 2236227 Cyc 5590.567 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=24 biter=24   EDMA 单通道 96K,NBYTES=32: ops=1 nbytes=32 ok=1 描述符设置+启动 5713 Cyc 14.282 us 等待完成/错误 2256234 Cyc 5640.585 us 共计 2261947 Cyc 5654.867 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=3072 biter=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ My linker: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * 带有 ITCM/DTCM 热门部分的 M4 XIP-from-FlexSPI + 同步动态随机存取存储器(SDRAM) * OCRAM 分区(1MB @ 0x2024_0000): *-128KB DMA 安全/设备/非缓存:0x20240000.. 0x2025FFFF * 128KB M4 缓存本地抓取:0x20260000...0x2027FFFF * - 768KB 共享(M4<->M7)非高速缓存:0x20280000...0x2033FFFF * - 仅为 M7 保留的最后 8KB 共享:0x2033E000...0x2033FFFF(不在 M4 连接器区域内) * * 额外的固定分割(在 M7 DMA 分割之前的共享-双向): * M4 的 36KB 固定共享 SysView/RTT 窗口:0x20335000...0x2033DFFF * - 共享主系统(用于 IPC 等) :0x20280000..0x20334FFF */ ENTRY(Reset_Handler) HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB 缓存 */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ sdram_nc_size = sdram_size - sdram_c_size; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* 本地 OCRAM 总容量 = DMA 128KB + 可缓存划痕 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMA 安全非高速缓存本地窗口(前 128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 可缓存抓取窗口(下 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* 共享 OCRAM 从 0x20280000 开始(其余部分 = 768KB) */ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* 为 M7 专用 DMA 缓冲区保留最后 8KB 共享 OCRAM(不包括 M4 区域) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* 修正了 SysView/RTT 在双方共享(36KB)结束时对 M4 的分割 */ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* 共享主大小(除固定的 36KB 窗口外的所有内容) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 base(固定) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ 存储器 { m_interrupts (RX) :ORIGIN = M4_FLASH_BASE,LENGTH = 0x00000400 m_text (RX) :ORIGIN = M4_FLASH_BASE + 0x400,LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) :ORIGIN = 0x1FFE0000,LENGTH = 0x00020000 m_dtcm (RW) :ORIGIN = 0x20000000,LENGTH = 0x00020000 /* OCRAM 分区 */ m_ncache_local (RW) :origin = ocram_dma_nc_base, length = ocram_dma_nc_size m_ocram_cache (RW) :origin = ocram_local_c_base, length = ocram_local_c_size m_shared_ocram_main (RW) :origin = ocram_shared_base, length = ocram_shared_main_size m_shared_sysview_m4 (RW) :origin = ocram_sysview_m4_base, length = ocram_sysview_m4_size m_sdram_c (RW) :origin = sdram_base,length = sdram_c_size m_sdram_nc (RW) :origin = sdram_nc_base,length = sdram_nc_size } SECTIONS { __ncache_region_start = ocram_base; __ncache_region_size = ocram_size; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __shared_ocram_start__ = ..; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __shared_ocram_end__ = ..; ASSERT((__SHARED_OCRAM_END__ - __SHARED_OCRAM_START__)<= LENGTH(m_shared_ocram_main)、 "shared_ocram 部分过大"); }> m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __sysview_m4_start__ = ..; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __sysview_m4_end__ = ; ASSERT((__SYSVIEW_M4_END__ - __SYSVIEW_M4_START__)<= LENGTH(m_shared_sysview_m4)、 "shared_sysview_m4 部分过大 (max 36KB)"); }> m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __ocram_cache_start__ = ..; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __ocram_cache_end__ = ; ASSERT((__OCRAM_CACHE_END__ - __OCRAM_CACHE_START__)<= LENGTH(m_ocram_cache)、 "ocram_cache 部分过大"); }> m_ocram_cache .中断 : { __vector_table = ; __Vectors = ; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); }> m_interrupts /* ================================================================ * ITCM 中的热代码(VMA=ITCM,LMA 稍后计算) * ================================================================ */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = ; *(.itcm_text*) *(ITCM_TEXT*) /* 您的热 TU */ */DspParameterManager.cpp.obj(.text.text.*) */audio_param_task.cpp.obj(.text.text.*) */StepSequencer.cpp.obj(.text.text.*) */sequencer_task.cpp.obj(.text.text.*) /* MU ISR - 按符号部分名称 */ *(.text.MUB_IRQHandler) /* FreeRTOS 热位 - 按符号部分名称 */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = ; }> m_itcm /* ================================================================ * DTCM 中的热 RODATA(稍后计算 LMA) * ================================================================ */ .dtcm_rodata :AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = ..; */DspParameterManager.cpp.obj(.rodata.rodata.*) */audio_param_task.cpp.obj(.rodata.rodata.*) */StepSequencer.cpp.obj(.rodata.rodata.*) */sequencer_task.cpp.obj(.rodata.rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = ..; }> m_dtcm /* ================================================================ * DTCM 中的热数据(稍后计算 LMA) * ================================================================ */ .dtcm_data :AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = ..; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = ..; }> m_dtcm /* ================================================================ * 闪存 XIP 文本/RODATA(包罗万象) * ================================================================ */ .text : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); }> m_text .arm.extab: {* (.arm.extab*.gnu.linkonce.armextab.*)}> m_text Arm : { __exidx_start = ; * (.arm.exidx*) __exidx_end = ; }> m_text .ctors : { __ctor_list__ = ; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o)).ctors)) KEEP (*(SORT(.ctors.*)) KEEP (*(.ctors)) __ctor_end__ = ; }> m_text .dtors : { __dtor_list__ = ..; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o)).dtors)) KEEP (*(SORT(.dtors.*)) KEEP (*(.dtors)) __dtor_end__ = ; }> m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); }> m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*)) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); }> m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*)) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); }> m_text /* ================================================================ * 重要修复: * 在上述所有闪存驻留部分之后开始加载图像。 * 此时,". "位于闪存内容的真正末尾。 * ================================================================ */ __data_rom = ; __itcm_text_load__ = __DATA_ROM; __dtcm_rodata_load__ = __itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load__ = __dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* 恩智浦启动时希望使用 .dataLMA at __etext */ __etext = __dtcm_data_load__ + SIZEOF(.dtcm_data); .data :AT(__etext) { . = ALIGN(4); __data_ram = ; __data_start__ = ; *(.data) *(.data*) *(DataQuickAccess) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = ; }> m_dtcm __NDATA_ROM =__etext + (__data_end__ - __data_start__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = ..; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = ..; }> m_ncache_local .ncache (NOLOAD) : { *(不可缓存) . = ALIGN(4); __noncachedata_end__ = ..; }> m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = ; *(.bss) *(.bss*) *(通用) . = ALIGN(4); __bss_end__ = ; }> m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = ..; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = ; }> m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__); .sdram_c_data :at(__sdram_c_data_rom) { . = ALIGN(32); __sdram_c_data_start__ = ..; *(.sdram_c_data*) *(sdram_c_data*) . = ALIGN(32); __sdram_c_data_end__ = ..; }> m_sdram_c __sdram_c_data_load__ = __SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = ..; *(.sdram_c_bss*) *(sdram_c_bss*) . = ALIGN(32); __sdram_c_bss_end__ = ..; }> m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = ..; *(.sdram_nc_bss*) *(sdram_nc_bss*) . = ALIGN(32); __sdram_nc_bss_end__ = ..; }> m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = ; .+= HEAP_SIZE; __HeapLimit = ; __heap_limit = ; }> m_dtcm .stack : { . = ALIGN(8); .+= STACK_SIZE; __StackEnd = ; }> m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __堆栈顶 - STACK_SIZE; PROVIDE(__stack = __StackTop); .arm.Attributes 0: {* (.arm.Attributes)} __sdram_base = sdram_base; __sdram_size = sdram_size; __sdram_c_base = sdram_base; __sdram_c_size = sdram_c_size; __sdram_nc_base = sdram_nc_base; __sdram_nc_size = sdram_nc_size; } MPUconfig: /* -------------------------------------------------------------------------- */ /* CM7 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if 定义(__ICCARM__) || 定义(__GNUC__) 外部 uint32_t__ncache_region_start[]; 外部 uint32_t__ncache_region_size[]; uint32_tnonCacheStart =(uint32_t)__ncache_region_start; uint32_t大小 =(uint32_t)__ncache_region_size; #else uint32_tnonCacheStart =ocram_base_expected; uint32_t大小 =ocram_size_expected; #endif ()非缓存启动)nonCacheStart; (void)大小; #if 定义(__icache_present) &&__icache_present 如果(SCB_CCR_IC_Msk ==(SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if 定义(__dcache_present) &&__dcache_present 如果(SCB_CCR_DC_Msk ==(SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* 区域 0:全部拒绝(投机预取变通方法) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, arm_mpu_ap_none、 0, 0, 0, 0, 0, arm_mpu_region_size_4GB); /* 区域 1:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 2:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 3:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1GB); /* 区域 4:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* 区域 5:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* CM7 上的 OCRAM:正常 + 可共享 + 不可缓存(TEX=1,S=1,C=0,B=0) */ /* 区域 6:0x20240000...0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); /* 区域 7:0x20280000...0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_512kb); /* 区域 10:0x20300000...0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); #ifUSE_SDRAM /* 区域 11:同步动态随机存取存储器(SDRAM) 默认不可缓存 64MB(普通非缓存)*/ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 0, 0, 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 12:将前 8MB 重叠为高速缓存(WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 0, 0, arm_mpu_region_size_8mb); #else /* 第 12 区:将前 8MB 重叠为可缓存(WB)*/ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ #if 定义(xip_external_flash) &&(xip_external_flash == 1) /* 区域 8:XIP 外部闪存,RO,可缓存 WB,覆盖全 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO、 0, 0, 1, 1, 0, arm_mpu_region_size_64mb); #endif /* 外围窗口 */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_16mb); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_2mb); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1mb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if 定义(__dcache_present) &&__dcache_present SCB_EnableDCache(); #endif #if 定义(__icache_present) &&__icache_present SCB_EnableICache(); #endif } #endif/* __cortex_m == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /*----禁用代码总线缓存 (LMEM)----*/ 如果(lmem_pcccr_encache_mask ==(lmem_pcccr_encache_mask & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_Mask | lmem_pcccr_pushw1_mask | lmem_pcccr_go_mask; 虽然((LMEM->PCCCR & LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(lmem_pcccr_pushw0_mask | lmem_pcccr_pushw1_mask); LMEM->PCCCR &= ~lmem_pcccr_encache_mask; } /*----禁用系统总线缓存 (LMEM)----*/ 如果(lmem_psccr_encache_mask ==(lmem_psccr_encache_mask & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_Mask | lmem_psccr_pushw1_mask | lmem_psccr_go_mask; 虽然((LMEM->PSCCR & LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(lmem_psccr_pushw0_mask | lmem_psccr_pushw1_mask); LMEM->PSCCR &= ~LMEM_PSCCR_encache_mask; } ARM_MPU_Disable(); /* 区域 0:0x20240000.. 0x2025FFF (128KB) DMA-> 设备/非缓存。 * 这里保留原始属性:UART/SPI/SD DMA 缓冲区位于此处 * 窗口,并要求使用 CM4 LMEM 经过验证的非缓存行为。*/ MPU->RBAR = ARM_MPU_RBAR(0, ocram_dma_nc_base); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 建议共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_128kb); /* 区域 1: 0x20260000..0x2027FFFF (128KB) 本地抓取 -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, ocram_local_c_base); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 可缓冲 (WB) */ 0, arm_mpu_region_size_128kb); /* 区域 2:0x20280000...0x202FFFFF (512KB) 共享 -> 原始非缓存 attrs */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_512kb); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_256kb); #if USE_SDRAM /* 链接器分割: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * MPU 无法直接描述 56MB,因此第 4 区域可提供完整的 64MB * 同步动态随机存取存储器(SDRAM) 窗口设备/非缓存和区域 5 将前 8MB 覆盖为 * 可缓存。编号较高的 MPU 区域优先。*/ (void)SDRAM_NC_BASE; (void)SDRAM_NC_SIZE; /* 区域 4:全部 同步动态随机存取存储器(SDRAM) 默认,0x80000000... 0x83FFFFFF-> 设备/非缓存 */ MPU->RBAR = ARM_MPU_RBAR(4, sdram_base_expected); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2,/* 设备 */ 0,/* 不可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 5:链接器 m_sdram_c,0x80000000...0x807FFFFF -> 正常写透 */ MPU->RBAR = ARM_MPU_RBAR(5, sdram_c_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 0,/* 写入 */ 0, arm_mpu_region_size_8mb); #else /* 区域 5:链接器 m_sdram_c,0x80000000...0x807FFFFF -> 正常回写 */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 回写 */ 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* 失效并启用系统总线缓存 (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_Mask | lmem_psccr_invw1_mask | lmem_psccr_go_mask; 虽然((LMEM->PSCCR & LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(lmem_psccr_invw0_mask | lmem_psccr_invw1_mask); LMEM->PSCCR |= LMEM_PSCCR_encache_mask; /* 使代码总线缓存失效并启用该缓存 (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_Mask | lmem_pcccr_invw1_mask | lmem_pcccr_go_mask; 虽然((LMEM->PCCCR & LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(lmem_pcccr_invw0_mask | lmem_pcccr_invw1_mask); LMEM->PCCCR |= lmem_pcccr_encache_mask; } #endif /* __CORTEX_M == 4 */ 我也尝试过这个,但是在使用 dma 从不可缓存的 ocram 写入不可缓存的 同步动态随机存取存储器(SDRAM) 时出现校验和不匹配 的情况: #if__CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if 定义(__ICCARM__) || 定义(__GNUC__) 外部 uint32_t__ncache_region_start[]; 外部 uint32_t__ncache_region_size[]; uint32_tnonCacheStart =(uint32_t)__ncache_region_start; uint32_t大小 =(uint32_t)__ncache_region_size; #else uint32_tnonCacheStart =ocram_base_expected; uint32_t大小 =ocram_size_expected; #endif ()非缓存启动)nonCacheStart; (void)大小; #if 定义(__icache_present) &&__icache_present 如果(SCB_CCR_IC_Msk ==(SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if 定义(__dcache_present) &&__dcache_present 如果(SCB_CCR_DC_Msk ==(SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* 区域 0:全部拒绝(投机预取变通方法) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, arm_mpu_ap_none、 0, 0, 0, 0, 0, arm_mpu_region_size_4GB); /* 区域 1:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 2:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 3:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1GB); /* 区域 4:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* 区域 5:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* CM7 上的 OCRAM:正常 + 可共享 + 不可缓存(TEX=1,S=1,C=0,B=0) */ /* 区域 6:0x20240000...0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); /* 区域 7:0x20280000...0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_512kb); /* 区域 10:0x20300000...0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); #ifUSE_SDRAM /* 区域 11:同步动态随机存取存储器(SDRAM) 默认不可缓存 64MB(普通非缓存)*/ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 0, 0, 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 12:将前 8MB 重叠为高速缓存(WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 0, 0, arm_mpu_region_size_8mb); #else /* 第 12 区:将前 8MB 重叠为可缓存(WB)*/ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ #if 定义(xip_external_flash) &&(xip_external_flash == 1) /* 区域 8:XIP 外部闪存,RO,可缓存 WB,覆盖全 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO、 0, 0, 1, 1, 0, arm_mpu_region_size_64mb); #endif /* 外围窗口 */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_16mb); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_2mb); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1mb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if 定义(__dcache_present) &&__dcache_present SCB_EnableDCache(); #endif #if 定义(__icache_present) &&__icache_present SCB_EnableICache(); #endif } #endif/* __cortex_m == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if__CORTEX_M == 4 void BOARD_ConfigMPU(void) { /*----禁用代码总线缓存 (LMEM)----*/ 如果(lmem_pcccr_encache_mask ==(lmem_pcccr_encache_mask & LMEM->PCCCR)) { LMEM->PCCCR |=LMEM_PCCCR_PUSHW0_Mask |lmem_pcccr_pushw1_mask |lmem_pcccr_go_mask; 虽然((LMEM->PCCCR &LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_Mask |PCCCR = ~ (lmem_pcccr_pushw0_mask | lmem_pcccr_pushw1_mask); LMEM->PCCCR &= ~lmem_pcccr_encache_mask; } /*----禁用系统总线缓存 (LMEM)----*/ 如果(lmem_psccr_encache_mask ==(lmem_psccr_encache_mask & LMEM->PSCCR)) { LMEM->PSCCR |=LMEM_PSCCR_PUSHW0_Mask |lmem_psccr_pushw1_mask |lmem_psccr_go_mask; 虽然((LMEM->PSCCR &LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_Mask |lmem_psccr_pushw1_mask); LMEM->PSCCR &= ~LMEM_PSCCR_encache_mask; } ARM_MPU_Disable(); /* 区域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 正常不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(0, ocram_dma_nc_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 1,/* 建议共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_128kb); /* 区域 1: 0x20260000..0x2027FFFF (128KB) 本地抓取 -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, ocram_local_c_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 可缓冲 (WB) */ 0, arm_mpu_region_size_128kb); /* 区域 2:0x20280000...0x202FFFFF (512KB) 共享 -> 正常(可共享) */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_512kb); /* 区域 3: 0x20300000..0x2033FFFF (256KB) 共享 -> 正常(可共享) */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常*/ 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_256kb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* 失效并启用系统总线缓存 (PSCCR) */ LMEM->PSCCR |=LMEM_PSCCR_INVW0_Mask |lmem_psccr_invw1_mask |lmem_psccr_go_mask; 虽然((LMEM->PSCCR &LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_Mask |lmem_psccr_invw1_mask); LMEM->PSCCR |=lmem_psccr_encache_mask; /* 使代码总线缓存失效并启用该缓存 (PCCCR) */ LMEM->PCCCR |=LMEM_PCCCR_INVW0_Mask |lmem_pcccr_invw1_mask |lmem_pcccr_go_mask; 虽然((LMEM->PCCCR &LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_Mask |PCCCR = ~ (lmem_pcccr_invw0_mask | lmem_pcccr_invw1_mask); LMEM->PCCCR |=lmem_pcccr_encache_mask; } #endif/* __cortex_m == 4 */ 评估板 Re: RT1170 EVKB M4 memory speed 你好@cyberhelmer、 感谢您对 NXP MIMXRT 系列的关注! 恩智浦提供了基于 RT1050 的测试结果。你可以查看这份应用笔记和相应的软件:https://www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 我进行了快速比较,发现在 同步动态随机存取存储器(SDRAM) 写入测试期间,ANSW 使用了以下设置:正常内存属性、纯 32 位顺序写入和写入后的 DSB。 我们建议您参考本 ANSW 进行相应的实验。 致以最诚挚的问候, Gavin
View full article
h264 or similar formats on mimxrt595s Hello, I am currently working on a GUI for a wearable using lvgl, zephyr and GUI-Guider. We would like to have some more complex animations in our project, which are hard to recreate from scratch with the existing widgets and for that purpose we would like to implement small videos we can just drop into the UI when needed. I already was able to create a POC by converting a video to a series of pictures, but that takes a lot of flash space, as the compression is very limited that way. The idea was to use a better format like h264 or similar. But the support for that seems to be limited to the i.MX RT1050 out of the box. Is there some way to also get this running on the mimxrt595s, or does it not make sense? My research led me to believe, that it is not possible without linking ffmpeg libraries to our lvgl implementation, which surely would take some porting effort and take too much flash and RAM from our chip to make any sense. Am I right in this last assumption or is there a way to save resources in our situation? Best regards, Kai
View full article
LS1012A 无法自动启动 你好,我使用的 ls1012a 板很好。 启动不像前一阵子的照片那样。 我想知道问题出在哪里。
View full article
Integration of UDS Bootloader and J1939 Stack on CAN   Description: Hi Team, I am working on S32K344 using S32DS 3.6.5 with RTD 3.0.0 Current implementation: FlexCAN CAN communication UDS bootloader over ISO-TP J1939 application communication GCC compiler AUTOSAR RTD drivers I need guidance regarding coexistence of: UDS diagnostics (ISO14229) ISO-TP transport layer J1939 communication stack ensure CAN termination resistor configuration shall be select through software in S32k344 and How to do ? explain how CAN termination will designed in transceiver and MCU  Questions: What is the recommended architecture for running UDS and J1939 simultaneously on same CAN controller? Is it recommended to use separate CAN message buffers for UDS and J1939? How should CAN ID filtering be configured? Are there any NXP reference examples for: UDS bootloader J1939 stack Shared FlexCAN usage Any known limitations in RTD 3.0 for this use case? Controller: S32K344 RTD 3.0 S32DS 3.5 Thanks. 
View full article
Jellytide 是合法尝试吗?2026 年回顾 Jellytide 正在成为 2026 年最受关注的备灾系统之一 ,因为它专注于现实的停电生存策略,而不是好莱坞式的恐惧策略。该计划由退伍军人丹尼尔斯创建,结合了实用指南、分步视频和受军事启发的规划,以帮助家庭为长期停电、网络威胁和紧急情况做好准备。Jellytide 准备就绪 它的与众不同之处在于其方便初学者使用的方法。 该系统不是推销昂贵的掩体或复杂的救生装备,而是专注于经济实惠的实际行动,例如储水、备用电源、粮食安全、EMP 保护和家居准备。许多用户赞赏该指南将所有内容分解成简单的周末项目,普通家庭也能真正实施。 2026 年, 随着人们对电网不稳定、恶劣天气和供应链中断的担忧与日俱增,备灾已从一个小众爱好转变为主流话题。Jellytide直接利用了这一趋势,为那些想要安心而又不想成为极端 “末日准备者” 的家庭提供结构化的生存路线图。 值得购买吗? 对于正在寻找实用备灾蓝图的人们来说,答案似乎是肯定的。其价值来自于系统的组织性、简洁性和对现实世界的关注。不过,指南只有在用户实际应用这些策略时才能发挥作用。它最适合那些愿意采取循序渐进的行动来提高家庭复原力和应急准备的人。 查看更多https://tinyurl.com/2epyz5wu
View full article
Regarding power estimation tool for S32K328 MCU I'm using S32K328 as functional MCU and S32K341 as safety MCU in my application. I want to know if there is any power estimation tool available for these ICs. If yes kindly let me know where i can find it for my use case. Thanks. Re: Regarding power estimation tool for S32K328 MCU Hello @Abhinavv_007, For now, you can refer to the S32K Power Estimation Tool (PET). It includes a limited number of devices, but it may prove useful. I've also sent you a private message here in community regarding some preliminary information for S32K3X8 devices. Lastly, kindly refer to chapter 6.7 (Supply Currents) from the S32K3XX's Data Sheet document, where the STANDBY, Low speed RUN, and RUN supply currents are noted. This may prove useful as reference information. Best regards, Julián
View full article
如何在 imx6sx 中处理浮点数值 各位专家好, 我正在使用 imx6sx 将现有程序移植到自定义主板上。 此前,它使用的是 P1011 CPU。 环境是 Yocto BSP 5.15.52-2.1.0。 问题是,在将通过通信接收到的浮点数值存储到结构中时,会出现信号错误。 我问了 gemini,发现如果对齐不正确,可能会发生这种情况, 但是由于我使用的是外部库(我收到的是二进制库), 我想知道如何在不修改源代码的情况下解决这个问题。 我问过人工智能,得到了一些提示,但没有成功 衷心感谢 i.MX6SoloX i.MX7 双核
View full article
Time Drift in PCF85063TP/1Z RTC We are using the PCF85063TP/1Z RTC in our temperature logger product for maintaining time stamps during temperature data logging. During testing, we observed time drift issues across multiple boards, where each board shows a different amount of drift over time. In our current hardware design, we are using a 12.5 pF load capacitance crystal. Based on this, we updated the RTC register setting by configuring the CAP_SEL bit to ‘1’ to match the crystal load capacitance requirement. After making this configuration change, we are still observing approximately 2 seconds of drift in real-time operation. We would like to understand: Whether this level of drift is expected for the PCF85063TP/1Z. If there are any recommended register configurations or calibration methods to improve RTC accuracy. Whether PCB layout, crystal selection, or other hardware considerations could contribute to the observed variation between boards. Kindly provide your recommendations and guidance for improving RTC timing accuracy in this application. Re: Time Drift in PCF85063TP/1Z RTC Hello, Please see application note AN11247 Improved timekeeping accuracy with PCF85063, PCF8523 and PCF2123 using an external temperature sensor Hope this helps!
View full article
S32K344の消費電力評価について これは、デフォルトで2つのコアを使用した場合の消費電力の推定値ですか?また、各周辺機器を選択した後、内部で追加の電流要件が発生します。これはどういう意味ですか?また、自分で評価する必要がありますか?現在選択されている周辺機器は使用する必要があるものですが、内部での追加電流要件は設定されていません。この消費電力の推定値162.13mA/535.03mWは信頼できるものですか? 回复: 关于S32K344功耗评估问题 こんにちは、ノースストリートのオールドドライバーポテンシャルキング データシートには、テスト対象の周辺機器の状態を一覧にした表も掲載されています。 回复: 关于S32K344功耗评估问题 ご回答ありがとうございます。2点目についてですが、この表には、クロック速度160MHz、デュアルコアとシングルコア、一部の周辺機器がオフになっていない状態での消費電力が記載されています。これは、一部の周辺機器がオフになっていないことを意味します。どの周辺機器がオフになっていないか教えていただけますか?それとも、すべての周辺機器がオンになっている状態での消費電流でしょうか?私の質問は、S32K344がRUNモードで、EMAC、LPI2C、QuadSPI、TempSense、eDMA、eMIOSが有効になっている場合、この消費電流の基準値はどの程度意味があるのでしょうか?PETの消費電力に基づくと、少し低いように思えますが、いかがでしょうか? Re: 关于S32K344功耗评估问题 こんにちは、ノースストリートのオールドドライバーポテンシャルキング この消費電力評価ツールはメンテナンスされておらず、一部の消費電力データは最新のデータシートと異なる場合があります。 最新のデータシートを参照することをお勧めします。 Revを使用しました。2025年11月13日~12日、最新バージョンはRev.14です。 1. この表では、クロック速度160MHz、デュアルコア、シングルコア、周辺機器オフ時の消費電力を確認できます。 2. この表では、クロック速度160MHz、デュアルコア、シングルコアの場合の消費電力、および一部の周辺機器がオフになっていない場合の消費電力を確認できます。
View full article
Sch of RDA8420TEIS0 Hi there, I am Hong in Australia.  I am going to design a BMS with EIS, and going to use BMA7418, 6402, 8420 etc.  but in terms of generating AC excitation signal, I could not figure out.  can you tell me how this board RDA8420TEIS0 generates AC excitation signals.  can  you post the schematic ?  how those parts Q1, Q2, D2, D3, the inductor and the  cap work ?  I can't figure out, can you please help ? cheers H-Bridge Driver Re: Sch of RDA8420TEIS0 HI  You can try to download this board from below link for reference. https://www.nxp.com/design/design-center/development-boards-and-designs/EVBMA8420T
View full article
S32DSおよびRTDライブラリのCI/CD こんにちは、 S32DS、RTD、freeRTOSの.mexプロジェクトをCI/CDパイプライン(GitHub、Gitlab、Jenkinsなど)に完全に統合できた人はいますか? この記事を読んだのですが、まだ不明瞭な点がたくさんあるように思います。 CI/CDのベストプラクティス S32DSのDockerイメージも利用可能であることが分かりましたが、それらは使用できますか? NXPから、これを実装するための公式な手順書はありますか? ありがとう。
View full article
RDA8420TEIS0 的 Sch 你好,我是澳大利亚的 Hong。 我打算设计一个带有 EIS 的电池管理系统,并打算使用 BMA7418、6402、8420 等,但是在生成交流激励信号方面,我无法弄清楚。你能告诉我这个主板 RDA8420TEIS0 是如何产生交流励磁信号的。能贴出原理图吗? Q1、Q2、D2、D3、电感器和电容器是如何工作的? 我想不明白,能帮帮我吗?欢呼声 H桥驱动器 Re: Sch of RDA8420TEIS0 你好 你可以尝试从下面的链接下载这个主板以供参考。 https://www.nxp.com/design/design-center/development-boards-and-designs/EVBMA8420T
View full article
imx6sxで浮動小数点値を扱う方法 こんにちは、専門家の皆様、 私は既存のプログラムをimx6sxを使用したカスタムボードに移植しています。 以前はP1011 CPUを使用していた。 環境はYocto BSP 5.15.52-2.1.0です。 問題は、通信で受信した浮動小数点値を構造体に格納する際に、信号エラーが発生することです。 ジェミニに問い合わせたところ、アライメントが正しくない場合にこのようなことが起こる可能性があることがわかりました。 しかし、外部ライブラリを使用しているため、(バイナリライブラリを受け取ります) ソースコードを変更せずにこの問題を解決する方法を知りたいです。 AIに質問してヒントを得たが、成功しなかった。 心から感謝申し上げます i.MX6SoloX i.MX7Dual
View full article
LS1012A autoboot does not start Hello, I was using the ls1012a board well. Boot doesn't start like the picture a while ago. I want to know what the problem is.
View full article
S32DS& RTD 库 CI/CD 你好, 有没有人设法将 S32DS & RTD & FreeRTOS .mex 项目完全集成到 CI/CD 管道(GitHub、Gitlab、Jenkins 等)中。 我读了这篇文章,我想说还有很多不清楚的步骤: CI/CD 的最佳实践  我还看到 S32DS 容器镜像也可用,可以用吗? 恩智浦是否有任何官方的实施步骤说明? 谢谢。
View full article
mimxrt595s 上的 h264 或类似格式 你好 我目前正在使用 lvgl、zephyr 和 GUI-Guider 为可穿戴设备开发图形用户界面。 我们希望在我们的项目中加入一些更复杂的动画,而这些动画很难通过现有的部件从头开始重新制作,为此,我们希望实现一些小视频,以便在需要时将其插入用户界面。 我已经能够通过将视频转换成一系列图片来创建 POC,但这需要大量的闪存空间,因为这种方法的压缩率非常有限。 我们的想法是使用更好的格式,如 h264 或类似格式。但似乎只有 i.MX RT1050 才支持这种功能。 有没有办法让它在 mimxrt595s 上运行,还是没有意义?我的研究使我相信,如果不将 ffmpeg 库链接到我们的 lvgl 实现,这是不可能的,这肯定需要一些移植工作,并且从我们的芯片中占用过多的闪存和 RAM,没有任何意义。 我最后的假设是否正确,或者在我们的情况下是否有办法节省资源? 顺祝商祺! 凯
View full article
Jellytideは本当に頑張っているのか?2026年のレビュー Jellytideは、ハリウッド映画のような恐怖を煽る戦術ではなく、現実的な停電時のサバイバル戦略に焦点を当てているため、2026年に最も話題になる防災システムの一つになりつつある。戦闘経験を持つダニエルズ氏が作成したこのプログラムは、実用的なガイド、段階的なビデオ、そして軍隊式の計画立案を組み合わせ、ファミリが長期停電、サイバー脅威、緊急事態に備えるための支援を提供する。ジェリータイド、準備完了 その際立った点は、初心者にも優しいアプローチであることだ。このシステムは、高価な地下壕や複雑なサバイバル装備を推奨するのではなく、水の貯蔵、予備電源、食料の確保、EMP対策、家庭での備えといった、手頃で実用的な対策に焦点を当てている。多くのユーザーは、このガイドがすべてを一般家庭でも実際に実行できる簡単な週末プロジェクトに分解している点を高く評価している。 2026年には、電力網の不安定性、異常気象、サプライチェーンの混乱に対する懸念が高まるにつれ、防災対策はニッチな趣味からメインストリームの話題へと変化した。Jellytideは、極端な「終末論的準備者」になることなく、安心感を求める家族向けに、体系的なサバイバルロードマップを提供することで、このトレンドに直接的に着目している。 買う価値はありますか?実践的な防災計画を求めている人にとって、その答えは「イエス」であるようだ。その価値は、システムの構成、シンプルさ、そして現実世界に焦点を当てている点にある。しかし、このガイドは、ユーザーが実際にその戦略を実行した場合にのみ効果を発揮する。これは、家庭の回復力と緊急事態への備えを段階的に向上させる意欲のある人に最適です。 詳細はこちらをご覧くださいhttps://tinyurl.com/2epyz5wu
View full article