72
April 2015 IAR Systems K.K. FAE Team Cortex-M7の性能を引き出す ソフトウェア開発

Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

April 2015IAR Systems K.K.FAE Team

Cortex-M7の性能を引き出すソフトウェア開発

Page 2: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

本ドキュメントについて

2

⽬的 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を元に作成しています。

Page 3: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

168 Employees with HQ in Uppsala, Sweden

Listed in Stockholm/Nasdaq

R&D investment 32% of revenue

32 years in the industry

UppsalaMunichSao PauloTokyoSeoulShanghai

LondonParisSan FranciscoDallasBostonLos Angeles

+Distributor representation in

43 countries

24 hour technical support in

13 languages

0

5

10

15

20

0

5

10

15

20

2010 2011 2012 2013License # Operating Margin

Licenses# (000’s)

Operating Margin %

2010 - 2013

Stability and growth

IAR SYSTEMS— A LEADING GLOBAL VENDOR

Page 4: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M市場とCortex-M7の登場

Page 5: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

2015年 超⾼性能マイコンCortex-M7登場

従来MPUでしか対応できなかった性能をマイコンで実現!

5

50MHz

100MHz

200MHz

400MHz

600MHz

1GHz

Cortex-M0 / M0+

Cortex-M3/M4

MMU、外部メモリ開発難易度⾼い・・

Cortex-M7

Cortex-A

簡単・超⾼性能! DOLBYDIGITAL 2.1 ch

DOLBYSURROUND 7.1 ch

Page 6: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M7のベンチマーク性能実績

1MHz当たりの処理能⼒はシングルコアマイコンとして世界最速(2015年4⽉現在)

6

Cortex-M7

http://www.eembc.org/coremark/index.php 2015年1⽉31⽇ EEMBC.org Webサイトより抜粋

クロック⾼速化と合わせて、超⾼性能マイコンの誕⽣!

マルチコアMPU

Page 7: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

おさらい、Cortex-Mマイコンの普及

Cortex-Mマイコンは、この数年で世界中の幅広い分野で普及

7

Cortex-MMCU出荷個数

オーディオ

カメラゲーム機 産業無線家電 ⾞載医療

2011 2012 2013 2014

10.3億19.1億

31.2億

• ラインナップ充実• エコシステム充実• ソフト資産充実

43.2億

http://ir.arm.com/phoenix.zhtml?c=197211&p=irol-reportsannual 2015年4⽉1⽇ ARM Webサイトより抜粋

Page 8: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M7の性能を引き出す開発環境

Page 9: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

IARシステムズとは?

⾃社コンパイラを持つ、組込み開発環境の専⾨メーカ

9

世界初の商⽤組込C⾔語コンパイラメーカー

世界40ヵ国以上で販売。のべ10万ライセンスの販売実績

メーカによる営業・技術サポート

GUI・マニュアル⽇本語

従業員170+ ローカルオフィス 12拠点

本社がスウェーデングローバルに展開

Page 10: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

IARの開発環境Embedded Workbench

ビルド機能とデバッグ機能を兼ね備えた統合開発環境

10

8051 MSP430 ARM7

ARM9

ARM11

Cortex-M

Cortex-R

Cortex-A

8 bit 16 bit 32 bit

デバッグプロジェクト設定 コーディング ビルド トレース 解析

Embedded Workbench for ARM= EWARM

STM8

Page 11: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M7開発環境としてのEWARM

ハイパフォーマンスマイコンCortex-M7の性能を引き出すには優れたコンパイラが不可⽋

11

業界標準のベンチマークCoremarkで最⾼速度として採⽤されているのは、Cortex-M7も含め、IARシステムズのEWARM!

IAR EWARM

Cortex-M7

http://www.eembc.org/coremark/index.php 2015年1⽉31⽇ EEMBC.org Webサイトより抜粋

Page 12: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

ここが新しい! Cortex-M7

Page 13: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M4とCortex-M7の仕様差分

Cortex-M4とCortex-M7の仕様差分

13

Cortex-M4 Cortex-M7命令セット Thumb2 Thumb2

DSP拡張機能 Single cycle 16/32-bit MACSingle cycle dual 16-bit MAC

8/16-bit SIMD arithmeticHardware Divide (2-12 Cycles)

Single cycle 16/32-bit MACSingle cycle dual 16-bit MAC

8/16-bit SIMD arithmeticHardware 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.phphttp://www.arm.com/ja/products/processors/cortex-m/cortex-m7-processor.php 2015年4⽉1⽇ ARM Webサイトより抜粋

Page 14: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

ソフトウェア開発から⾒たCortex-M4とCortex-M7の差分

14

DSP

*FPU

M7

3段パイプライン 6段パイプライン

シングル実⾏ デュアル実⾏

TCM(密結合メモリ)

*MPU

L1キャッシュ

DSP(命令追加)

*FPU / 倍精度FPU

*MPU

M4

*はオプションその他(ECCなど)

M7⽤のソフト開発時に気をつけるところは3点!

基本性能向上

同じコードでもM4と⽐べて⾼速演算(約1.5倍〜2倍)

メモリ保護(信頼性)

メモリアクセス遅延解消

メモリアクセス遅延解消

Page 15: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M7 ベンチマーク結果

15

処理性能

コード/データ

キャッシュ

Flash/SRAM Flash/SRAM

ON

ITCM/DTCM ITCM/DTCM

ON

1.4

4.9 5.0 5.0

*Coremarkスコア EWARM7.30.1にて実測

約3.5倍

Page 16: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

M7の性能・機能を引き出すためのEWARM活⽤テクニック

Page 17: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

今回使うプロジェクト構成(バブルソート)

⽤意されたデータをバブルソートで並び替える

17

#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関数

Page 18: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

今回使うプロジェクト構成(バブルソート)

18

#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⽤の定義あり

Page 19: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

今回使うプロジェクト構成(バブルソート)

19

#include "include.h"

void BubbleSort(){

int work_data[NUM_DATA];int i, j, temp;

__no_operation();//copy data to stackfor(i = 0; i < NUM_DATA;i++) {work_data[i] = original_data[i];

}__no_operation();//sort datafor (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 resultfor (i = 0; i < NUM_DATA ; i++) {printf("%d¥n", work_data[i]);

}__no_operation();

}

バブルソートの本体。データをローカル変数にコピーして並び替え。

Page 20: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

今回使うプロジェクト構成(バブルソート)

20

#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)データ配列。

Page 21: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

今回使うプロジェクト構成(バブルソート)

21

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)

Page 22: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

今回使うプロジェクト構成(バブルソート)

オプション設定 (新規プロジェクトからの差分)

22

[Cortex-M7]

[CMSISを使⽤する]

[$PROJ_DIR$¥m7.txt][リンカマップファイルの表⽰]

Page 23: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

まずは「⾒える化」Cortex-M7ベンチマークテクニック

並び替えの実処理を計測。ブレークポイント間のCPUレジスタの変化で測定可能

23

現在のサイクル数

前回のデバッガ表⽰からのサイクル増加数

Page 24: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

まずは「⾒える化」Cortex-M7ベンチマークテクニック

CYCLECOUNTERが変わらない時は、機能を有効化することで対応可能

24

Data Watchpoint and Trace unitDWT_CTRL > CYCNTENAを1に

CYCLECOUNTERが更新される

CPU速度が200MHzのとき、CCSTEPが826,801だったら経過時間は4.134ms

Page 25: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリ配置を柔軟にリンカ使いこなしと確認テクニック

M7では、TCM、キャッシュの使い分けが、性能に⼤きく影響⾃由に配置するには、リンカの基本的な使い⽅を習得する必要がある

25

ITCM RAM

FLASH

DTCM RAM

SRAM1

0x00000000 – 0x00003FFF : 16KB

0x08000000 – 0x080FFFFF : 1024KB

0x20000000 – 0x2000FFFF : 64KB

0x20010000 – 0x2004BFFF : 240KB

コード⽤

データ⽤

SRAM20x2004C000 – 0x2004FFFF : 16KB

Page 26: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリ配置を柔軟にリンカ使いこなしと確認テクニック

EWARMのリンカ名称はILINK。ILINKでは4GBのメモリをRegionに分け、最⼩単位のセクションを配置する

26

ITCM RAM

FLASH

DTCM RAM

SRAM1

SRAM2Region(メモリ空間)

Block

Section

Section

Section

Section

Section

Page 27: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリ配置を柔軟にリンカ使いこなしと確認テクニック

リンカ設定ファイルの中⾝を⾒てみる

27

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 { };

メモリ領域定義

スタック、ヒープブロックの定義

初期化時のROM>RAM展開指⽰

ベクタテーブル配置

どのメモリ領域にどの(属性の)セクションを配置するか指⽰

アドレスシンボルの宣⾔

スタック、ヒープブロックサイズの宣⾔

Page 28: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリ配置を柔軟にリンカ使いこなしと確認テクニック

ビルド後のメモリ配置状況はmapファイルで確認できる

28

[リンカマップファイルの表⽰]にチェックを⼊れてビルド

セクションごとの配置アドレスなどが確認可能Output以下にmapファイルが⽣成される

Page 29: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリ配置を柔軟にリンカ使いこなしと確認テクニック

BubbleSort関数をROM⇒RAM展開して実⾏する

29

#include "include.h"#pragma location="sram1_func"void BubbleSort(){

int work_data[NUM_DATA];int i, j, temp;

__no_operation();//copy data to stackfor(i = 0; i < NUM_DATA;i++) {work_data[i] = original_data[i];

}__no_operation();//sort datafor (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 resultfor (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__ { readonlysection .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 { };

sub.c

m7.icf

1.配置先セクションを指定

2.セクションの配置Regionを指定

3.ROMからコピー展開するセクションであることを指定

Page 30: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリ配置を柔軟にリンカ使いこなしと確認テクニック

マップファイルとデバッグ実⾏時のアドレスで、RAM実⾏を確認

30

0x20000000台は、SRAM領域

Page 31: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

「最適化」でこんなに変わる!適用テクニック

C⾔語の最適化設定で、各種処理性能は⼤幅に変わる

プロジェクトを右クリック

Code Static Stack Data Copy (Cycle) BubbleSort (Cycle)FLASH SRAM SRAM 4,789 1,202,575FLASH (High-Speed) SRAM SRAM 1,046 546,215

SRAM上のStatic変数をSRAM上のスタック(ローカル変

数)にコピー

スタック上の変数配列を並び替え

最適化 ⾼(速度) 約4.5倍 約2.2倍

Page 32: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

「最適化」でこんなに変わる!適用テクニック

C⾔語の最適化はプロジェクト⼀括でも、ソースコード単位でも指定可能

32

Cファイルを右クリック

[継承した設定をオーバライド]にチェックしてコンパイラオプションを上書き

Page 33: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

CMSISファイルを活用して、簡単設定

CMSISとは、ARM社 IARシステムズ社などが共同で作成した標準規格CMSISファイル群にincludeパスを設定

33

[CMSISを使⽤する]にチェックを⼊れることでCMSISのIncludeディレクトリにプリプロセッサのinclude Pathが規定される

Page 34: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

CMSISファイルを活用して、可搬性を確保

Cortex-Mコアの各種レジスタの定義および、設定関数、マクロが規定

34

若⼲冗⻑の処理となるが、設定は⼀度のみと考えるとデバイス間のメンテナンス性などを考慮し、積極的に活⽤すべき

Page 35: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cortex-M7の標準初期化処理

Page 36: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

アプリケーション実行までにやるべきこと

初期設定として、実⾏すべきこと

36

FPU初期化 *オプション

MPU初期化

キャッシュ初期化

TCM初期化

データ初期化(ROM > RAMなど)

EWARMのランタイムライブラリが実⾏

EWARMのランタイムライブラリが実⾏*カスタマイズも可能

プログラムで処理

プログラムで処理

デフォルトで有効なデバイスが多い

Page 37: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPUを理解し、使いこなす

Page 38: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU(メモリ保護ユニット)とは?

領域ごとにアクセス権限などを設定できる機能。キャッシュの設定にも必要

38

ITCM

DTCM内部RAM

コード

ペリフェラル

外部RAM

キャッシュ

不正コードキャッシュ無効

キャッシュ有効

キャッシュ有効

キャッシュ有効

実⾏不可

実⾏不可

実⾏不可

実効可コードを実⾏させない

悪意あるプログラム

コード実⾏

Page 39: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPUの設定プロセス

アプリケーション設計に合わせて、⼗分に検討を⾏う。

39

メモリ領域を⽤途・属性でどう区切るか決める

区切った領域の設定順番を決める

各領域の詳細設定を決める

レジスタ値をコーディングする

0

12

0

12

MPU領域番号0

MPU領域番号1

MPU領域番号2

最終有効設定

Page 40: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPUの設定プロセス

MPU関連レジスタをシーケンスに沿って設定する

40

MPU無効化 (MPU>CTRL)

MPU領域開始アドレス+番号指定(MPU>RBAR)

該当領域の属性+サイズ指定(MPU>RASR)

MPU有効化 (MPU>CTRL)

MPU領域開始アドレス+番号指定(MPU>RBAR)

該当領域の属性+サイズ指定(MPU>RASR)

MPU領域ごとに設定

Page 41: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU関連レジスタ

重要なのは、下記3レジスタ(M4と共通)。詳細はAppendix参照

41

MPU_CTRL: MPU Control Register31 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

PR

IVD

EFE

NA

HFN

MIE

NA

EN

AB

LE

MPU_RBAR: MPU Region Base Address Register31 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 VALI

D

REGION

MPU_RASR: MPU Region Attribute and Size Register31 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

EN

AB

LE

MPU有効化

開始アドレス

Region番号

コード実⾏不可 権限制御 キャッシュポリシーなど サブ領域 サイズ 有効化

http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/Cihjddef.htmlhttp://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/Cihigffb.htmlhttp://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/Cihegaib.html 2015年4⽉1⽇ ARM Webサイトより抜粋

Page 42: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPUの設定コード例

Flash, SRAM, Peripheral, M7 Peripheralの設定例

42

__DMB();//Disable MPUMPU->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 MPUMPU->CTRL = MPU_CTRL_ENABLE_Msk;

__DSB();__ISB();

Page 43: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU違反が発⽣した場合

例外が発⽣し、例外ハンドラにジャンプする

43

SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;

デフォルトだとHardFaultハンドラにジャンプ

メモリマネジメントフォルトを有効にするとMemManageハンドラにジャンプ

問題の発⽣したアドレスが判断できる

Page 44: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

TCMを理解し、使いこなす

Page 45: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

TCM(密結合メモリ)とは?

通常のメモリアクセスよりも⾼速にアクセスできるメモリ

45

CPU早すぎ・・汗WAITWAIT実⾏

通常メモリ

♪実⾏実⾏実⾏ TCM

遠い

近い

⾼速CPUに対するメモリアクセスボトルネックの解消⼿段として採⽤

低レイテンシアクセスを確保できる。ただし、容量は⼩さいためクリティカルな処理・データを配置して、アプリケーションの最適化を⾏う

Page 46: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

メモリマップ上のTCM領域

コード実⾏⽤のITCMとデータアクセス⽤のDTCMがある。通常のFlash、SRAM領域とくらべて⼩容量。また、領域はRAM(揮発性)のため、起動時ロードする必要がある。

46

ITCM RAM

FLASH

DTCM RAM

SRAM1

0x00000000 – 0x00003FFF : 16KB

0x08000000 – 0x080FFFFF : 1024KB

0x20000000 – 0x2000FFFF : 64KB

0x20010000 – 0x2004BFFF : 240KB

コード⽤

データ⽤

SRAM20x2004C000 – 0x2004FFFF : 16KB

Page 47: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

TCMをリンカ設定で活⽤する

Cソースコードで配置先セクションを、リンカ設定でセクションの配置場所を指定

47

#include "include.h"#pragma location= "itcm_func"void BubbleSort(){

int work_data[NUM_DATA];int i, j, temp;

__no_operation();//copy data to stackfor(i = 0; i < NUM_DATA;i++) {

work_data[i] = original_data[i];}__no_operation();

#include "include.h"

#pragma location="dtcm_variable"int original_data[ ] = {

179, 255, 105, 74, 42, 117, 3

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 { };

sub.c

data.c

m7.icfBubbleSort関数の配置先

original_data配列の配置先

Page 48: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

キャッシュを理解し、使いこなす

Page 49: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

キャッシュとは?

動的・⾃動的に最近アクセスしたデータを蓄積し、アクセス⾼速化

49

WAITWAIT実⾏

通常メモリ

実⾏実⾏実⾏ キャッシュ

遠い

近い

ラッキー♪キャッシュに残ってた

通常メモリ

アプリケーション全体として、アクセススピードは改善される。ただし、キャッシュヒットするかどうかは、そのときの条件による。

Page 50: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

キャッシュの設定プロセス

データキャッシュ、命令キャッシュそれぞれにレジスタ設定をする

50

D-Cacheの無効化(PPB > DCISW)

I-Cacheの無効化(PPB > ICIALLU)

D-Cacheの有効化(CCR)

I-Cacheの有効化(CCR)

Cacheラインごとに無効化必要

⼀度の処理で無効化

CCRのビットを⽴てて有効化

CCRのビットを⽴てて有効化

Page 51: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

キャッシュの有効化サンプルコード (データ)

CMSISの “core_cm7.h”に、キャッシュ設定関数が⽤意されている。

51

__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-Cacheint32_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}

データキャッシュの有効化関数

Page 52: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

キャッシュの有効化サンプルコード (命令)

CMSISの “core_cm7.h”に、キャッシュ設定関数が⽤意されている。

52

命令キャッシュの有効化関数

__STATIC_INLINE void SCB_EnableICache(void){#if (__ICACHE_PRESENT == 1)__DSB();__ISB();SCB->ICIALLU = 0; // invalidate I-CacheSCB->CCR |= SCB_CCR_IC_Msk; // enable I-Cache__DSB();__ISB();

#endif}

命令が確実に設定されるように、メモリバリア命令を適⽤している

Page 53: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

STM32F7のFLASH ARTアクセラレータ

Page 54: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

STM32F7のFLASH ARTアクセラレータ

Flash領域にTCM経由でアクセスができ、ARTを有効にすることで⾼速アクセスができる

54

ITCM RAM

FLASH

DTCM RAM

SRAM1

0x00000000 – 0x00003FFF : 16KB

0x00200000 – 0x002FFFFF : 1024KBor

0x08000000 – 0x080FFFFF : 1024KB

0x20000000 – 0x2000FFFF : 64KB

0x20010000 – 0x2004BFFF : 240KB

コード⽤

データ⽤

SRAM20x2004C000 – 0x2004FFFF : 16KB

AXIM

TCMキャッシュ

Page 55: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

STM32F7のFLASH ARTアクセラレータ

ARTはレジスタ設定で有効にする

55

FLASH_ACR:Flash access control register 0x4002-3C00Type: RWReset 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

AR

TEN

LATENCY

※TCM経由(0x0020xxxx)から起動するか、AXIM(0x0800xxxx)から起動するかはBOOT_PINの状態と、OptionByteのBOOT_ADD0/1で決定される。

詳細はSTM32F7xxリファレンスマニュアルを参照

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/data_brief/DM00116941.pdf 2015年4⽉1⽇ ST社 Webサイトより抜粋

Page 56: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

STM32F7のFLASH ARTアクセラレータ

ST社提供stm32f7xx_hal_flash.hにART有効/無効関数が含まれている

56

Page 57: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

パフォーマンス評価結果

Page 58: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

STM32F7の設定差分による性能評価

配置領域、設定により、性能は⼤きく異なる。

58

Code Static Stack Icache DCache Data Copy (Cycle) BubbleSort (Cycle)FLASH SRAM SRAM 4,789 1,202,575FLASH SRAM SRAM Yes 7,371 1,341,410FLASH SRAM SRAM Yes 4,779 934,650FLASH SRAM SRAM Yes Yes 1,817 460,829ITCM_FLASH SRAM SRAM 7,473 1,039,525ITCM_FLASH SRAM SRAM Yes 4,362 901,197ITCM_FLASH SRAM SRAM Yes 4,791 1,010,178ITCM_FLASH SRAM SRAM Yes Yes 5,950 935,851ITCM_FLASH +ART SRAM SRAM 3,117 934,561ITCM_FLASH +ART SRAM SRAM Yes 1,803 455,859ITCM_FLASH +ART SRAM SRAM Yes 3,117 934,576ITCM_FLASH +ART SRAM SRAM Yes Yes 1,805 460,804ITCM DTCM SRAM 1,579 930,088ITCM DTCM SRAM Yes 1,579 455,937ITCM DTCM SRAM Yes 1,579 929,901ITCM DTCM SRAM Yes Yes 1,579 455,861ITCM DTCM DTCM 1,579 455,979ITCM DTCM DTCM Yes 1,579 455,940ITCM DTCM DTCM Yes 1,579 455,905ITCM DTCM DTCM Yes Yes 1,579 455,858

Page 59: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

まとめ

Page 60: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

まとめ

60

Cortex-M7の⾼性能を引き出すためには、各種機能、特性を理解し、アプリケーションにあった設計が必要。

⾼性能なコンパイラを持つ開発環境を使⽤する必要がある。

実際には、動作をさせながら評価をしながら、アプリケーションの最適化を進めていく。

開発環境の提供する各種設定⽅法を理解し、またベンチマークやメモリマップの確認⽅法を習得することで、開発するアプリケーションにあった最適化を進めることができる。

Page 61: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Appendix MPU/Cache関連レジスタ

Page 62: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU: MPU Control Register

MPU機能全体の制御レジスタ

62

MPU_CTRL: MPU Control Register0xE000-ED94Type: RWReset 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

PR

IVD

EFE

NA

HFN

MIE

NA

EN

AB

LE

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サイトより抜粋

Page 63: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU: MPU Region Base Address Register

MPU領域の開始アドレスとRegion番号の指定

63

MPU_RBAR: MPU Region Base Address Register0xE000-ED9CType: RWReset 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 VALI

D

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サイトより抜粋

Page 64: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU: MPU Region Attribute and Size Register (1/3)

MPU領域の詳細設定⽤レジスタ

64

MPU_RASR: MPU Region Attribute and Size Register0xE000EDA0Type: RWReset 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

EN

AB

LE

Bit Name 説明28 XN Execution Never

0: 命令コード実⾏可能1: 命令コード実⾏不可

26:24 AP Access and Privilege 21:16 TEX,S,C,B15-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サイトより抜粋

Page 65: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU: MPU Region Attribute and Size Register (2/3)

特権/⾮特権時のアクセス制御&領域サイズ指定

65

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

EN

AB

LE

AP 特権(Privileged) ⾮特権(Unprivileged)000 No Access No access001 Read / Write No access010 Read / Write Read-only011 Read / Write Read/Write101 Read-Only No access110 Read-Only Read-only111 Read-Only Read-only

SIZE Region size00100(4) 32 B01001(9) 1KB10011(19) 1MB11101(29) 1GB11111(31) 4GB

http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/Cihegaib.html 2015年4⽉1⽇ ARM Webサイトより抜粋

Page 66: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

MPU: MPU Region Attribute and Size Register (3/3)

キャッシュ、共有、アクセス制御 ビット組み合わせで設定

66

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

EN

AB

LE

TEX C B Memory Type 説明 共有000 0 0 ストロングオーダ

(Strongly-ordered)共有可

000 0 1 デバイス(Device) 共有デバイス 共有可000 1 0 ノーマル(Normal) ライトスルー(Write-Through)

書込割り当て(Write Allocate)なしS bit

000 1 1 ノーマル(Normal) ライトバック(Write-Back)書込割り当て(Write Allocate)なし

S bit

001 0 0 ノーマル(Normal) キャッシュなし S bit001 1 1 ノーマル(Normal) ライトバック(Write-Back)

書込・読込割り当て(Write Allocate)あり

S bit

010 0 0 デバイス(Device) ⾮共有デバイス 共有不可1BB A A ノーマル(Normal) キャッシュメモリ

AA:内部ポリシー(Inner Policy)BB:外部ポリシー(Outer Policy)

00 : キャッシュなし01: ライトバック、割り当てあり10: ライトスルー、割り当てなし11: ライトバック、割り当てなし

S bit

http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/Cihegaib.html 2015年4⽉1⽇ ARM Webサイトより抜粋

Page 67: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cache: Data cache invalidate by Set/Way

データキャッシュのSet、Wayを指定して無効化

67

DCISW: Data cache invalidate by Set/Way0xE000-EF60Type: WOReset 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 常に0B-1:L Set 操作するSet数L-1:4 SBZ 常に03: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サイトより抜粋

Page 68: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cache: Instruction cache invalidate All to PoU

Writeアクセスで命令キャッシュを無効化

68

ICIALLU: Instruction cache invalidate all to PoU (Point of unification)0xE000-EF50Type: WOReset 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サイトより抜粋

Page 69: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

Cache: Configuration and Control Register

ビットアサインで命令キャッシュとデータキャッシュを有効化

69

CCR: Configuration and Control Register0xE000-ED14Type: RWReset 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

STKA

LIG

N

BFH

FNM

IGN

DIV

_0_T

RP

UN

ALI

GN

_TR

P

US

ER

SE

TMP

EN

D

NO

NB

AS

ETH

RD

EN

A

Bit Name 説明18 BP 分岐予測(Brance prediction)有効。

M7では常に117 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サイトより抜粋

Page 70: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

本資料について

Page 71: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

本資料取り扱い上の注意

71

本資料は2015年4⽉1⽇時点の情報を基に作成されており、将来変更の可能性のあるものです。あわせてご紹介する設定や機能に関連して、動作保証をお約束するものではございませんので、ご了承ください

本資料で提供している情報は、ご利⽤されている⽅のご判断・責任においてご使⽤ください。提供した情報に関連して、ご利⽤される⽅が不利益等を被る事態が⽣じたとしても、弊社及び執筆者は⼀切の責任を負いかねますので、ご了承ください。

本資料の内容に関する弊社または各社へのお問合せはご遠慮ください。

本資料及びデータの再配布・無断転⽤・転載等はご遠慮ください。

Page 72: Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM ハイパフォーマンスマイコンCortex-M7の性能を引き出すには 優れたコンパイラが不可

商標について

72

• 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マイクロエレクトロニクスの登録商標です。

• その他、本資料中の製品名やサービス名は全てそれぞれの所有者に属する商標または登録商標です。