Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
はじめに本資料の位置づけと読み方
【位置づけ】
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
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のオプション設定概要
ツール関係全般オプション
プロジェクト固有のオプション設定
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++コンパイラ]→
[リスト]→[リストファイルの出力]
モトローラ/インテル形式ファイル
.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 あり
なし リンカ:小さいルーチンのインライン化 あり
• 最適化レベル
• なし
• 低*1
• 中
• 高(バランス)*2
• 高(速度)
• 高(サイズ)
*1 ビルド構成がDebugの場合の初期値
*2 ビルド構成がReleaseの場合の初期値
※デバッグ時は、「なし」か「低」に設定を推奨。
33
CA-002: 最適化レベルとデバッグ情報の保持
• 変数の位置情報
• 変数のスコープおよび存在情報
• ステップポイント
• ステップ実行時のソースコードと機械語の対応
• 関数のステップイン/アウト
• ブレークポイントの設置
• コールスタック情報
• 関数を特定する情報およびコールスタック内での変数情報
34
最適化レベル 変数の位置情報 ステップポイント コールスタック情報
なし 保持 保持 保持
低 ほぼ保持 保持 保持
中 保持されない 保持 保持
高 保持されない 保持されない 保持
CA-002: 最適化レベルとデバッグ情報の保持
プロジェクト全体ではなく、ソースグループ単位やソースコード単位で最適化レベルを変更する場合には以下の設定を実施。
36
CA-003: 最適化の適用範囲と個別設定
グループまたはソースコード個別に上書きする際には[継承した設定をオーバーライド] にチェック
ダブルクリック
関数単位で最適化レベルを設定するには#pragma optimizeを使用。
37
CA-003: 最適化の適用範囲と個別設定
関数単位
#pragma optimize の直下に記述された関数のみ適用される。
ファイルソースに適用されている最適化レベルを下げる方向にのみ指定可能。
※ファイルの最適化レベルが[中]のコードに対して#pragma optimize= high は適用できない。
最適化例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: 最適化の考え方
__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)特定の列挙型用に選択される整数型は、列挙型用に定義された列挙定数によって異なります。最小の整数型が選択されます。
• 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
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のデバッグ差はあるのか?
ハーフピッチ10ピンコネクタ:MIPI-10(JTAG, SWD/SWV)
標準対応(ケーブル付)
ピン配置はハーフピッチ19ピンコネクタの1~10番と同じ
59
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機能の使用条件
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.’変数’のデータログブレークポイントを設定
データログ一覧
73
DB-006: SWV(SWO)機能データログ
■こんなときに・・・
• データアクセスが何回あったか、読み書きが何回あったか確認したい
など
*補足• 「すべてのアクセス」数が読み書きアクセスの合計より大きい場合、アクセスの属性情報が正確にとれなかったサンプリングがある
メニューから[I-jet/JTAGjet] > [データログ一覧]
データログのタイムライン表示
74
DB-006: SWV(SWO)機能データログ
■こんなときに・・・
• データの変わったタイミングを時間軸上でみたい
• 他の割り込みなどとの時間関係を見たい
など
メニューより[I-jet/JTAG-jet] > [タイムライン]
タイムラインのデータログ領域を右クリックし[有効化]を選択
75
DB-007: 割込みログ
■こんなときに・・・
• プログラム実行中に発生した割り込みや例外をロギングしたい
• 割り込みハンドラ関数の処理でかかった時間を知りたい
など
※ハンドラの実行時間が短い場合には“入る”と“抜ける”の対応が取れないことがある※ SWOの制約を受けるため、すべての情報が取得できない場合がある
メニューから[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.ビルド&ダウンロード
• MCUの対応
• ETM機能の実装はMCUベンダの選択による
• Trace Dataピン(1-4本)はMCUベンダの選択による
• トレース機能付きエミュレータ(ICE)を使用
• I-jet Traceが対応
• コネクタの対応
• トレースピンの接続に対応したコネクタが必要
• レジスタ設定によるトレースポートピンの有効化
• MCUによってはトレースポートピンが多重化されて他の機能に割り当てられていることがあるため、FWまたはマクロで有効化する必要がある
84
DC-001: トレース機能の使用条件
86
DC-003a: ETMトレース使用時のプロジェクト設定
[デバッガ] > [設定] >
[ドライバ] で [I-jet/JTAGjet]を選択
[I-jet / JTAGjet] > [トレース]
[パラレル(ETM)] を選択
87
DC-003a: ETMトレース使用時のプロジェクト設定
設定項目の詳細は
[ヘルプ] > [C-SPYデバッグガイド]
を参照
[I-jet/JTAGjet] > [ETMトレース設定]
ETM Trace Settingsで[設定を試す]をクリッククロック周波数のトレースの値が設定される
1. トレース取得を開始したいコード上で右クリックし、[ブレークポイントの切り替え(トレース開始)] を指定
2. トレースを停止したいコード上で[ブレークポイントの切り替え(トレース停止)] を指定
※ブレークしたときにトレースデータがICEから読み出され画面に表示される
92
DC-008: ETMトレース用のブレークポイント設定
94
DD-001: デバッグウィンドウ:
ブレークポイント
■こんなときに・・・
• ブレークポイントの一覧が見たい• ブレークポイントを貼っている
ソースコードに飛びたい• 一時的にブレークポイントを全て
無効にしてデバッグしたい。• ブレークポイントを削除したい• ブレークポイントを編集したい
など
95
DD-002: デバッグウィンドウ:
逆アセンブリ
■こんなときに・・・
• アセンブラレベルでステップ実行したい
• 実行中のアドレスを見たい• ライブラリなど、ソースファイ
ルのないプログラムをデバッグしたい
• 最適化の影響を確認したい
など
103
DD-010: デバッグウィンドウ:
ライブウォッチ
■こんなときに・・・
• 特定の静的変数やグローバル変数を、プログラム実行状態のまま定期的にモニタリングしたい
など
更新間隔は、[ツール] > [オプション]
[デバッガ] の [更新間隔] にて設定
104
DD-011: デバッグウィンドウ:
クイックウォッチ
■こんなときに・・・
• 変数を簡単な式で評価したいcount> 100 など真なら1
• 任意のタイミングでC-SPYマクロを実行したい
など
*補足• C-SPYマクロは非常に強力かつ柔軟[ヘルプ] > [C-SPYデバッグガイド]
の[C-SPY マクロの使用] を参照
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: デバッグウィンドウ:
イメージ
■こんなときに・・・
• 現在のイメージ(デバッグ情報)を確認したい
など
*補足
• ブートローダプロジェクトなどで複数バイナリをデバッグするとき以外は出番なし
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:シミュレーションによる再現性
• [ローカル]ウィンドウには、ローカル変数、つまりアクティブな関数の自動変数と関数パラメータを表示することが可能
• ただ、コンパイラの最適化により正しい値を表示できない場合や不明となる場合がある
• デバッグ時にローカル変数を見るためには最適化を無し、もしくは、低に設定をする
116
DF-003:ローカル変数はデバッグ時に観測できる?
• 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: 未使用領域を特定のコードで埋めたい
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:チェックサムの実装法がわからない
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ランライムライブラリのコードただし上書き可能
ユーザコード
参照 ジャンプ