Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM...
Transcript of Cortex-M7の性能を引き出す ソフトウェア開発...Cortex-M7開発環境としてのEWARM...
April 2015IAR Systems K.K.FAE Team
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を元に作成しています。
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
Cortex-M市場と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
Cortex-M7のベンチマーク性能実績
1MHz当たりの処理能⼒はシングルコアマイコンとして世界最速(2015年4⽉現在)
6
Cortex-M7
http://www.eembc.org/coremark/index.php 2015年1⽉31⽇ EEMBC.org Webサイトより抜粋
クロック⾼速化と合わせて、超⾼性能マイコンの誕⽣!
マルチコアMPU
おさらい、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サイトより抜粋
Cortex-M7の性能を引き出す開発環境
IARシステムズとは?
⾃社コンパイラを持つ、組込み開発環境の専⾨メーカ
9
世界初の商⽤組込C⾔語コンパイラメーカー
世界40ヵ国以上で販売。のべ10万ライセンスの販売実績
メーカによる営業・技術サポート
GUI・マニュアル⽇本語
従業員170+ ローカルオフィス 12拠点
本社がスウェーデングローバルに展開
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
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サイトより抜粋
ここが新しい! 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サイトより抜粋
ソフトウェア開発から⾒た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倍)
メモリ保護(信頼性)
メモリアクセス遅延解消
メモリアクセス遅延解消
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倍
M7の性能・機能を引き出すためのEWARM活⽤テクニック
今回使うプロジェクト構成(バブルソート)
⽤意されたデータをバブルソートで並び替える
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関数
今回使うプロジェクト構成(バブルソート)
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⽤の定義あり
今回使うプロジェクト構成(バブルソート)
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();
}
バブルソートの本体。データをローカル変数にコピーして並び替え。
今回使うプロジェクト構成(バブルソート)
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)データ配列。
今回使うプロジェクト構成(バブルソート)
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)
今回使うプロジェクト構成(バブルソート)
オプション設定 (新規プロジェクトからの差分)
22
[Cortex-M7]
[CMSISを使⽤する]
[$PROJ_DIR$¥m7.txt][リンカマップファイルの表⽰]
まずは「⾒える化」Cortex-M7ベンチマークテクニック
並び替えの実処理を計測。ブレークポイント間のCPUレジスタの変化で測定可能
23
現在のサイクル数
前回のデバッガ表⽰からのサイクル増加数
まずは「⾒える化」Cortex-M7ベンチマークテクニック
CYCLECOUNTERが変わらない時は、機能を有効化することで対応可能
24
Data Watchpoint and Trace unitDWT_CTRL > CYCNTENAを1に
CYCLECOUNTERが更新される
CPU速度が200MHzのとき、CCSTEPが826,801だったら経過時間は4.134ms
メモリ配置を柔軟にリンカ使いこなしと確認テクニック
M7では、TCM、キャッシュの使い分けが、性能に⼤きく影響⾃由に配置するには、リンカの基本的な使い⽅を習得する必要がある
25
ITCM RAM
FLASH
DTCM RAM
SRAM1
0x00000000 – 0x00003FFF : 16KB
0x08000000 – 0x080FFFFF : 1024KB
0x20000000 – 0x2000FFFF : 64KB
0x20010000 – 0x2004BFFF : 240KB
コード⽤
データ⽤
SRAM20x2004C000 – 0x2004FFFF : 16KB
メモリ配置を柔軟にリンカ使いこなしと確認テクニック
EWARMのリンカ名称はILINK。ILINKでは4GBのメモリをRegionに分け、最⼩単位のセクションを配置する
26
ITCM RAM
FLASH
DTCM RAM
SRAM1
SRAM2Region(メモリ空間)
Block
Section
Section
Section
Section
Section
メモリ配置を柔軟にリンカ使いこなしと確認テクニック
リンカ設定ファイルの中⾝を⾒てみる
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展開指⽰
ベクタテーブル配置
どのメモリ領域にどの(属性の)セクションを配置するか指⽰
アドレスシンボルの宣⾔
スタック、ヒープブロックサイズの宣⾔
メモリ配置を柔軟にリンカ使いこなしと確認テクニック
ビルド後のメモリ配置状況はmapファイルで確認できる
28
[リンカマップファイルの表⽰]にチェックを⼊れてビルド
セクションごとの配置アドレスなどが確認可能Output以下にmapファイルが⽣成される
メモリ配置を柔軟にリンカ使いこなしと確認テクニック
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からコピー展開するセクションであることを指定
メモリ配置を柔軟にリンカ使いこなしと確認テクニック
マップファイルとデバッグ実⾏時のアドレスで、RAM実⾏を確認
30
0x20000000台は、SRAM領域
「最適化」でこんなに変わる!適用テクニック
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倍
「最適化」でこんなに変わる!適用テクニック
C⾔語の最適化はプロジェクト⼀括でも、ソースコード単位でも指定可能
32
Cファイルを右クリック
[継承した設定をオーバライド]にチェックしてコンパイラオプションを上書き
CMSISファイルを活用して、簡単設定
CMSISとは、ARM社 IARシステムズ社などが共同で作成した標準規格CMSISファイル群にincludeパスを設定
33
[CMSISを使⽤する]にチェックを⼊れることでCMSISのIncludeディレクトリにプリプロセッサのinclude Pathが規定される
CMSISファイルを活用して、可搬性を確保
Cortex-Mコアの各種レジスタの定義および、設定関数、マクロが規定
34
若⼲冗⻑の処理となるが、設定は⼀度のみと考えるとデバイス間のメンテナンス性などを考慮し、積極的に活⽤すべき
Cortex-M7の標準初期化処理
アプリケーション実行までにやるべきこと
初期設定として、実⾏すべきこと
36
FPU初期化 *オプション
MPU初期化
キャッシュ初期化
TCM初期化
データ初期化(ROM > RAMなど)
EWARMのランタイムライブラリが実⾏
EWARMのランタイムライブラリが実⾏*カスタマイズも可能
プログラムで処理
プログラムで処理
デフォルトで有効なデバイスが多い
MPUを理解し、使いこなす
MPU(メモリ保護ユニット)とは?
領域ごとにアクセス権限などを設定できる機能。キャッシュの設定にも必要
38
ITCM
DTCM内部RAM
コード
ペリフェラル
外部RAM
キャッシュ
不正コードキャッシュ無効
キャッシュ有効
キャッシュ有効
キャッシュ有効
実⾏不可
実⾏不可
実⾏不可
実効可コードを実⾏させない
悪意あるプログラム
コード実⾏
MPUの設定プロセス
アプリケーション設計に合わせて、⼗分に検討を⾏う。
39
メモリ領域を⽤途・属性でどう区切るか決める
区切った領域の設定順番を決める
各領域の詳細設定を決める
レジスタ値をコーディングする
0
12
0
12
MPU領域番号0
MPU領域番号1
MPU領域番号2
最終有効設定
MPUの設定プロセス
MPU関連レジスタをシーケンスに沿って設定する
40
MPU無効化 (MPU>CTRL)
MPU領域開始アドレス+番号指定(MPU>RBAR)
該当領域の属性+サイズ指定(MPU>RASR)
MPU有効化 (MPU>CTRL)
MPU領域開始アドレス+番号指定(MPU>RBAR)
該当領域の属性+サイズ指定(MPU>RASR)
MPU領域ごとに設定
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サイトより抜粋
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();
MPU違反が発⽣した場合
例外が発⽣し、例外ハンドラにジャンプする
43
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
デフォルトだとHardFaultハンドラにジャンプ
メモリマネジメントフォルトを有効にするとMemManageハンドラにジャンプ
問題の発⽣したアドレスが判断できる
TCMを理解し、使いこなす
TCM(密結合メモリ)とは?
通常のメモリアクセスよりも⾼速にアクセスできるメモリ
45
CPU早すぎ・・汗WAITWAIT実⾏
通常メモリ
♪実⾏実⾏実⾏ TCM
遠い
近い
⾼速CPUに対するメモリアクセスボトルネックの解消⼿段として採⽤
低レイテンシアクセスを確保できる。ただし、容量は⼩さいためクリティカルな処理・データを配置して、アプリケーションの最適化を⾏う
メモリマップ上の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
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配列の配置先
キャッシュを理解し、使いこなす
キャッシュとは?
動的・⾃動的に最近アクセスしたデータを蓄積し、アクセス⾼速化
49
WAITWAIT実⾏
通常メモリ
実⾏実⾏実⾏ キャッシュ
遠い
近い
ラッキー♪キャッシュに残ってた
通常メモリ
アプリケーション全体として、アクセススピードは改善される。ただし、キャッシュヒットするかどうかは、そのときの条件による。
キャッシュの設定プロセス
データキャッシュ、命令キャッシュそれぞれにレジスタ設定をする
50
D-Cacheの無効化(PPB > DCISW)
I-Cacheの無効化(PPB > ICIALLU)
D-Cacheの有効化(CCR)
I-Cacheの有効化(CCR)
Cacheラインごとに無効化必要
⼀度の処理で無効化
CCRのビットを⽴てて有効化
CCRのビットを⽴てて有効化
キャッシュの有効化サンプルコード (データ)
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}
データキャッシュの有効化関数
キャッシュの有効化サンプルコード (命令)
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}
命令が確実に設定されるように、メモリバリア命令を適⽤している
STM32F7のFLASH ARTアクセラレータ
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キャッシュ
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サイトより抜粋
STM32F7のFLASH ARTアクセラレータ
ST社提供stm32f7xx_hal_flash.hにART有効/無効関数が含まれている
56
パフォーマンス評価結果
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
まとめ
まとめ
60
Cortex-M7の⾼性能を引き出すためには、各種機能、特性を理解し、アプリケーションにあった設計が必要。
⾼性能なコンパイラを持つ開発環境を使⽤する必要がある。
実際には、動作をさせながら評価をしながら、アプリケーションの最適化を進めていく。
開発環境の提供する各種設定⽅法を理解し、またベンチマークやメモリマップの確認⽅法を習得することで、開発するアプリケーションにあった最適化を進めることができる。
Appendix MPU/Cache関連レジスタ
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サイトより抜粋
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サイトより抜粋
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サイトより抜粋
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サイトより抜粋
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サイトより抜粋
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サイトより抜粋
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サイトより抜粋
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サイトより抜粋
本資料について
本資料取り扱い上の注意
71
本資料は2015年4⽉1⽇時点の情報を基に作成されており、将来変更の可能性のあるものです。あわせてご紹介する設定や機能に関連して、動作保証をお約束するものではございませんので、ご了承ください
本資料で提供している情報は、ご利⽤されている⽅のご判断・責任においてご使⽤ください。提供した情報に関連して、ご利⽤される⽅が不利益等を被る事態が⽣じたとしても、弊社及び執筆者は⼀切の責任を負いかねますので、ご了承ください。
本資料の内容に関する弊社または各社へのお問合せはご遠慮ください。
本資料及びデータの再配布・無断転⽤・転載等はご遠慮ください。
商標について
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マイクロエレクトロニクスの登録商標です。
• その他、本資料中の製品名やサービス名は全てそれぞれの所有者に属する商標または登録商標です。