Cortex-M7の 性 能 を 引 き 出 す ソフトウェア 開 発 April 2015 IAR Systems K.K. FAE Team
本 ドキュメントについて 的 Cortex-M7は 従 来 のマイコンよりも 性 能 が 幅 に 向 上 されている 特 徴 を 理 解 し ARM 統 合 開 発 環 境 ARM IAR Embedded Workbench (EWARM)を いて 性 能 を 引 き 出 すテクニックを 習 得 する 内 容 Cortex-M 市 場 とCortex-M7の 登 場 Cortex-M7の 性 能 を 引 き 出 す 開 発 環 境 ここが 新 しい! Cortex-M7 M7の 性 能 機 能 を 引 き 出 すためのEWARM 活 テクニック MPUを 理 解 し 使 いこなす TCMを 理 解 し 使 いこなす キャッシュを 理 解 し 使 いこなす STM32F7のFLASH ARTアクセラレータ Appendix MPU/Cache 関 連 レジスタ 本 ドキュメントは 2015 年 4 現 在 のIARシステムズWebサイトおよびEWARMバー ジョン7.40.2を 元 に 作 成 しています 2
IAR SYSTEMS A LEADING GLOBAL VENDOR 168 Employees with HQ in Uppsala, Sweden Listed in Stockholm/Nasdaq R&D investment 32% of revenue 32 years in the industry 24 hour technical support in 13 languages Uppsala Munich Sao Paulo Tokyo Seoul Shanghai London Paris San Francisco Dallas Boston Los Angeles +Distributor representation in 43 countries Stability and growth Licenses # (000 s) 20 15 10 5 2010-2013 Operating Margin % 20 15 10 5 0 2010 2011 2012 2013 License # Operating Margin 0
Cortex-M 市 場 とCortex-M7の 登 場
2015 年 超 性 能 マイコンCortex-M7 登 場 従 来 MPUでしか 対 応 できなかった 性 能 をマイコンで 実 現! 1GHz MMU 外 部 メモリ 開 発 難 易 度 い Cortex-A 600MHz 400MHz Cortex- M7 DOLBY SURROUND 7.1 ch 200MHz 100MHz 50MHz Cortex- M0 / M0+ Cortex- M3/M4 簡 単 超 性 能! DOLBY DIGITAL 2.1 ch 5
Cortex-M7のベンチマーク 性 能 実 績 1MHz 当 たりの 処 理 能 はシングルコアマイコンとして 世 界 最 速 (2015 年 4 現 在 ) マルチコアMPU Cortex-M7 http://www.eembc.org/coremark/index.php 2015 年 1 31 EEMBC.org Webサイトより 抜 粋 クロック 速 化 と 合 わせて 超 性 能 マイコンの 誕! 6
おさらい Cortex-Mマイコンの 普 及 Cortex-Mマイコンは この 数 年 で 世 界 中 の 幅 広 い 分 野 で 普 及 オーディオ ゲーム 機 カメラ 医 療 家 電 無 線 産 業 載 43.2 億 31.2 億 Cortex-M MCU 出 荷 個 数 10.3 億 19.1 億 ラインナップ 充 実 エコシステム 充 実 ソフト 資 産 充 実 2011 2012 2013 2014 http://ir.arm.com/phoenix.zhtml?c=197211&p=irol-reportsannual 2015 年 4 1 ARM Webサイトより 抜 粋 7
Cortex-M7の 性 能 を 引 き 出 す 開 発 環 境
IARシステムズとは? 社 コンパイラを 持 つ 組 込 み 開 発 環 境 の 専 メーカ 本 社 がスウェーデン グローバルに 展 開 従 業 員 170+ ローカルオフィス 12 拠 点 世 界 初 の 商 組 込 C 語 コンパイラメーカー 世 界 40ヵ 国 以 上 で 販 売 のべ10 万 ライセンスの 販 売 実 績 メーカによる 営 業 技 術 サポート GUI マニュアル 本 語 9
IARの 開 発 環 境 Embedded Workbench ビルド 機 能 とデバッグ 機 能 を 兼 ね 備 えた 統 合 開 発 環 境 プロジェクト 設 定 コーディング ビルド デバッグ トレース 解 析 STM8 ARM11 ARM9 8051 MSP430 ARM7 Cortex-A Cortex-R Cortex-M Embedded Workbench for ARM = EWARM 8 bit 16 bit 32 bit 10
Cortex-M7 開 発 環 境 としてのEWARM ハイパフォーマンスマイコンCortex-M7の 性 能 を 引 き 出 すには 優 れたコンパイラが 不 可 Cortex-M7 IAR EWARM http://www.eembc.org/coremark/index.php 2015 年 1 31 EEMBC.org Webサイトより 抜 粋 業 界 標 準 のベンチマークCoremarkで 最 速 度 として 採 されているのは Cortex-M7も 含 め IARシステムズのEWARM! 11
ここが 新 しい! Cortex-M7
Cortex-M4とCortex-M7の 仕 様 差 分 Cortex-M4とCortex-M7の 仕 様 差 分 Cortex-M4 Cortex-M7 命 令 セット Thumb2 Thumb2 DSP 拡 張 機 能 Single cycle 16/32-bit MAC Single cycle dual 16-bit MAC 8/16-bit SIMD arithmetic Hardware Divide (2-12 Cycles) Single cycle 16/32-bit MAC Single cycle dual 16-bit MAC 8/16-bit SIMD arithmetic Hardware Divide (2-12 Cycles) 浮 動 数 点 ユニット 単 精 度 浮 動 数 点 ユニット 単 精 度 / 倍 精 度 浮 動 数 点 ユニット パイプライン 3 段 + 投 機 的 分 岐 6 段 スーパースカラ + 分 岐 予 測 性 能 効 率 3.40 CoreMark/MHz 5.04 CoreMark/MHz 性 能 効 率 1.25 1.52 DMIPS/MHz 2.14 / 2.55 / 3.23 DMIPS/MHz 命 令 キャッシュ - 0 64kB 2ウェイ データ キャッシュ - 0 64kB 4ウェイ 命 令 TCM - 0 16MB データTCM - 0 16MB メモリ 保 護 オプションの8 領 域 MPU オプションの8または16 領 域 MPU http://www.arm.com/ja/products/processors/cortex-m/cortex-m4-processor.php http://www.arm.com/ja/products/processors/cortex-m/cortex-m7-processor.php 2015 年 4 1 ARM Webサイトより 抜 粋 13
ソフトウェア 開 発 から た Cortex-M4とCortex-M7の 差 分 M4 M7 3 段 パイプライン 6 段 パイプライン シングル 実 デュアル 実 同 じコードでもM4と べて 速 演 算 ( 約 1.5 倍 2 倍 ) DSP *FPU *MPU メモリ 保 護 ( 信 頼 性 ) メモリアクセス 遅 延 解 消 メモリアクセス 遅 延 解 消 DSP( 命 令 追 加 ) *FPU / 倍 精 度 FPU *MPU TCM( 密 結 合 メモリ) L1キャッシュ その 他 (ECCなど) 基 本 性 能 向 上 M7 のソフト 開 発 時 に 気 をつけるところは3 点! *はオプション 14
Cortex-M7 ベンチマーク 結 果 処 理 性 能 4.9 5.0 5.0 約 3.5 倍 1.4 コード/データ Flash/SRAM Flash/SRAM ITCM/DTCM ITCM/DTCM キャッシュ ON ON *Coremarkスコア EWARM7.30.1にて 実 測 15
M7の 性 能 機 能 を 引 き 出 すための EWARM 活 テクニック
今 回 使 うプロジェクト 構 成 (バブルソート) 意 されたデータをバブルソートで 並 び 替 える #include "include.h" #include "core_cm7.h" void low_level_init() { SCB->VTOR = 0x08000000; } void main(void) { printf("start n n"); BubbleSort(); printf(" nfinish n n"); } バブルソート 関 数 を 呼 ぶだけのmain 関 数 17
今 回 使 うプロジェクト 構 成 (バブルソート) #include <stdio.h> #include <intrinsics.h> void BubbleSort(); #define NUM_DATA 256 /* Data Number for sort * extern int original_data[ ]; #define CM7_REV 0x0001 #define MPU_PRESENT 1 #define NVIC_PRIO_BITS 4 #define Vendor_SysTickConfig 0 #define FPU_PRESENT 1 typedef enum IRQn { /****** Cortex-M7 Processor Exceptions Numbers ** NonMaskableInt_IRQn = -14, MemoryManagement_IRQn = -12, BusFault_IRQn = -11, UsageFault_IRQn = -10, SVCall_IRQn = -5, DebugMonitor_IRQn = -4, PendSV_IRQn = -2, SysTick_IRQn = -1 } IRQn_Type; 共 通 のincludeファイル 部 CMSIS の 定 義 あり 18
今 回 使 うプロジェクト 構 成 (バブルソート) #include "include.h" void BubbleSort() { int work_data[num_data]; int i, j, temp; } no_operation(); //copy data to stack for(i = 0; i < NUM_DATA;i++) { work_data[i] = original_data[i]; } no_operation(); //sort data for (i = 0; i < (NUM_DATA - 1); i++) { for (j = (NUM_DATA - 1); j > i; j--) { if (work_data[j - 1] > work_data[j]) { temp = work_data[j-1]; work_data[j-1] = work_data[j]; work_data[j]= temp; } } } no_operation(); //print the result for (i = 0; i < NUM_DATA ; i++) { printf("%d n", work_data[i]); } no_operation(); バブルソートの 本 体 データをローカル 変 数 にコピーして 並 び 替 え 19
今 回 使 うプロジェクト 構 成 (バブルソート) #include "include.h" int original_data[ ] = { 179, 255, 105, 74, 42, 117, 3, 13, 129, 31, 198, 59, 128, 119, 148, 2, 235, 177, 252, 155, 241, 94, 11, 174, 194, 114, 168, 113, 55, 92, 28, 50, 249, 78, 52, 73, 226, 206, 65, 188, 171, 70, 125, 75, 77, 165, 191, 208, 35, 214, 137, 93, 5, 17, 15, 217, 144, 204, 244, 149, 97, 82, 36, 222, 248, 229, 212, 170, 14, 133, 115, 10, 23, 26, 164, 126, 172, 192, 225, 151, 87, 224, 173, 147, 41, 182, 240, 175, 6, 228, 19, 86, 143, 135, 38, 91, 158, 118, 30, 58, 96, 108, 183, 60, 253, 178, 7, 72, 190, 123, 46, 80, 32, 51, 99, 84, 76, 237, 47, 215, 189, 16, 230, 246, 102, 132, 141, 139, 112, 163, 69, 209, 111, 29, 146, 63, 211, 54, 201, 238, 122, 150, 88, 213, 22, 40, 251, 98, 49, 216, 140, 130, 18, 184, 161, 127, 199, 120, 110, 256, 193, 186, 131, 61, 104, 185, 85, 197, 1, 233, 39, 245, 181, 116, 169, 220, 160, 101, 145, 134, 33, 81, 53, 247, 34, 242, 27, 234, 44, 121, 202, 138, 12, 67, 232, 236, 107, 187, 231, 64, 153, 180, 142, 66, 79, 100, 90, 152, 166, 250, 25, 56, 227, 167, 207, 196, 106, 109, 154, 239, 4, 210, 83, 8, 223, 57, 45, 20, 218, 159, 62, 136, 43, 157, 221, 203, 68, 200, 124, 162, 71, 95, 156, 89, 48, 103, 219, 176, 9, 243, 24, 37, 21, 195, 254, 205 }; 256 点 のint 型 (32bit)データ 配 列 20
今 回 使 うプロジェクト 構 成 (バブルソート) define symbol ICFEDIT_intvec_start = 0x08000000; /*-Memory Regions-*/ define symbol ICFEDIT_region_ITCM_RAM_start = 0x00000000; define symbol ICFEDIT_region_ITCM_RAM_end = 0x00003FFF; define symbol ICFEDIT_region_FLASH_start = 0x08000000; define symbol ICFEDIT_region_FLASH_end = 0x080FFFFF; define symbol ICFEDIT_region_DTCM_start = 0x20000000; define symbol ICFEDIT_region_DTCM_end = 0x2000FFFF; define symbol ICFEDIT_region_SRAM1_start = 0x20010000; define symbol ICFEDIT_region_SRAM1_end = 0x2004BFFF; define symbol ICFEDIT_region_SRAM2_start = 0x2004C000; define symbol ICFEDIT_region_SRAM2_end = 0x2004FFFF; /*-Sizes-*/ define symbol ICFEDIT_size_cstack = 0x800; define symbol ICFEDIT_size_heap = 0x800; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ITCM_RAM_region = mem:[from ICFEDIT_region_ITCM_RAM_start to ICFEDIT_region_ITCM_RAM_end ]; define region FLASH_region = mem:[from ICFEDIT_region_FLASH_start to ICFEDIT_region_FLASH_end ]; define region DTCM_region = mem:[from ICFEDIT_region_DTCM_start to ICFEDIT_region_DTCM_end ]; define region SRAM1_region = mem:[from ICFEDIT_region_SRAM1_start to ICFEDIT_region_SRAM1_end ]; define region SRAM2_region = mem:[from ICFEDIT_region_SRAM2_start to ICFEDIT_region_SRAM2_end ]; define block CSTACK with alignment = 8, size = ICFEDIT_size_cstack { }; define block HEAP with alignment = 8, size = ICFEDIT_size_heap { }; initialize by copy { readwrite }; do not initialize { section.noinit }; place at address mem: ICFEDIT_intvec_start { readonly section.intvec }; place in FLASH_region { readonly }; place in ITCM_RAM_region { }; place in DTCM_region { }; place in SRAM1_region { readwrite, block CSTACK, block HEAP}; place in SRAM2_region { }; メモリ 配 置 を 規 定 するIARオリジナルのリンカ 設 定 ファイル(.icf) 21
今 回 使 うプロジェクト 構 成 (バブルソート) オプション 設 定 ( 新 規 プロジェクトからの 差 分 ) [Cortex-M7] [CMSISを 使 する] [$PROJ_DIR$ m7.txt] [リンカマップファイルの 表 ] 22
まずは える 化 Cortex-M7ベンチマークテクニック 並 び 替 えの 実 処 理 を 計 測 ブレークポイント 間 のCPUレジスタの 変 化 で 測 定 可 能 現 在 のサイクル 数 前 回 のデバッガ 表 からの サイクル 増 加 数 23
まずは える 化 Cortex-M7ベンチマークテクニック CYCLECOUNTERが 変 わらない 時 は 機 能 を 有 効 化 することで 対 応 可 能 CYCLECOUNTERが 更 新 される Data Watchpoint and Trace unit DWT_CTRL > CYCNTENAを1に CPU 速 度 が200MHzのとき CCSTEPが826,801だったら 経 過 時 間 は4.134ms 24
メモリ 配 置 を 柔 軟 に リンカ 使 いこなしと 確 認 テクニック M7では TCM キャッシュの 使 い 分 けが 性 能 に きく 影 響 由 に 配 置 するには リンカの 基 本 的 な 使 い を 習 得 する 必 要 がある 0x2004C000 0x2004FFFF : 16KB 0x20010000 0x2004BFFF : 240KB 0x20000000 0x2000FFFF : 64KB 0x08000000 0x080FFFFF : 1024KB 0x00000000 0x00003FFF : 16KB SRAM2 SRAM1 DTCM RAM FLASH ITCM RAM データ コード 25
メモリ 配 置 を 柔 軟 に リンカ 使 いこなしと 確 認 テクニック EWARMのリンカ 名 称 はILINK ILINKでは4GBのメモリをRegionに 分 け 最 単 位 のセクションを 配 置 する SRAM2 SRAM1 DTCM RAM FLASH ITCM RAM Region(メモリ 空 間 ) Block Section Section Section Section Section 26
メモリ 配 置 を 柔 軟 に リンカ 使 いこなしと 確 認 テクニック リンカ 設 定 ファイルの 中 を てみる define symbol ICFEDIT_intvec_start = 0x08000000; /*-Memory Regions-*/ define symbol ICFEDIT_region_ITCM_RAM_start = 0x00000000; define symbol ICFEDIT_region_ITCM_RAM_end = 0x00003FFF; define symbol ICFEDIT_region_FLASH_start = 0x08000000; define symbol ICFEDIT_region_FLASH_end = 0x080FFFFF; define symbol ICFEDIT_region_DTCM_start = 0x20000000; define symbol ICFEDIT_region_DTCM_end = 0x2000FFFF; define symbol ICFEDIT_region_SRAM1_start = 0x20010000; define symbol ICFEDIT_region_SRAM1_end = 0x2004BFFF; define symbol ICFEDIT_region_SRAM2_start = 0x2004C000; define symbol ICFEDIT_region_SRAM2_end = 0x2004FFFF; /*-Sizes-*/ define symbol ICFEDIT_size_cstack = 0x800; define symbol ICFEDIT_size_heap = 0x800; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ITCM_RAM_region = mem:[from ICFEDIT_region_ITCM_RAM_start to ICFEDIT_region_ITCM_RAM_end ]; define region FLASH_region = mem:[from ICFEDIT_region_FLASH_start to ICFEDIT_region_FLASH_end ]; define region DTCM_region = mem:[from ICFEDIT_region_DTCM_start to ICFEDIT_region_DTCM_end ]; define region SRAM1_region = mem:[from ICFEDIT_region_SRAM1_start to ICFEDIT_region_SRAM1_end ]; define region SRAM2_region = mem:[from ICFEDIT_region_SRAM2_start to ICFEDIT_region_SRAM2_end ]; define block CSTACK with alignment = 8, size = ICFEDIT_size_cstack { }; define block HEAP with alignment = 8, size = ICFEDIT_size_heap { }; initialize by copy { readwrite }; do not initialize { section.noinit }; 初 期 化 時 のROM>RAM 展 開 指 place at address mem: ICFEDIT_intvec_start { readonly section.intvec }; アドレスシンボルの 宣 スタック ヒープブロックサイズの 宣 メモリ 領 域 定 義 スタック ヒープブロックの 定 義 ベクタテーブル 配 置 place in FLASH_region { readonly }; place in ITCM_RAM_region { }; place in DTCM_region { }; place in SRAM1_region { readwrite, block CSTACK, block HEAP}; place in SRAM2_region { }; どのメモリ 領 域 にどの( 属 性 の)セクションを 配 置 するか 指 27
メモリ 配 置 を 柔 軟 に リンカ 使 いこなしと 確 認 テクニック ビルド 後 のメモリ 配 置 状 況 はmapファイルで 確 認 できる [リンカマップファイルの 表 ]にチェックを れてビルド Output 以 下 にmapファイルが 成 される セクションごとの 配 置 アドレスなどが 確 認 可 能 28
メモリ 配 置 を 柔 軟 に リンカ 使 いこなしと 確 認 テクニック BubbleSort 関 数 をROM RAM 展 開 して 実 する #include "include.h" #pragma location="sram1_func" void BubbleSort() { int work_data[num_data]; int i, j, temp; } 1. 配 置 先 セク ションを 指 定 no_operation(); //copy data to stack for(i = 0; i < NUM_DATA;i++) { work_data[i] = original_data[i]; } no_operation(); //sort data for (i = 0; i < (NUM_DATA - 1); i++) { for (j = (NUM_DATA - 1); j > i; j--) { if (work_data[j - 1] > work_data[j]) { temp = work_data[j-1]; work_data[j-1] = work_data[j]; work_data[j]= temp; } } } no_operation(); //print the result for (i = 0; i < NUM_DATA ; i++) { printf("%d n", work_data[i]); } no_operation(); initialize by copy { readwrite }; initialize by copy { section sram1_func }; do not initialize { section.noinit }; place at address mem: ICFEDIT_intvec_start { readonly section.intvec }; place in FLASH_region { readonly }; place in ITCM_RAM_region { }; place in DTCM_region { }; place in SRAM1_region { readwrite, block CSTACK, block HEAP}; place in SRAM1_region { section sram1_func}; place in SRAM2_region { }; m7.icf 3.ROMからコピー 展 開 するセ クションであることを 指 定 2.セクションの 配 置 Regionを 指 定 sub.c 29
メモリ 配 置 を 柔 軟 に リンカ 使 いこなしと 確 認 テクニック マップファイルとデバッグ 実 時 のアドレスで RAM 実 を 確 認 0x20000000 台 は SRAM 領 域 30
最 適 化 でこんなに 変 わる! 適 用 テクニック C 語 の 最 適 化 設 定 で 各 種 処 理 性 能 は 幅 に 変 わる プロジェクトを 右 クリック SRAM 上 のStatic 変 数 をSRAM 上 のスタック(ローカル 変 数 )にコピー スタック 上 の 変 数 配 列 を 並 び 替 え Code Static Stack Data Copy (Cycle) BubbleSort (Cycle) FLASH SRAM SRAM 4,789 1,202,575 FLASH (High-Speed) SRAM SRAM 1,046 546,215 最 適 化 ( 速 度 ) 約 4.5 倍 約 2.2 倍
最 適 化 でこんなに 変 わる! 適 用 テクニック C 語 の 最 適 化 はプロジェクト 括 でも ソースコード 単 位 でも 指 定 可 能 Cファイルを 右 クリック [ 継 承 した 設 定 をオーバライド]にチェックして コンパイラオプションを 上 書 き 32
CMSISファイルを 活 用 して 簡 単 設 定 CMSISとは ARM 社 IARシステムズ 社 などが 共 同 で 作 成 した 標 準 規 格 CMSISファイル 群 にincludeパスを 設 定 [CMSISを 使 する]にチェックを れることでCMSISのIncludeディレクトリに プリプロセッサのinclude Pathが 規 定 される 33
CMSISファイルを 活 用 して 可 搬 性 を 確 保 Cortex-Mコアの 各 種 レジスタの 定 義 および 設 定 関 数 マクロが 規 定 若 冗 の 処 理 となるが 設 定 は 度 のみと 考 えるとデバイス 間 の メンテナンス 性 などを 考 慮 し 積 極 的 に 活 すべき 34
Cortex-M7の 標 準 初 期 化 処 理
アプリケーション 実 行 までにやるべきこと 初 期 設 定 として 実 すべきこと FPU 初 期 化 *オプション EWARMのランタイムライブラリが 実 MPU 初 期 化 プログラムで 処 理 キャッシュ 初 期 化 プログラムで 処 理 TCM 初 期 化 デフォルトで 有 効 なデバイスが 多 い データ 初 期 化 (ROM > RAMなど) EWARMのランタイムライブラリが 実 *カスタマイズも 可 能 36
MPUを 理 解 し 使 いこなす
MPU(メモリ 保 護 ユニット)とは? 領 域 ごとにアクセス 権 限 などを 設 定 できる 機 能 キャッシュの 設 定 にも 必 要 キャッシュ コード 実 ペリフェラル キャッシュ 無 効 実 不 可 不 正 コード 外 部 RAM キャッシュ 有 効 実 不 可 内 部 RAM DTCM キャッシュ 有 効 実 不 可 悪 意 あるプログラム コード ITCM キャッシュ 有 効 実 効 可 コードを 実 させない 38
MPUの 設 定 プロセス アプリケーション 設 計 に 合 わせて 分 に 検 討 を う メモリ 領 域 を 途 属 性 でどう 区 切 るか 決 める MPU 領 域 番 号 0 MPU 領 域 番 号 1 MPU 領 域 番 号 2 最 終 有 効 設 定 区 切 った 領 域 の 設 定 順 番 を 決 める 1 2 1 2 各 領 域 の 詳 細 設 定 を 決 める 0 0 レジスタ 値 をコーディングする 39
MPUの 設 定 プロセス MPU 関 連 レジスタをシーケンスに 沿 って 設 定 する MPU 無 効 化 (MPU>CTRL) MPU 領 域 開 始 アドレス+ 番 号 指 定 (MPU>RBAR) 該 当 領 域 の 属 性 +サイズ 指 定 (MPU>RASR) MPU 領 域 開 始 アドレス+ 番 号 指 定 (MPU>RBAR) MPU 領 域 ごとに 設 定 該 当 領 域 の 属 性 +サイズ 指 定 (MPU>RASR) MPU 有 効 化 (MPU>CTRL) 40
MPU 関 連 レジスタ 重 要 なのは 下 記 3レジスタ(M4と 共 通 ) 詳 細 はAppendix 参 照 MPU 有 効 化 MPU_CTRL: MPU Control Register 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 PRIVDEFENA HFNMIENA ENABLE MPU_RBAR: MPU Region Base Address Register 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ADDR VALID REGION MPU_RASR: MPU Region Attribute and Size Register 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 XN 開 始 アドレス AP TEX S C B SRD SIZE Region 番 号 ENABLE コード 実 不 可 権 限 制 御 キャッシュポリシーなど サブ 領 域 サイズ 有 効 化 http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihjddef.html http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihigffb.html http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihegaib.html 2015 年 4 1 ARM Webサイトより 抜 粋 41
MPUの 設 定 コード 例 Flash, SRAM, Peripheral, M7 Peripheralの 設 定 例 DMB(); //Disable MPU MPU->CTRL = 0x0UL << MPU_CTRL_ENABLE_Pos; // MPU Setting // Flash //MPU->RBAR = 0x08000010; MPU->RBAR = 0x08000000UL & MPU_RBAR_ADDR_Msk MPU_RBAR_VALID_Msk 0x0UL & MPU_RBAR_REGION_Msk; //MPU->RASR = 0x03020027; MPU->RASR = 0x03UL << MPU_RASR_AP_Pos MPU_RASR_C_Msk 0x13UL << MPU_RASR_SIZE_Pos MPU_RASR_ENABLE_Msk; // SRAM //MPU->RBAR = 0x20000011; MPU->RBAR = 0x20000000UL & MPU_RBAR_ADDR_Msk MPU_RBAR_VALID_Msk 0x1UL & MPU_RBAR_REGION_Msk; //MPU->RASR = 0x13070023; MPU->RASR = MPU_RASR_XN_Msk 0x03 << MPU_RASR_AP_Pos MPU_RASR_S_Msk MPU_RASR_C_Msk MPU_RASR_B_Msk 0x11 << MPU_RASR_SIZE_Pos MPU_RASR_ENABLE_Msk; ; // Peripheral //MPU->RBAR = 0x40000012; MPU->RBAR = 0x40000000UL & MPU_RBAR_ADDR_Msk MPU_RBAR_VALID_Msk 0x2UL & MPU_RBAR_REGION_Msk; //MPU->RASR = 0x13050039; MPU->RASR = MPU_RASR_XN_Msk 0x03 << MPU_RASR_AP_Pos MPU_RASR_S_Msk MPU_RASR_B_Msk 0x1C << MPU_RASR_SIZE_Pos MPU_RASR_ENABLE_Msk; // M7 Peripheral //MPU->RBAR = 0xE0000013; MPU->RBAR = 0xE0000000UL & MPU_RBAR_ADDR_Msk MPU_RBAR_VALID_Msk 0x3UL & MPU_RBAR_REGION_Msk ; //MPU->RASR = 0x13050039; MPU->RASR = MPU_RASR_XN_Msk 0x03 << MPU_RASR_AP_Pos MPU_RASR_S_Msk MPU_RASR_B_Msk 0x1C << MPU_RASR_SIZE_Pos MPU_RASR_ENABLE_Msk; //Enable MPU MPU->CTRL = MPU_CTRL_ENABLE_Msk; DSB(); ISB(); 42
MPU 違 反 が 発 した 場 合 例 外 が 発 し 例 外 ハンドラにジャンプする デフォルトだとHardFaultハンドラにジャンプ メモリマネジメントフォルトを 有 効 にすると MemManageハンドラにジャンプ SCB->SHCSR = SCB_SHCSR_MEMFAULTENA_Msk; 問 題 の 発 したアドレスが 判 断 できる 43
TCMを 理 解 し 使 いこなす
TCM( 密 結 合 メモリ)とは? 通 常 のメモリアクセスよりも 速 にアクセスできるメモリ 速 CPUに 対 するメモリアクセスボトルネックの 解 消 段 として 採 WAIT WAIT 実 遠 い CPU 早 すぎ 汗 通 常 メモリ 実 実 実 TCM 近 い 低 レイテンシアクセスを 確 保 できる ただし 容 量 は さいため クリティカルな 処 理 データを 配 置 して アプリケーションの 最 適 化 を う 45
メモリマップ 上 のTCM 領 域 コード 実 のITCMとデータアクセス のDTCMがある 通 常 のFlash SRAM 領 域 とくらべて 容 量 また 領 域 はRAM( 揮 発 性 )のため 起 動 時 ロードする 必 要 がある 0x2004C000 0x2004FFFF : 16KB SRAM2 0x20010000 0x2004BFFF : 240KB 0x20000000 0x2000FFFF : 64KB SRAM1 DTCM RAM データ 0x08000000 0x080FFFFF : 1024KB 0x00000000 0x00003FFF : 16KB FLASH ITCM RAM コード 46
TCMをリンカ 設 定 で 活 する Cソースコードで 配 置 先 セクションを リンカ 設 定 でセクションの 配 置 場 所 を 指 定 sub.c #include "include.h" #pragma location= "itcm_func" void BubbleSort() { BubbleSort 関 数 の 配 置 先 int work_data[num_data]; int i, j, temp; no_operation(); //copy data to stack for(i = 0; i < NUM_DATA;i++) { work_data[i] = original_data[i]; } no_operation(); data.c #include "include.h" #pragma location="dtcm_variable" int original_data[ ] = { original_data 配 列 の 配 置 先 179, 255, 105, 74, 42, 117, 3 m7.icf initialize by copy { readwrite }; initialize by copy { section itcm_func }; do not initialize { section.noinit }; place at address mem: ICFEDIT_intvec_start { readonly section.intvec }; place in FLASH_region { readonly }; place in ITCM_RAM_region {section itcm_func }; place in DTCM_region {section dtcm_variable }; place in SRAM1_region { readwrite, block CSTACK, block HEAP}; place in SRAM2_region { }; 47
キャッシュを 理 解 し 使 いこなす
キャッシュとは? 動 的 動 的 に 最 近 アクセスしたデータを 蓄 積 し アクセス 速 化 WAIT WAIT 実 遠 い 通 常 メモリ 実 実 実 ラッキー キャッシュに 残 ってた キャッシュ 通 常 メモリ 近 い アプリケーション 全 体 として アクセススピードは 改 善 される ただし キャッシュヒットするかどうかは そのときの 条 件 による 49
キャッシュの 設 定 プロセス データキャッシュ 命 令 キャッシュそれぞれにレジスタ 設 定 をする D-Cacheの 無 効 化 (PPB > DCISW) Cacheラインごとに 無 効 化 必 要 I-Cacheの 無 効 化 (PPB > ICIALLU) 度 の 処 理 で 無 効 化 D-Cacheの 有 効 化 (CCR) CCRのビットを てて 有 効 化 I-Cacheの 有 効 化 (CCR) CCRのビットを てて 有 効 化 50
キャッシュの 有 効 化 サンプルコード (データ) CMSISの core_cm7.h に キャッシュ 設 定 関 数 が 意 されている データキャッシュの 有 効 化 関 数 STATIC_INLINE void SCB_EnableDCache(void) { #if ( DCACHE_PRESENT == 1) uint32_t ccsidr, sshift, wshift, sw; uint32_t sets, ways; } ccsidr = SCB->CCSIDR; sets = CCSIDR_SETS(ccsidr); sshift = CCSIDR_LSSHIFT(ccsidr) + 4; ways = CCSIDR_WAYS(ccsidr); wshift = CLZ(ways) & 0x1f; DSB(); do { // invalidate D-Cache int32_t tmpways = ways; do { sw = ((tmpways << wshift) (sets << sshift)); SCB->DCISW = sw; } while(tmpways--); } while(sets--); DSB(); SCB->CCR = SCB_CCR_DC_Msk; // enable D-Cache DSB(); ISB(); #endif 51
キャッシュの 有 効 化 サンプルコード ( 命 令 ) CMSISの core_cm7.h に キャッシュ 設 定 関 数 が 意 されている 命 令 キャッシュの 有 効 化 関 数 STATIC_INLINE void SCB_EnableICache(void) { #if ( ICACHE_PRESENT == 1) DSB(); ISB(); SCB->ICIALLU = 0; // invalidate I-Cache SCB->CCR = SCB_CCR_IC_Msk; // enable I-Cache DSB(); ISB(); #endif } 命 令 が 確 実 に 設 定 されるように メモリバリア 命 令 を 適 している 52
STM32F7のFLASH ARTアクセラレータ
STM32F7のFLASH ARTアクセラレータ Flash 領 域 にTCM 経 由 でアクセスができ ARTを 有 効 にすることで 速 アクセスができる 0x2004C000 0x2004FFFF : 16KB SRAM2 0x20010000 0x2004BFFF : 240KB SRAM1 データ AXIM TCM 0x20000000 0x2000FFFF : 64KB 0x00200000 0x002FFFFF : 1024KB or 0x08000000 0x080FFFFF : 1024KB キャッシュ DTCM RAM FLASH コード 0x00000000 0x00003FFF : 16KB ITCM RAM 54
STM32F7のFLASH ARTアクセラレータ ARTはレジスタ 設 定 で 有 効 にする FLASH_ACR:Flash access control register 0x4002-3C00 Type: RW Reset Value: 0x0000-0000 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ARTEN LATENCY http://www.st.com/st-web-ui/static/active/en/resource/technical/document/data_brief/dm00116941.pdf 2015 年 4 1 ST 社 Webサイトより 抜 粋 TCM 経 由 (0x0020xxxx)から 起 動 するか AXIM(0x0800xxxx)から 起 動 するかは BOOT_PINの 状 態 と OptionByteのBOOT_ADD0/1で 決 定 される 詳 細 はSTM32F7xxリファレンスマニュアルを 参 照 55
STM32F7のFLASH ARTアクセラレータ ST 社 提 供 stm32f7xx_hal_flash.hにart 有 効 / 無 効 関 数 が 含 まれている 56
パフォーマンス 評 価 結 果
STM32F7の 設 定 差 分 による 性 能 評 価 配 置 領 域 設 定 により 性 能 は きく 異 なる Code Static Stack Icache DCache Data Copy (Cycle) BubbleSort (Cycle) FLASH SRAM SRAM 4,789 1,202,575 FLASH SRAM SRAM Yes 7,371 1,341,410 FLASH SRAM SRAM Yes 4,779 934,650 FLASH SRAM SRAM Yes Yes 1,817 460,829 ITCM_FLASH SRAM SRAM 7,473 1,039,525 ITCM_FLASH SRAM SRAM Yes 4,362 901,197 ITCM_FLASH SRAM SRAM Yes 4,791 1,010,178 ITCM_FLASH SRAM SRAM Yes Yes 5,950 935,851 ITCM_FLASH +ART SRAM SRAM 3,117 934,561 ITCM_FLASH +ART SRAM SRAM Yes 1,803 455,859 ITCM_FLASH +ART SRAM SRAM Yes 3,117 934,576 ITCM_FLASH +ART SRAM SRAM Yes Yes 1,805 460,804 ITCM DTCM SRAM 1,579 930,088 ITCM DTCM SRAM Yes 1,579 455,937 ITCM DTCM SRAM Yes 1,579 929,901 ITCM DTCM SRAM Yes Yes 1,579 455,861 ITCM DTCM DTCM 1,579 455,979 ITCM DTCM DTCM Yes 1,579 455,940 ITCM DTCM DTCM Yes 1,579 455,905 ITCM DTCM DTCM Yes Yes 1,579 455,858 58
まとめ
まとめ Cortex-M7の 性 能 を 引 き 出 すためには 各 種 機 能 特 性 を 理 解 し アプリ ケーションにあった 設 計 が 必 要 性 能 なコンパイラを 持 つ 開 発 環 境 を 使 する 必 要 がある 実 際 には 動 作 をさせながら 評 価 をしながら アプリケーションの 最 適 化 を 進 めていく 開 発 環 境 の 提 供 する 各 種 設 定 法 を 理 解 し またベンチマークやメモリマッ プの 確 認 法 を 習 得 することで 開 発 するアプリケーションにあった 最 適 化 を 進 めることができる 60
Appendix MPU/Cache 関 連 レジスタ
MPU: MPU Control Register MPU 機 能 全 体 の 制 御 レジスタ MPU_CTRL: MPU Control Register 0xE000-ED94 Type: RW Reset Value: 0x0x0000-0000 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 PRIVDEFENA HFNMIENA ENABLE Bit Name 説 明 2 PRIVDEFENA 0: Default Memory map が 無 効 1: 特 権 (Privilege) 時 に Default memory mapをbackground Regionとしてアクセス 可 能 1 HFNMIENA 0: HardFault 時 やNMI 例 外 時 にMPUを 無 効 にする 1: HardFault 時 やNMI 例 外 時 でもMPUを 有 効 にする 0 ENABLE 0: MPUを 無 効 にする 1: MPUを 有 効 にする http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihjddef.html 2015 年 4 1 ARM Webサイトより 抜 粋 62
MPU: MPU Region Base Address Register MPU 領 域 の 開 始 アドレスとRegion 番 号 の 指 定 MPU_RBAR: MPU Region Base Address Register 0xE000-ED9C Type: RW Reset Value: Unknown 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ADDR VALID REGION Bit Name 説 明 31:5 ADDR Regionの 開 始 アドレス(base address) 4 VALID 0: MPU_RNR.REGIONで 指 定 したRegion 番 号 の 開 始 アドレスがADDRで 指 定 される 1: 本 レジスタのREGIONで 指 定 したRegion 番 号 の 開 始 アドレスがADDRで 指 定 される 3:0 REGION VALIDが1のとき MPU_RNR.REGIONを 上 書 き http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihigffb.html 2015 年 4 1 ARM Webサイトより 抜 粋 63
MPU: MPU Region Attribute and Size Register (1/3) MPU 領 域 の 詳 細 設 定 レジスタ MPU_RASR: MPU Region Attribute and Size Register 0xE000EDA0 Type: RW Reset Value: Unknown 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 XN AP TEX S C B SRD SIZE ENABLE Bit Name 説 明 28 XN Execution Never 0: 命 令 コード 実 可 能 1: 命 令 コード 実 不 可 26:24 AP Access and Privilege 21:16 TEX,S,C,B 15-8 SRD Sub-region Disable 1: Regionを8 分 割 した 該 当 Sub-Regionの 設 定 無 効 Bit15: もっとも いアドレス 領 域 Bit8: もっとも 低 いアドレス 領 域 5:1 SIZE 該 当 Regionのサイズ 指 定 2の(SIZE+1) 乗 最 の 値 は4: 32 Byte 0 ENABLE 0: 該 当 Regionは 無 効 1: MPU 有 効 時 該 当 Regionは 有 効 http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihegaib.html 2015 年 4 1 ARM Webサイトより 抜 粋 64
MPU: MPU Region Attribute and Size Register (2/3) 特 権 / 特 権 時 のアクセス 制 御 & 領 域 サイズ 指 定 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 XN AP TEX S C B SRD SIZE ENABLE AP 特 権 (Privileged) 特 権 (Unprivileged) 000 No Access No access 001 Read / Write No access 010 Read / Write Read-only 011 Read / Write Read/Write 101 Read-Only No access 110 Read-Only Read-only 111 Read-Only Read-only SIZE Region size 00100(4) 32 B 01001(9) 1KB 10011(19) 1MB 11101(29) 1GB 11111(31) 4GB http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihegaib.html 2015 年 4 1 ARM Webサイトより 抜 粋 65
MPU: MPU Region Attribute and Size Register (3/3) キャッシュ 共 有 アクセス 制 御 ビット 組 み 合 わせで 設 定 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 XN AP TEX S C B SRD SIZE ENABLE TEX C B Memory Type 説 明 共 有 000 0 0 ストロングオーダ 共 有 可 (Strongly-ordered) 000 0 1 デバイス(Device) 共 有 デバイス 共 有 可 000 1 0 ノーマル(Normal) ライトスルー(Write-Through) S bit 書 込 割 り 当 て(Write Allocate)なし 000 1 1 ノーマル(Normal) ライトバック(Write-Back) S bit 書 込 割 り 当 て(Write Allocate)なし 001 0 0 ノーマル(Normal) キャッシュなし S bit 001 1 1 ノーマル(Normal) ライトバック(Write-Back) S bit 書 込 読 込 割 り 当 て(Write Allocate)あ り 010 0 0 デバイス(Device) 共 有 デバイス 共 有 不 可 1BB A A ノーマル(Normal) キャッシュメモリ AA: 内 部 ポリシー(Inner Policy) BB: 外 部 ポリシー(Outer Policy) S bit 00 : キャッシュなし 01: ライトバック 割 り 当 てあり 10: ライトスルー 割 り 当 てなし 11: ライトバック 割 り 当 てなし http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/cihegaib.html 2015 年 4 1 ARM Webサイトより 抜 粋 66
Cache: Data cache invalidate by Set/Way データキャッシュのSet Wayを 指 定 して 無 効 化 DCISW: Data cache invalidate by Set/Way 0xE000-EF60 Type: WO Reset Value: Unknown 31 32-A 31-A B B-1 L L-1 4 3 2 1 0 Way SBZ Set SBZ Level 0 Bit Name 説 明 31-32-A Way 操 作 するWay 数 31-A: B SBZ 常 に0 B-1:L Set 操 作 するSet 数 L-1:4 SBZ 常 に0 3:1 Level 操 作 するCache level -1. Ex. 0 : L1 cache http://infocenter.arm.com/help/topic/com.arm.doc.ddi0489b/ddi0489b_cortex_m7_trm.pdf 2015 年 4 1 ARM Webサイトより 抜 粋 67
Cache: Instruction cache invalidate All to PoU Writeアクセスで 命 令 キャッシュを 無 効 化 ICIALLU: Instruction cache invalidate all to PoU (Point of unification) 0xE000-EF50 Type: WO Reset Value: Unknown 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Ignored Bit Name 説 明 All IGNORED WriteアクセスでInstruction CacheをInvalidate 化 すべてのbitは 無 視. http://infocenter.arm.com/help/topic/com.arm.doc.ddi0489b/ddi0489b_cortex_m7_trm.pdf 2015 年 4 1 ARM Webサイトより 抜 粋 68
Cache: Configuration and Control Register ビットアサインで 命 令 キャッシュとデータキャッシュを 有 効 化 CCR: Configuration and Control Register 0xE000-ED14 Type: RW Reset Value: 0x00040200 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 BP IC DC STKALIGN BFHFNMIGN DIV_0_TRP UNALIGN_TRP USERSETMPEND NONBASETHRDENA Bit Name 説 明 18 BP 分 岐 予 測 (Brance prediction) 有 効 M7では 常 に1 17 IC 0: Instruction Cache 無 効 1: Instruction Cache 有 効 16 DC 0: Data Cache 無 効 1: Data Cache 有 効 http://infocenter.arm.com/help/topic/com.arm.doc.ddi0489b/ddi0489b_cortex_m7_trm.pdf 2015 年 4 1 ARM Webサイトより 抜 粋 69
本 資 料 について
本 資 料 取 り 扱 い 上 の 注 意 本 資 料 は2015 年 4 1 時 点 の 情 報 を 基 に 作 成 されており 将 来 変 更 の 可 能 性 のあるものです あわせてご 紹 介 する 設 定 や 機 能 に 関 連 して 動 作 保 証 をお 約 束 す るものではございませんので ご 了 承 ください 本 資 料 で 提 供 している 情 報 は ご 利 されている のご 判 断 責 任 においてご 使 ください 提 供 した 情 報 に 関 連 して ご 利 される が 不 利 益 等 を 被 る 事 態 が じ たとしても 弊 社 及 び 執 筆 者 は 切 の 責 任 を 負 いかねますので ご 了 承 ください 本 資 料 の 内 容 に 関 する 弊 社 または 各 社 へのお 問 合 せはご 遠 慮 ください 本 資 料 及 びデータの 再 配 布 無 断 転 転 載 等 はご 遠 慮 ください 71
商 標 について IAR Systems, IAR Embedded Workbench, C-SPY, C-RUN, C-STAT, visualstate, Focus on Your Code, IAR KickStart Kit, I-jet, I-scope, IAR, お よび IAR Systems のロゴタイプはIAR Systems ABが 所 有 する 商 標 または 登 録 商 標 です ARMおよびCortexは ARM Limited(またはその 会 社 )のEUまたはその 他 の 国 における 登 録 商 標 です CoreSightは ARM Limited(またはその 会 社 )の EUまたはその 他 の 国 における 商 標 です All rights reserved. STM32は STマイクロエレクトロニクスの 登 録 商 標 です その 他 本 資 料 中 の 製 品 名 やサービス 名 は 全 てそれぞれの 所 有 者 に 属 する 商 標 ま たは 登 録 商 標 です 72