iar embedded workbench for arm tips集...はじめに 本資料の位置づけと読み方...

136
IAR Embedded Workbench for Arm TIPSV1.00.3

Upload: others

Post on 07-Apr-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

IAR Embedded

Workbench for ArmTIPS集

V1.00.3

はじめに本資料の位置づけと読み方

【位置づけ】

IAR Embedded Workbench for Armのマニュアルの補足説明資料です。

【読み方】

各TIPSには5桁または6桁のIDが振られています。

資料更新があってもIDの上位5桁は固定です。

バージョンアップなどにより内容が変わる場合には6桁目に

差分を示します。

2

中項目大項目Version差ID

(option)小項目番号

B. 基本設定/一般オプション/マニュアル資料C. C/C++コンパイラD. デバッグ/ICE

E. リンカF. アプリケーションG. アセンブラH. 補助ツールI. 他ツール連携J. Windowsなどとの関係K. C-STAT/C-RUNなどL. マイコン/CPU

3

TIPSの概略構成

4

目次

ページタイトル ページ

はじめに 本資料の位置づけと読み方 2

TIPSの概略構成 3目次 4 - 9

B. 基本設定/一般オプション/マニュアル資料 10

BA-001 : マニュアルの参照方法 11

BA-002a : メニューからマニュアルを開く 12

BA-003 : IAR Embedded Workbench for Arm上でヘルプ 13

BA-004a : インフォメーションセンタからマニュアルを開く 14

BA-005 : IAR Embedded Workbench for Armのマニュアルの基本構成 15 - 16

BA-006a : IDEプロジェクト管理およびビルドガイド章目次 17

BA-007a : IAR C/C++開発ガイド章目次 18

BA-008a : C-SPYデバッガガイド章目次 19

BA-009a : IAR Embedded Workbench for Armのオプション設定概要 20

BA-010a : ツールオプション概要 21

BA-011a : プロジェクトオプション概要 22

BA-012 : ビルド時の生成ファイル 23 - 28

BA-013 : 行番号を表示したい 29

BA-014 : ビルド構成DebugとReleaseの違い 30

目次

5

ページタイトル ページ

C. コンパイラ 31

CA-001: 最適化設定画面 32

CA-002: 最適化レベルとデバッグ情報の保持 33 - 34

CA-003: 最適化の適用範囲と個別設定 35 - 37

CA-004: 最適化手法について 38 - 41

CA-005: 最適化の考え方 42

CA-006: インクルードパスを指定するには? 43

CB-001: RAM上への関数配置 44

CB-002: 変数や関数が最終的になくなってしまう 45

CB-003: 構造体のパッキングを変更するには? 46

CB-004: セクションのアドレスをプログラムで使用するには 47

CB-005: IAR Embedded Workbench for Armのenum型の大きさは? 48

CB-006: charの符号は? 49

CB-007: 割込みハンドラを記述するには? 50

CB-008: C言語の標準ライブラリについて 51

CB-009: C言語の標準ライブラリを使うためには? 52

6

目次

ページタイトル ページ

D. デバッグ/ICE 53

DA-001: CoreSightテクノロジ機能・接続まとめ 54

DA-002: CoreSightテクノロジトレースタイミング 55

DA-003: デバッグに最小限必要なピン数は? 56

DA-004: SWDとJTAGのデバッグ差はあるのか? 57

DA-005: デバッグインタフェース:コネクタ I-jet 58 - 60

DA-006: デバッグインタフェース:コネクタ例 61

DA-007: デバッグ情報を含めるとコードサイズが大きくなる? 62

DB-001: SWV機能の使用条件 63

DB-002: SWV対応コネクタ 64

DB-003: SWV機能使用時のプロジェクト設定 65

DB-004: SWV(SWO)トレース 66 - 67

DB-005: SWV(SWO)トレースでコードカバレッジ 68 - 69

DB-006: SWV(SWO)機能データログ 70 - 74

DB-007: 割込みログ 75 - 78

DB-008: ITMイベント 79 - 83

7

目次

ページタイトル ページ

DC-001: トレース機能の使用条件 84

DC-002: Cortex-M用ETMトレース対応コネクタ 85

DC-003a: ETMトレース使用時のプロジェクト設定 86 - 87

DC-004: ETMトレース表示 88

DC-005: ETM関数トレース表示 89

DC-006: コードカバレッジ:C言語 90

DC-007: コードカバレッジ:アセンブラ 91

DC-008: ETMトレース用のブレークポイント設定 92

DC-009: ETMトレースタイムラインでコールスタック表示 93

DD-001: デバッグウィンドウ:ブレークポイント 94

DD-002: デバッグウィンドウ:逆アセンブリ 95

DD-003: デバッグウィンドウ:メモリ 96

DD-004: デバッグウィンドウ:シンボルメモリ 97

DD-005: デバッグウィンドウ:レジスタ 98

DD-006: デバッグウィンドウ:ウォッチ 99

DD-007: デバッグウィンドウ:ローカル 100

8

目次

ページタイトル ページ

DD-008: デバッグウィンドウ:静的変数 101

DD-009: デバッグウィンドウ:自動(オート) 102

DD-010: デバッグウィンドウ:ライブウォッチ 103

DD-011: デバッグウィンドウ:クイックウォッチ 104

DD-012: デバッグウィンドウ:コールスタック 105

DD-013: デバッグウィンドウ:スタック 106 - 107

DD-014: デバッグウィンドウ:ターミナルI/O 108

DD-015: デバッグウィンドウ:イメージ 109

DE-001: シミュレータの設定 110

DE-002: シミュレータの出来る事 111

DE-003: 割込みシミュレーション 112

DE-004: シミュレーションによる再現性 113

DF-001: デバッグ開始と同時にプログラムをスタート 114

DF-002: ソースコードデバッグが出来ない? 115

DF-003: ローカル変数はデバッグ時に観測できる? 116

9

目次

ページタイトル ページ

E. リンカ 117

EA-001: リンカ設定に関する資料は? 118

EA-002: リンカ設定で変数/関数を必ず出力するには? 119

EA-003: スタックサイズを変更するには? 120

EA-004: 静的なスタック解析を実施するには? 121

EA-005: 静的なスタック解析の補助情報を与える 122 - 124

EA-006: 領域の定義方法 125

EA-007: 未使用領域を特定のコードで埋めたい 126

EA-008: ファイルごとにコードセクションを定義したい 127

EA-009: 変数をC言語で記述した順序で配置したい 128

EA-010: リンカマップを出力するには? 129

EA-011: ライブラリを組込むとコードサイズが大きい? 130

EA-012: チェックサムの実装法がわからない 131

L. マイコン/CPU関係 132

LA-001: Armの命令セット 133

LA-002: IAR Embedded Workbench for ArmでCPUコアの選択と命令の選択 134

LA-003: IAR Embedded Workbench for Armのスタートアップシーケンス 135

LA-004: 小ピンMCUでICE接続が出来なくなる 136

B.基本設定/一般オプション/

マニュアル資料

10

IAR Embedded Workbench for ArmはPDFのマニュアルとオンラインマニュアルがある。

• PDFのマニュアルに関しては BA-002・BA-004を参照。

• オンラインマニュアルに関しては BA-003を参照。

11

BA-001: マニュアルの参照方法

マニュアルとソフトウェア構成の関係

12

BA-002a: メニューからマニュアルを開く

IAR Embedded Workbench for Arm

IDEツール

エディタ

プロジェクト

マネージャ

ライブラリ

ビルダ

ライブラリアン

ビルドツール

IAR C/C++

コンパイラ

アセンブラ

リンカ

IAR C-SPY

デバッガ

シミュレータ

ハードウェア

システムドライバ

Powerデバッグ

RTOSプラグイン

I-jet

JTAGjet-trace

静的解析ツール

C-STAT

IAR Embedded Workbench for Arm画面上でF1キーを押すことで

ヘルプが表示される。

13

BA-003: IAR Embedded Workbench for Arm上でヘルプ

たとえば、ここでF1キーを押す

IAR Embedded Workbench for Armのメニューから[ヘルプ] > [Arm用IARインフォメーションセンタ] > [ユーザガイド]

14

BA-004a: インフォメーションセンタからマニュアルを開く

推奨するマニュアル参照順序

15

BA-005: IAR Embedded Workbench for Armのマニュアルの基本構成

IAR Embedded Workbenchの使用開始の手順

IDEユーザガイド

C/C++コンパイラリファレンスガイド

C-SPYデバッガガイド

エミュレータ(ICE)固有のマニュアル

※IAR日本法人作成ガイド

http://www.iar.com/jp/ilink-setting-guide/

IAR Embedded Workbench for Arm全体

概要の把握

アプリ操作プロジェクト設定

コンパイラ設定リンカ設定

リンカ設定実践

デバッグ設定デバッグ手法

ICEのスペック取り扱い方法

開発フェーズ

ILINK設定ガイド

IAR Embedded Workbenchの標準的なマニュアル構成

16

BA-005: IAR Embedded Workbench for Armのマニュアルの基本構成

Part.1

関連モジュールの概要説明

Part.2

関連モジュールの詳細説明

教科書的な説明

辞書的な説明

BA-006a: IDE プロジェクト管理およびビルドガイド章目次

パート1.

プロジェクト管理とビルド

• 開発環境

• プロジェクト管理

• プロジェクトのビルド

• 編集

パート2.

リファレンス情報

• インストールファイル

• メニューリファレンス

• 一般オプション

• C-STAT オプション

• コンパイラオプション

• アセンブラオプション

• 出力コンバータオプション

• カスタムビルドオプション

• ビルドアクションオプション

• リンカオプション

• ライブラリビルダオプション

17

BA-007a: IAR C/C++ 開発ガイド章目次

パート1.

ビルドツールの使用

• IAR ビルドツールの概要

• 組込みアプリケーションの開発

• データ記憶

• 関数

• ILINK を使用したリンク

• アプリケーションのリンク

• DLIB ランタイムライブラリ

• アセンブラ言語インタフェース

• C の使用

• C++ の使用

• アプリケーションに関する考慮事項

• 組込みアプリケーション用の効率的なコーディング

パート2.

リファレンス情報

• 外部インタフェースの詳細

• コンパイラオプション

• リンカオプション

• データ表現

• 拡張キーワード

• プラグマディレクティブ

• 組込み関数

• プリプロセッサ

• ライブラリ関数

• リンカ設定ファイル

• セクションリファレンス

• スタック使用制御ファイル

• IAR ユーティリティ

• C 規格の処理系定義の動作

• C89 の処理系定義の動作

18

BA-008a: C-SPYデバッガガイド章目次

パート1.

基本デバッグ

• IAR C-SPY デバッガ• C-SPY を使用するにあたって• アプリケーションの実行• 変数と式• ブレークポイント• メモリとレジスタ

パート3.

高度なデバッグ

19

パート2.

アプリケーションの分析

• トレース

• アプリケーションタイムライン

• プロファイリング

• コードカバレッジ

• Power デバッグ

• C-RUN ランタイムエラー解析

• [デバッガ]オプション

• C-SPY ドライバについての追加情報

• マルチコアデバッグ

• 割込み

• C-SPY マクロ

• C-SPY コマンドラインユーティリティ

-- cspybat

• フラッシュローダ

パート4.

追加リファレンス情報

ツールオプションとプロジェクトオプション

20

BA-009a: IAR Embedded Workbench for Armのオプション設定概要

ツール関係全般オプション

プロジェクト固有のオプション設定

21

BA-010a: ツールオプション概要

表示・操作性カスタマイズ

ビルド動作等カスタマイズ

ソースコード管理カスタマイズ

デバッグ時スタック解析動作等カスタマイズ

デバッガ動作等カスタマイズ

22

BA-011a: プロジェクトオプション概要

開発フローターゲット設定ライブラリ設定

コンパイラ設定※最適化など

リンカ設定※メモリ配置、チェックサム

ICE固有の設定※リセット・速度

デバッグ用設定ICE選択

書き込み設定

23

BA-012:ビルド時の生成ファイル

project1

└─Debug

├─Exe

│ project1.out

│ project1.srec

└─List

project1.map

Tutor.lst

Utilities.lst

tutor_library

└─Debug

└─Exe

tutor_library.a

生成ファイル 説明

.out 実行可能ファイル(Elf/Dwarf形式)

.a ライブラリファイル

.srec (, .hex, .sim) Flashライター用などに変換されたファイル[プロジェクト]→[オプション]→[出力コンバータ]→

[追加出力ファイルを生成]にチェック

.map リンク後のマップファイル[プロジェクト]→[オプション]→[リンカ]→[リスト]→

[リンカマップファイルの表示]

.lst Cソースファイル毎の静的解析情報[プロジェクト]→[オプション]→[C/C++コンパイラ]→

[リスト]→[リストファイルの出力]

実行可能ファイル(Elf/Dwarf形式) .outファイル

24

BA-012:ビルド時の生成ファイル

ライブラリファイル .aファイル

25

BA-012:ビルド時の生成ファイル

モトローラ/インテル形式ファイル

.srec(.hex)ファイル

26

BA-012:ビルド時の生成ファイル

S010000070726F6A656374312E73726563EC

S11300003804002019030000B3020000B30200000A

S1130010B3020000B3020000B302000000000000BD

S1130020000000000000000000000000B302000017

S1130030B302000000000000B3020000B30200009D

S113004038B52D2401201349486012490860022064

S1130050040024B20A2C0FDA24B2200000F00DF8B8

・・・S1130280A142F8D110BD00BF2C0000004C000000BA

S11302B07047FEE7DDFFFFFF2C0000000800002070

S11302C000000000BBFEFFFF080000005800000013

S11302D0000000200000000000F009F8002801D010

S11302E0FFF7C0FF0020FFF7ADFF00F002F8012088

S11302F0704700F001B800000746384600F002F8E5

S1130300FBE7000080B5FFF751FF024A11001820F7

S1130310ABBEFBE726000200C046C046C046C0464E

S10F0320FFF7DAFFFFFFFFFFFFFFFFFF06

S9030319E0

.mapファイル

27

BA-012:ビルド時の生成ファイル

*** PLACEMENT SUMMARY

***

"A1": place at 0x00000000 { ro section .intvec };

"P1": place in [from 0x00000000 to 0x0007ffff] { ro };

"P2": place in [from 0x20000000 to 0x2000ffff] { rw, block CSTACK, block

HEAP };

Section Kind Address Size Object

------- ---- ------- ---- ------

"A1": 0x40

.intvec ro code 0x00000000 0x40 vector_table_M.o [4]

- 0x00000040 0x40

"P2", part 3 of 3: 0x400

CSTACK 0x20000038 0x400 <Block>

CSTACK uninit 0x20000038 0x400 <Block tail>

- 0x20000438 0x400

*******************************************************************************

*** STACK USAGE

***

Program entry

__iar_program_start: 0x00000319

Maximum call chain 112 bytes

*******************************************************************************

*** MODULE SUMMARY

***

768 bytes of readonly code memory

44 bytes of readonly data memory

1 076 bytes of readwrite data memory

Errors: none

Warnings: none

.lstファイル

28

BA-012:ビルド時の生成ファイル

¥ In section .bss, align 4

29 int callCount;

¥ callCount:

¥ 00000000 DS8 4

30

31 /* Increase the 'callCount' variable by one. */

¥ In section .text, align 2, keep-with-next

32 void NextCounter(void)

33 {

34 callCount += 1;

¥ NextCounter:

¥ 00000000 0x.... LDR.N R0,??DataTable2

¥ 00000002 0x6800 LDR R0,[R0, #+0]

¥ 00000004 0x1C40 ADDS R0,R0,#+1

¥ 00000006 0x.... LDR.N R1,??DataTable2

¥ 00000008 0x6008 STR R0,[R1, #+0]

35 }

¥ 0000000A 0x4770 BX LR ;; return

Maximum stack usage in bytes:

.cstack Function

------- --------

8 DoForegroundProcess

8 -> GetFib

8 -> NextCounter

8 -> PutFib

0 NextCounter

Section sizes:

Bytes Function/Label

----- --------------

4 ??DataTable2

24 DoForegroundProcess

12 NextCounter

4 callCount

28 main

4 bytes in section .bss

68 bytes in section .text

68 bytes of CODE memory

4 bytes of DATA memory

Errors: none

Warnings: none

IAR Embedded Workbench for Armのメニュー[ツール] > [オプション] でIDEオプションを開き、[エディタ] > [行番号の表示]にチェックを入れることで行番号が表示される。

29

BA-013: 行番号を表示したい

IAR Embedded Workbenchで新しくプロジェクトを生成するとDebugとReleaseのビルド構成が生成される。

30

BA-014: ビルド構成DebugとReleaseの違い

Debug 項目 Release

あり セミホスティング なし

低 最適化 高

あり C/アセンブラでデバッグ情報生成 なし

なし マクロ定義NBDEBUG あり

なし リンカ:小さいルーチンのインライン化 あり

C.コンパイラ

31

最適化の設定

32

CA-001: 最適化設定画面

• 最適化レベル

• なし

• 低*1

• 中

• 高(バランス)*2

• 高(速度)

• 高(サイズ)

*1 ビルド構成がDebugの場合の初期値

*2 ビルド構成がReleaseの場合の初期値

※デバッグ時は、「なし」か「低」に設定を推奨。

33

CA-002: 最適化レベルとデバッグ情報の保持

• 変数の位置情報

• 変数のスコープおよび存在情報

• ステップポイント

• ステップ実行時のソースコードと機械語の対応

• 関数のステップイン/アウト

• ブレークポイントの設置

• コールスタック情報

• 関数を特定する情報およびコールスタック内での変数情報

34

最適化レベル 変数の位置情報 ステップポイント コールスタック情報

なし 保持 保持 保持

低 ほぼ保持 保持 保持

中 保持されない 保持 保持

高 保持されない 保持されない 保持

CA-002: 最適化レベルとデバッグ情報の保持

• プロジェクト全体

• ソースグループ単位

• ソースコード単位

• 関数単位

35

CA-003: 最適化の適用範囲と個別設定

プロジェクト全体

ソースグループ単

ソースコード単位

関数単位

プロジェクト全体ではなく、ソースグループ単位やソースコード単位で最適化レベルを変更する場合には以下の設定を実施。

36

CA-003: 最適化の適用範囲と個別設定

グループまたはソースコード個別に上書きする際には[継承した設定をオーバーライド] にチェック

ダブルクリック

関数単位で最適化レベルを設定するには#pragma optimizeを使用。

37

CA-003: 最適化の適用範囲と個別設定

関数単位

#pragma optimize の直下に記述された関数のみ適用される。

ファイルソースに適用されている最適化レベルを下げる方向にのみ指定可能。

※ファイルの最適化レベルが[中]のコードに対して#pragma optimize= high は適用できない。

次ページ以降で以下の手法について内容をご紹介

• 共通部分式除去

• ループ展開

• 関数インライン化

38

CA-004: 最適化手法について

最適化例1: 共通部分式除去

39

CA-004: 最適化手法について

コンパイラは、予め a - b * c / 150 を計算する関数を作成し、評価式とリターン値で結果を使用する。

if ( a - b * c / 150 % 12 == 5) do_something();

・・・return(a - b * c / 150 + 5);

入力ソースコード

t = a - b * c / 150 ;

if ( t % 12 == 5) do_something();

・・・return(t + 5);

最適化イメージ

最適化例2:ループ展開

40

CA-004: 最適化手法について

for ( i = 0; i < 3; i++)

{

j[i] = i;

}

j[0] = 0;

j[1] = 1;

j[2] = 2;

入力ソースコード

最適化イメージ

ループを展開することで、ループ処理のオーバーヘッドを削減

最適化例3:関数インライン化

41

CA-004: 最適化手法について

int foo2( ) {

int i;

for (i=0; i<10; i++ ) {

dat[i]= dat[i]+1;

}

}

最適化イメージ

関数呼出fooをインラインで展開することで関数呼出のオーバーヘッドを削減

入力ソースコード

int foo(int a) {

return a+1;

}

int foo2( ) {

int i;

for (i=0; i<10; i++ ) {

dat[i]= foo(dat[i]);

}

}

• 最適化の手法は一定の効果が保証されるものではなくコンパイラによって発見的・探索的に適用される。

• デバッグやメンテナンスのしやすさを考慮し、サイズの削減が必要なコードや処理速度の追求が必要なコードごとに適用範囲(ソースファイル/グループ)を限定して高い最適化レベルを適用することを推奨。

• 各適用モジュール毎に単体テストを行い、効果的な最適化オプションを試行する。

42

CA-005: 最適化の考え方

[C/C++コンパイラ] > [プリプロセッサ]で[追加インクルードディレクトリ] に指定。

43

CA-006: インクルードパスを指定するには?

__ramfunc キーワードを関数の前に追加。

注意

• main関数開始前には使用できない。

• 初期化処理で変数の初期化が終わるまではその関数を呼び出すことができない。

44

CB-001: RAM上への関数配置

__ramfunc void foo(void);

IAR Embedded Workbench for Armでは、最適化の設定によっても変わるが、明示的に参照されない変数や関数は削除されることがある。

絶対削除されたくない変数や関数には、以下の指定が可能。拡張キーワード__root

#pragma required=xxxx

リンカで同様のことをする場合にはEA-002を参照。

45

CB-002: 変数や関数が最終的になくなってしまう

int gc5;

#pragma required=gc5

__root int gc6;

C記述で#pragma packを使用

*詳しくは C/C++開発ガイドのプラグマディレクティブを参照

46

CB-003: 構造体のパッキングを変更するには?

#pragma

pack(2)

struct {

char a0;

int a1;

short a2;

int a3;

char a4;

int a5;

short a6;

int a7;

}ST_B;

#pragma pack(1)

struct {

char a0;

int a1;

short a2;

int a3;

char a4;

int a5;

short a6;

int a7;

}ST_C;

IAR Embedded Workbench for Armでは__section_begin や__section_end でセクションの開示及び終了アドレスの取得、__section_size で大きさを取得可能。

47

CB-004: セクションのアドレスをプログラムで使用するには

#pragma section = "MYSECTION"

#pragma section = "MYSECTION_init"

void DoInit()

{

char * from = __section_begin("MYSECTION_init");

char * to = __section_begin("MYSECTION");

memcpy(to, from, __section_size("MYSECTION"));

}

C/C++ 開発ガイドに記載。

また、処理系定義の動作の詳細にて、

例:

enum Cards{Spade1, Spade2};では1バイトとなる。

2バイトにしたい場合には、enum Cards{Spade1, Spade2,DontUseChar=257};とする。

もしくは、--enum_is_intでint型のサイズとすることも可能。

48

CB-005: IAR Embedded Workbench for Armのenum型の大きさは?

コンパイラでは、enum 定数の保持に必要な最小の型を使用し、unsigned よりもsigned を優先します。IAR システムズの言語拡張が有効化されている場合や、C++ においては、enum 定数および型をlong、unsigned long、long long、unsigned longlong 型にすることも可能です。

列挙型を表すときに使用される整数型 (6.7.2.2)特定の列挙型用に選択される整数型は、列挙型用に定義された列挙定数によって異なります。最小の整数型が選択されます。

IAR Embedded Workbench for Armではオプションで整数型charの符号を変更可能。

49

CB-006: charの符号は?

• Cortex-Mの場合特別なキーワードは不要。ベクタテーブルに対応する関数名を記述。

• Arm7,9,11,Cortex-R/A (Cortex-M以外) の場合__irqキーワードを記述し、ベクタテーブルに対応する関数名を記述。

50

CB-007: 割込みハンドラを記述するには?

void SysTick_Handler (void)

{

/* Something to do */

}

__irq __Arm void IRQ_Handler(void)

{

/* Something to do */

}

• IAR Embedded Workbench ではC言語の標準ライブラリ<stdio.h><time.h>などを使用する事が出来る。

• 一部実装されていない機能もあり。詳しくはマニュアルを参照。( [IAR C/C++ 開発ガイド] > [J.3.12 ライブラリ関数] )

• デバッガ接続時にはPC側のリソース(ファイルや時間)などを利用するセミホスティングも利用可能。

51

CB-008: C言語の標準ライブラリについて

• 幾つかの標準関数は、ハードウェアに依存。例えば、printfなどは最終的に出力をするハードウェア用にコードが必要。これをローレベルインタフェースと呼ぶ。CB-008にあるようにデバッグ時にはデバッガ用のローレベルインタフェースが実装されている。

• 以下の関数を実装することで標準関数を利用できる。必要となる関数はどの関数を利用するかによって異なる。

52

CB-009: C言語の標準ライブラリを使うためには?

__close

__lseek

__open

__read

__write

__exit

time

clock

D.デバッグ/ICE

53

54

DA-001: CoreSightテクノロジ機能・接続まとめ

名称 接続 ICE 基本機能 特徴

JTAG

I-jet

I-jet Trace

○ ・バウンダリスキャン・printfデバッグ

SWD

I-jet

I-jet Trace

○ ・必要信号数:2本・SWV使用可能・printfデバッグ

名称 接続 ICE トレース方式 特徴

SWV

I-jet

I-jet Trace

サンプリング ・パソコンにリアルタイム転送・PC(プログラムカウンタ)取得・特定データのサンプリング・例外処理のトレース・(高速)prinfデバッグ・ピン数:1

・データ欠落可能性→大

ETM

I-jet Trace 分岐トレース(実行)

・ICEのメモリに保存→ブレーク時にパソコンに転送

・実行履歴を確実に追跡・対応しているかはCPU依存・タイムスタンプは誤差あり・データ欠落可能性→小※データ線の本数に依存する

TMS

TCK

TDO

TDI

nRESET

SWDIO

SWDCLK

SWO

-

-

TMS

TCK

TDO

TDI

nRESET

SWDIO

SWDCLK

SWO

-

-

TMS

TCK

TDO

TDI

nRESET

SWDIO

SWDCLK

SWO

-

-

CLK

D0

D1

D2

D3

デバッグ制御

トレース機能*M3/M4/M7のみ

Serial Wire Debug

Serial Wire Viewer

Serial Wire Output

1,2,4本から選択

Embedded Trace Macrocell

55

DA-002: CoreSightテクノロジトレースタイミング

main()

sub_1()

sub_2()

SWVトレース

トレース情報が取得できない

一定間隔でサンプリング

main()

sub_1()

sub_2()

ETMトレース

プログラムが分岐するタイミングでトレースバッファに出力

• デバイスがSWDに対応していれば、3もしくは4本。SWDデバッグで、最低限必要なピン数は3本(I/O、クロック、グラウンド)もしくはこれにリセットを加えた4本。リセット機能は必須機能ではないため、最低ということであれば3本。

• グラウンドの本数が少ないと信号が弱くなったりノイズがのるリスクあり。(JTAGだと通常5本程度使用)

一般的にはおそらくグラウンドは1本でも開発可能だが、基板やICEの品質にも関わってくるため、使用者が確認の必要あり。

• SWDは、一般的にCortex-A,R,Mに対応しているが、デバッガとデバイスが共にSWDに対応していることが条件となる。

56

DA-003: デバッグに最小限必要なピン数は?

• SWDを使用すると信号線が減るがクロック差やスピード差はあるか?SWDやJTAGと比べて信号線が減るが、実際にはCPUとの通信以外の制御部分が処理の大半を占めるため、デバッガの動作速度の低下を体感することはない。

• JTAGとSWDを比べて、できることできないことは?

• JTAGでできてSWDできないことJTAG本来の機能である端子のバウンダリスキャンテスト

• SWDでできてJTAGでできないことトレース機能であるSWVトレース

• その他SWDのメリットデバッグ用の端子数の減少( 5線式⇒ 2線式 )

上記に伴うコネクタ実装面積の削減が可能

57

DA-004: SWDとJTAGのデバッグ差はあるのか?

ハーフピッチ20ピンコネクタ:MIPI-20

標準対応(ケーブル付)

11pin, 13pinから5V供給可能

58

DA-005:デバッグインタフェースコネクタ I-jet

ハーフピッチ10ピンコネクタ:MIPI-10(JTAG, SWD/SWV)

標準対応(ケーブル付)

ピン配置はハーフピッチ19ピンコネクタの1~10番と同じ

59

DA-005:デバッグインタフェースコネクタ I-jet

標準ピッチ20ピン変換アダプタ:Arm-20(JTAG,SWD/SWV用)

アダプタ標準添付

19pinから5V供給可能

60

DA-005:デバッグインタフェースコネクタ I-jet

61

DA-006:デバッグインタフェースコネクタ例

コネクタ種類 コネクタ例

ハーフピッチ

20(19)pin

*MIPI-20

SAMTEC:FTSH-110-01-L-DV-K

ハーフピッチ

10(9)pin

*MIPI-10

SAMTEC:FTSH-105-01-L-DV-K

フルピッチ20(19)pin

*Arm-20

Harting:09185206803

Molex:90635-1202

Tyco Electronics:2-215882-0

• IAR Embedded Workbench for Armでは、ビルドでELF

フォーマットの実行形式を作成。

• デバッグ情報が入ると、このELFフォーマットのファイル自体は大きくなるが、実コードのサイズは変わらない。

62

DA-007: デバッグ情報を含めるとコードサイズが大きくなる?

ELFヘッダ

プログラムヘッダテーブル

セクション1

セクション2

セクションN

・・・

デバッグ情報を生成すると、デバッグ用のセクションが増えるためELFファイルは

大きくなる。

• MCUの対応Cortex-M3/M4/M7

• SWVトレース対応エミュレータ(ICE)I-jet / I-jet Lite / I-jet Traceが対応

• コネクタの対応SWOピンの接続に対応したコネクタが必要

• 接続方式SWD接続を選択

• レジスタ設定によるSWOポートピンの有効化MCUによってはSWOポートピンが多重化されて他の機能に割り当てられていることがあるため、FWまたはマクロで有効化する必要がある。

63

DB-001: SWV機能の使用条件

SWV機能はSWOピンを使用する

64

DB-002: SWV対応コネクタ

MIPI-10MIPI-20 Arm20

65

DB-003: SWV機能使用時のプロジェクト設定

[設定] > [ドライバ]を[I-jet/JTAGjet]を選択

[I-jet/JTAGjet] > [JTAG/SWD]でインタフェースに[SWD]を選択

※ [一般オプション] > ライブラリ設定stdout/stderrがSWO経由になっていると強制的にSWDが選択される

66

DB-004: SWV(SWO)トレース

■こんなときに・・・

• コードの流れをバックトレースしたい

• コード実行時のタイムスタンプを見たい

など

*補足SWVトレースは1秒間に数千サンプリング程度なので、実行コード全てを追うことできない。

使用方法

67

DB-004: SWV(SWO)トレース

1.SWOトレースウィンドウ設定

2. SWOトレース

3. 右クリックして[有効] PCSample = SWOトレース

4. デバッグ開始

68

DB-005: SWV(SWO)トレースでコードカバレッジ

■こんなときに・・・

• 実装されているコードが想定通りに実行されているか確認したい。

など

*補足• デフォルトで有効となっている「コードカバレッジ」プラグインの機能を使用

• サンプリングタイミングにより、抜け落ちることがあるが、長時間トレースすることで信頼性のあるデータとなる。

赤色のひし形 モジュールや関数の0% が実行されたことを示す。緑色のひし形 モジュールや関数の100% が実行されたことを示す。赤と緑のひし形 モジュールや関数の一部が実行されたことを示す。黄色のひし形 文が1つも実行されていないことを示す。

使用方法

※SWVトレースが可能な状態で

69

DB-005: SWV(SWO)トレースでコードカバレッジ

1.コードカバレッジを選択

2.右クリックして[有効化]

4.[更新]

コードカバレッジが更新表示される

3.デバッグ実行

70

DB-006: SWV(SWO)機能データログ

■こんなときに・・・

• 特定の変数やアドレスへの読み書きアクセスをロギングしたい

• 上記アクセスの時間を知りたい

など

*補足• 変数またはアドレスは4つまで指定可能

メニューから[I-jet/JTAGjet] > [データログ]

使用方法

• 基本:観測したい変数をデータブレークポイントに設定

• オプション:Read時のみ/Write時のみ観測したい場合は以下の設定

71

DB-006: SWV(SWO)機能データログ

3.[表示] > [ブレークポイント]

4.右クリックして[編集] 5.ログ対象アクションを選択

1.グローバルや静的変数上で右クリック 2.’変数’のデータログブレークポイントを設定

使用方法

72

DB-006: SWV(SWO)機能データログ

1.データログ2.右クリックして有効化

3.デバッグ開始

データログ一覧

73

DB-006: SWV(SWO)機能データログ

■こんなときに・・・

• データアクセスが何回あったか、読み書きが何回あったか確認したい

など

*補足• 「すべてのアクセス」数が読み書きアクセスの合計より大きい場合、アクセスの属性情報が正確にとれなかったサンプリングがある

メニューから[I-jet/JTAGjet] > [データログ一覧]

データログのタイムライン表示

74

DB-006: SWV(SWO)機能データログ

■こんなときに・・・

• データの変わったタイミングを時間軸上でみたい

• 他の割り込みなどとの時間関係を見たい

など

メニューより[I-jet/JTAG-jet] > [タイムライン]

タイムラインのデータログ領域を右クリックし[有効化]を選択

75

DB-007: 割込みログ

■こんなときに・・・

• プログラム実行中に発生した割り込みや例外をロギングしたい

• 割り込みハンドラ関数の処理でかかった時間を知りたい

など

※ハンドラの実行時間が短い場合には“入る”と“抜ける”の対応が取れないことがある※ SWOの制約を受けるため、すべての情報が取得できない場合がある

メニューから[I-jet/JTAGjet] > [割込みログ]

76

DB-007: 割込みログ

1.割込みログ 2.右クリックして[有効化]

3.デバッグ開始

割込みログ一覧

77

DB-007: 割込みログ

■こんなときに・・・• 各割込みの発生回数や発生頻度を確認したいなど

メニューから[I-jet/JTAGjet] > [割込みログ一覧]

タイムライン表示

78

DB-007: 割込みログ

■こんなときに・・・• 割り込みの発生タイミングを時間

軸上で見たい

• 割り込みハンドラの処理にかかった時間を時間軸上で見たい

• その他のイベントとの関係を時間軸上で見たい

など

ITMイベントログ

79

DB-008: ITMイベント

■こんなときに・・・• コードの実行タイミングを正確に知り

たい• 実行時の変数の値を見たい• マルチタスクの各タスク入り口出口に

仕掛けて、タスク状況を把握したいなど

*補足• ソースコード上で

Arm_itm.hをinclude

ITM_EVENT8_WITH_PC(1,1)と記述

• チャンネルは1-4が使用可能

※参考URLhttps://www.iar.com/support/tech-notes/debugger/measuring-

the-time-consumption-of-a-piece-of-code-sw0-swv/

ITM_EVENT8(channel, value)

ITM_EVENT16(channel, value)

ITM_EVENT32(channel, value)

ITM_EVENT8_WITH_PC(channel, value)

ITM_EVENT16_WITH_PC(channel, value)

ITM_EVENT32_WITH_PC(channel, value)

使用できるAPI

ITMイベント一覧

80

DB-008: ITMイベント

■こんなときに・・・

• 各チャンネルのITMイベント発生回数や頻度を知りたい

• 実行時間が適正な間隔になっているか知りたい

• ウォッチしている値が適正な値になっているか知りたい

など

タイムライン

81

DB-008: ITMイベント

■こんなときに・・・

• ITMイベントの発生タイミングを時間軸上で見たい

• 各ITMイベント間の関係や割り込みなどのと関係を時間軸上で見たい

• イベント間をドラッグドップで、経過時間を知りたい

など

タイムライン

82

DB-008: ITMイベント

1.Arm_itm.hをインクルード

2.マクロをコードに記述

4.イベントログ

5.右クリックして[有効化]

6.デバッグ開始

3.ビルド&ダウンロード

タイムライン

83

DB-008: ITMイベント

1.タイムライン

2.表示したい機能の上で右クリックして[有効化]

4. デバッグ開始

3. 右クリックして[ズーム] > [任意の時間軸]

• MCUの対応

• ETM機能の実装はMCUベンダの選択による

• Trace Dataピン(1-4本)はMCUベンダの選択による

• トレース機能付きエミュレータ(ICE)を使用

• I-jet Traceが対応

• コネクタの対応

• トレースピンの接続に対応したコネクタが必要

• レジスタ設定によるトレースポートピンの有効化

• MCUによってはトレースポートピンが多重化されて他の機能に割り当てられていることがあるため、FWまたはマクロで有効化する必要がある

84

DC-001: トレース機能の使用条件

MIPI-20

85

DC-002: Cortex-M用ETMトレース対応コネクタ

ETMトレース用クロック

ETMトレース用データポート

86

DC-003a: ETMトレース使用時のプロジェクト設定

[デバッガ] > [設定] >

[ドライバ] で [I-jet/JTAGjet]を選択

[I-jet / JTAGjet] > [トレース]

[パラレル(ETM)] を選択

87

DC-003a: ETMトレース使用時のプロジェクト設定

設定項目の詳細は

[ヘルプ] > [C-SPYデバッグガイド]

を参照

[I-jet/JTAGjet] > [ETMトレース設定]

ETM Trace Settingsで[設定を試す]をクリッククロック周波数のトレースの値が設定される

[ETMトレース]

実行された命令を表示

88

DC-004:ETMトレース表示

[ETM関数トレース]

実行された関数を表示

89

DC-005: ETM関数トレース表示

90

DC-006: コードカバレッジ:C言語

91

DC-007: コードカバレッジ:アセンブラ

コードカバレッジ 命令プロファイリング

1. トレース取得を開始したいコード上で右クリックし、[ブレークポイントの切り替え(トレース開始)] を指定

2. トレースを停止したいコード上で[ブレークポイントの切り替え(トレース停止)] を指定

※ブレークしたときにトレースデータがICEから読み出され画面に表示される

92

DC-008: ETMトレース用のブレークポイント設定

93

DC-009: ETMトレースタイムラインでコールスタック表示

94

DD-001: デバッグウィンドウ:

ブレークポイント

■こんなときに・・・

• ブレークポイントの一覧が見たい• ブレークポイントを貼っている

ソースコードに飛びたい• 一時的にブレークポイントを全て

無効にしてデバッグしたい。• ブレークポイントを削除したい• ブレークポイントを編集したい

など

95

DD-002: デバッグウィンドウ:

逆アセンブリ

■こんなときに・・・

• アセンブラレベルでステップ実行したい

• 実行中のアドレスを見たい• ライブラリなど、ソースファイ

ルのないプログラムをデバッグしたい

• 最適化の影響を確認したい

など

96

DD-003: デバッグウィンドウ:

メモリ

■こんなときに・・・

• 現在のメモリの値を見たい• メモリをPC上の保存したい• メモリ上でデータを検索したい

など

97

DD-004: デバッグウィンドウ:

シンボルメモリ

■こんなときに・・・

• アドレス順に変数や関数の一覧を見たい

など

98

DD-005: デバッグウィンドウ:

レジスタ

■こんなときに・・・

• 現在の各種レジスタの値が見たい• デバッグ用にレジスタの値を変え

てみたい

など

99

DD-006: デバッグウィンドウ:

ウォッチ

■こんなときに・・・

• 特定の静的変数やグローバル変数の値をモニタリングしたい

• ローカル変数の値をスコープ内でモニタリングしたい

など

100

DD-007: デバッグウィンドウ:

ローカル

■こんなときに・・・

• 関数内のローカル変数や引数を自動的にモニタリングしたい

など

101

DD-008: デバッグウィンドウ:

静的変数

■こんなときに・・・

• プログラム内の静的変数やグローバル変数を自動的にモニタリングしたい

など

102

DD-009: デバッグウィンドウ:

自動(オート)

■こんなときに・・・

• ステップ実行でデバッグをしているときに近辺の変数や関数情報を自動的にモニタリングしたい

など

103

DD-010: デバッグウィンドウ:

ライブウォッチ

■こんなときに・・・

• 特定の静的変数やグローバル変数を、プログラム実行状態のまま定期的にモニタリングしたい

など

更新間隔は、[ツール] > [オプション]

[デバッガ] の [更新間隔] にて設定

104

DD-011: デバッグウィンドウ:

クイックウォッチ

■こんなときに・・・

• 変数を簡単な式で評価したいcount> 100 など真なら1

• 任意のタイミングでC-SPYマクロを実行したい

など

*補足• C-SPYマクロは非常に強力かつ柔軟[ヘルプ] > [C-SPYデバッグガイド]

の[C-SPY マクロの使用] を参照

105

DD-012: デバッグウィンドウ:

コールスタック

■こんなときに・・・

• 実行中の関数の呼び出し元を知りたい• 各関数の引数も見たい

など

106

DD-013: デバッグウィンドウ:

スタック

■こんなときに・・・

• 現在のスタック使用状況を見たい• 現在のスタック使用率を見たい• それまでの最大スタック使用量を

知りたい

など

*補足• OSを搭載している場合、OS側で各タスクのスタックを管理するので、別途プラグインなどを活用してスタックを確認

動的なスタック使用量の解析

• RTOS不使用の場合には、動的スタック使用量の解析が使用できる。

• 有効にするには、[ツール] > [オプション] > [スタック] > [グラフィカルスタックの表示…]をオンにする。

107

DD-013: デバッグウィンドウ:

スタック

動的な解析の表示

108

DD-014: デバッグウィンドウ:

ターミナルI/O

■こんなときに・・・

• printfデバッグがしたい• デバッグ用にパラメータなどを

scanfでIAR Embedded

Workbench for Armの画面上から入力したい

など

*補足• <stdio.h>をinclude• コードサイズが大きくなってしまう場合は、[プロジェクト] > [オプション] >

[一般オプション] > [ライブラリオプション]

から調整可能• printfはデフォルトだとターミナルIOに出力されるが、ユーザコードで実装することでUARTなどに変更可能

109

DD-015: デバッグウィンドウ:

イメージ

■こんなときに・・・

• 現在のイメージ(デバッグ情報)を確認したい

など

*補足

• ブートローダプロジェクトなどで複数バイナリをデバッグするとき以外は出番なし

110

DE-001: シミュレータの設定

[設定] > [ドライバ:シミュレータ]を選択

C-SPYシミュレータで出来ることは以下の通り

1. 命令レベルのシミュレーション

2. メモリの構成、検証

3. 割込みシミュレーション

4. イミディエイトブレークポイントとC-SPYマクロシステムを使用した周辺シミュレーション

デフォルトではCPUコア単体+メモリの状態でのシミュレーションが可能

周辺や割込みを使うシミュレーションは3または4に関してユーザ側で要準備

111

DE-002: シミュレータの出来る事

3. 割込みを疑似発生

4. C-SPYマクロ周辺の模擬

1. CPUコア

2. メモリ

割込みシミュレーションの使用法

シミュレータ動作時に、 ①シミュレータ→②割込み設定

割込み設定画面で、 ③割り込み設定を右クリック

④設定したい割り込みイベントを選択

割り込みが登録される、 ⑤初回の割込みを起こしたいサイクル、周期などを設定し、あとは通常の手順でシミュレーションを実施。

112

DE-003: 割込みシミュレーション

④ ⑤必要な項目を設定

CPUコア単体でのシミュレーション。

“C-SPYデバッガガイド”に「C-SPY シミュレータは、ターゲットプロセッサの機能をソフトウェアで完全にシミュレーションするため、ハードウェアがすべて揃っていなくてもプログラムロジックをデバッグできます。」と記載があるように、シミュレータは実機がない場合などに多く用いられており、実機がある場合には実機を用いてのソフト開発が適している。

113

DE-004:シミュレーションによる再現性

[デバッガ] > [設定] > [指定位置まで実行]に__exitを指定する

114

DF-001:デバッグ開始と同時にプログラムをスタート

115

DF-002:ソースコードデバッグが出来ない?

• [ローカル]ウィンドウには、ローカル変数、つまりアクティブな関数の自動変数と関数パラメータを表示することが可能

• ただ、コンパイラの最適化により正しい値を表示できない場合や不明となる場合がある

• デバッグ時にローカル変数を見るためには最適化を無し、もしくは、低に設定をする

116

DF-003:ローカル変数はデバッグ時に観測できる?

E:リンカ

117

• C/C++開発ガイドの “リンカ設定ファイル” を参照

• IARシステムズの日本法人が作成した簡易ガイドは以下のページからダウンロード可能

http://www.iar.com/jp/ilink-setting-guide/

118

EA-001:リンカ設定に関する資料は?

• IAR Embedded Workbench for Armでは、最適化の設定によっても変わるが、明示的に参照されない変数や関数は削除されることがある。

• 絶対削除されたくない変数や関数には、リンカで必ず出力する指定をする事ができる。

• ソースコードで同様のことをする場合にはCB-002を参照

119

EA-002:リンカ設定で変数/関数を必ず出力するには?

[リンカ] > [入力] > [シンボルをキープ]で変数や関数名を登録。

IAR Embedded Workbench for Armのデフォルトの設定ではスタックサイズを以下のオプション画面で変更できる。

[リンカ] > [設定] > [編集]、[スタック/ヒープサイズ]

120

EA-003:スタックサイズを変更するには?

[リンカ] > [アドバンスド] > [スタックの使用量解析を有効にする]にチェックを入れ、メイクを実行するとマップファイルに解析結果が出力される

121

EA-004:静的なスタック解析を実施するには?

*******************************************************************************

*** STACK USAGE

***

Call Graph Root Category Max Use Total Use

------------------------ ------- ---------

Program entry 360 360

Uncalled function 16 16

Program entry

"__iar_program_start": 0x080022dd

Maximum call chain 360 bytes

"__iar_program_start" 0

"__cmain" 0

"main" 24

"printf" 24

"_PrintfFullNoMb" 152

"_PutfldFullNoMb" in xprintffull_nomb.o [3] 16

"_LdtobFullNoMb" in xprintffull_nomb.o [3] 88

"_GenldFullNoMb" in xprintffull_nomb.o [3] 48

"__aeabi_memcpy" 0

"__aeabi_memcpy4" 8

静的なスタック解析では以下の2つ方法で解析の補助情報を与えることができる

・ソースコード上に#pragmaで補助情報を与える

・制御ファイルで補助情報を与える

122

EA-005:静的なスタック解析の補助情報を与える

ソースコード上に#pragmaで補助情報を与える

• #pragma calls → 関数が呼ばれることを明示的に指定

• #pragma call_graph_root → 解析のrootの指定

123

EA-005:静的なスタック解析の補助情報を与える

void Fun1(), Fun2();

void Caller(void (*fp)(void))

{

#pragma calls = Fun1,

Fun2

(*fp)();

}

#pragma

call_graph_root="interrupt"

void My_Handler (void ) {

・・・}

制御ファイルで補助情報を与える

124

EA-005:静的なスタック解析の補助情報を与える

possible calls main: f1;

max recursion depth recf: 10;

call graph root [ interrupt ]:

SysTick_Handler,Default_Handler;

function gg1: 10, calls f1;

*詳細はC/C++開発ガイドを参照

section領域を定義する方法

125

EA-006: 領域の定義方法

#pragma location

="MYFUNC2"

int f1(int a ) { … }

#pragma location="DATA"

int bbb[]={0,1,2,3};

#pragma default_function_attributes =__root

@ "MYFUNC1"

int fun1(int x) {…}

int fun2(int x) { …}

#pragma default_function_attributes =

#pragma default_variable_attributes = __root

@ "MYSEG"

int var1 = 42;

int var2 = 17;

#pragma default_variable_attributes =

1つずつ指定する方法

範囲で指定する方法

[リンカ] > [チェックサム]にて、[未使用コードメモリをフィルする]にチェックを入れて、フィルパターンを設定し、対象領域の開始アドレスと終了アドレスを指定する。

126

EA-007: 未使用領域を特定のコードで埋めたい

個別オプションにてコードセクションの定義が可能

127

EA-008: ファイルごとにコードセクションを定義したい

IAR Embedded Workbench for Armのリンカはコード効率などの点から、適宜並び替えて配置するため記述した順番での配置とはならない。

順番を指定するための方法は以下の通り。

128

EA-009: 変数をC言語で記述した順序で配置したい

struct {

short a;

char b;

int c;

char d;

}data;

1)構造体にまとめる

short a@0x20001000;

char b@0x20001002;

int c@0x20001003;

char d@0x20001007;

2) 絶対アドレスで配置する

short a@”section1”;

char b@”section2”;

int c@”section3”;

char d@”section4”;

define block MYBLOCK with fixed

order

{

section section1,

section section2,

section section3,

section section4

}

3)セクションを指定しリンカ設定でも指定

• [リンカ] > [リスト]でリンカマップファイルの生成を選択

• ビルドを行うと、ワークスペースのOutputフォルダ内に、マップファイルが表示され、ダブルクリックすることでエディタ画面で見ることができる

129

EA-010: リンカマップを出力するには?

C言語の標準ライブラリのなかでprintf系、scanf系のライブラリは比較的大きなコードサイズ。そのためIAR Embedded Workbench for Armではオプションで使用するライブラリの大きさを指定することが出来る。詳しくは[C/C++ 開発ガイド]の、Printf フォーマッタの選択、Scanf フォーマッタの選択を参照。

130

EA-011:ライブラリを組込むとコードサイズが大きい?

FAQで参考となるドキュメントを提示

https://www.iar.com/jp/support/tech-notes/general/checksum-

calculation-with-xlink/

131

EA-012:チェックサムの実装法がわからない

L: マイコン/CPU関係

132

133

LA-001: Armの命令セット

• Armの命令種類

命令セット ビット 特徴

Arm32bit 32ビット命令セット

*パフォーマンス高いがコード密度低い

Thumb16bit 16ビット命令のサブセット

*コード密度高いがパフォーマンスやや低い

Armv6-M

Thumb

16bit + 32bit16ビット命令+Thumb2の32ビット命令を6個サポート。

Armv7-M

Thumb2

16bit + 32bit 16ビット+32ビット混在の命令セット。*パフォーマンスおよびコード密度高い

• Armファミリー毎の命令対応

名称 命令セット 特徴

Arm6 Arm

Arm7 Arm9 Arm11 Arm+Thumb 命令セットを使い分ける際にはCPUのモード切替が必要

Cortex-M0/M0+ Armv6-M Thumb CPUモードを変えることなく必要に応じて32bit命令を使用可能

Cortex-M3/M4/M7 Armv7-M Thumb2

CPUモードを変えることなく必要に応じて32bit命令を使用Armv6-M Thumbを大幅に拡張しており高い性能とコード効率を実現。

プロジェクトのオプション画面

134

LA-002: IAR Embedded Workbench for ArmでCPUコアの選択と命令の選択

コア/マイコン選択:

一般オプション-ターゲット命令:C/C++コンパイラ-コード

135

LA-003: IAR Embedded Workbench for Armのスタートアップシーケンス

Vector No. Vector Offset 例外& 割り込み 値

00 0x00 Stack Top sfe (CSTACK)

01 0x04 Reset __iar_program_start

02 0x08 NMI Default Handler

03 0x0C Hard Fault Default Handler

04 0x10 Memory Management Default Handler

05 0x14 Bus Fault Default Handler

06 0x18 Usage Fault Default Handler

07~10 0x1C~0x28 Reserved 0

11 0x2C SVCall Default Handler

12 0x30 Debug Monitor Default Handler

13 0x34 Reserved 0

14 0x38 PendSV Default Handler

15 0x3C SysTick Default Handler

16 ~ 255 0x40~0x3FC External Interrupts Interrupt Handlers

__iar_program_start:

bl __iar_init_core ; optional

bl __iar_init_vfp ; optional, enable VFP, thumb¥fpinit_M.s

bl __cmain

__cmain:

bl __low_level_init ; low_level_init.c

bl __iar_data_init3 ; initialize data sections, init¥data_init3.c

bl main

int main (void) { …… }

void xxx_InterruptHandler (void) { …… }

Cortex-M0/M3/M4

Vector Table:

thumb¥vector_table_M.s

or thumb¥cstartup_M.c

デフォルトプログラムエントリ:

thumb¥cstartup_M.s

or thumb¥cstartup_M.c

main()前の初期化:

thumb¥cmain.s

User’s Application:

IAR DLIBランライムライブラリのコードただし上書き可能

ユーザコード

参照 ジャンプ

ICEで使用するピンを他用途に変更してしまっているとデバッグができなくなることがある

フラッシュをクリアするなどで対応する必要がある※

Cortex-MにICE接続するためには下記が必須

JTAG接続の場合 TCK, TDI, TMS, TDO, nRESET

SWD接続の場合 SWCLK, SWDIO

※お問い合わせはチップベンダ/代理店へ

136

LA-004: 小ピンMCUでICE接続が出来なくなる