2368944_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2368944_ja-JP

2368944_ja-JP

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

Gavin_Jia_0-1779342138046.png

簡単な比較を行ったところ、SDRAM書き込みテスト中にANSWは以下の設定を使用していることがわかりました。通常のメモリ特性、純粋な32ビットシーケンシャル書き込み、書き込み後のDSB。

該当する実験を実施する際には、このANSWを参照することをお勧めします。

よろしくお願いします、
ギャビン


タグ(1)
評価なし
バージョン履歴
最終更新日:
‎05-21-2026 02:42 AM
更新者: