IAR Embedded
Workbench for Arm
TIPS集
はじめに
本資料の位置づけと読み方
【位置づけ】
IAR Embedded Workbench for Armのマニュアルの補足説明資料です。
【読み方】
各TIPSには5桁または6桁のIDが振られています。
資料更新があってもIDの上位5桁は固定です。
バージョンアップなどにより内容が変わる場合には6桁目に
差分を示します。
―
中項目
大項目
Version差ID
(option)
小項目番号
B.
基本設定/一般オプション/マニュアル資料
C.
C/C++コンパイラ
D.
デバッグ/ICE
E.
リンカ
F.
アプリケーション
G.
アセンブラ
H.
補助ツール
I.
他ツール連携
J.
Windowsなどとの関係
K.
C-STAT/C-RUNなど
L.
マイコン/CPU
TIPSの概略構成
目次
ページタイトル
ページ
はじめに 本資料の位置づけと読み方
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
目次
ページタイトル
ページ
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
目次
ページタイトル
ページ
D.
デバッグ/ICE
53
DA-001: CoreSightテクノロジ機能・接続まとめ54
DA-002: CoreSightテクノロジトレースタイミング55
DA-003: デバッグに最小限必要なピン数は?56
DA-004: SWDとJTAGのデバッグ差はあるのか?57
DA-005: デバッグインタフェース:コネクタ I-jet58 - 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
目次
ページタイトル
ページ
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-008: デバッグウィンドウ:静的変数101
DD-009: デバッグウィンドウ:自動(オート)102
DD-010: デバッグウィンドウ:ライブウォッチ103
DD-011: デバッグウィンドウ:クイックウォッチ104
DD-012: デバッグウィンドウ:コールスタック105
DD-013: デバッグウィンドウ:スタック106 - 107
DD-014: デバッグウィンドウ:ターミナルI/O108
DD-015: デバッグウィンドウ:イメージ109
DE-001: シミュレータの設定110
DE-002: シミュレータの出来る事111
DE-003: 割込みシミュレーション112
DE-004: シミュレーションによる再現性113
DF-001: デバッグ開始と同時にプログラムをスタート114
DF-002: ソースコードデバッグが出来ない?115
目次
ページタイトル
ページ
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
B.基本設定/一般オプション/
マニュアル資料
IAR Embedded Workbench for ArmはPDFのマニュアルとオンラインマ
ニュアルがある。
• PDFのマニュアルに関しては BA-002・BA-004を参照。
• オンラインマニュアルに関しては BA-003を参照。
マニュアルとソフトウェア構成の関係
BA-002a: メニューからマニュアルを
開く
IAR Embedded Workbench for Arm
IDEツール
エディタ プロジェクト マネージャ ライブラリ ビルダ ライブラリアンビルドツール
IAR C/C++ コンパイラ アセンブラ リンカIAR C-SPY
デバッガ
シミュレータ ハードウェア システムドライバ Powerデバッグ RTOSプラグイン I-jet 静的解析ツールIAR Embedded Workbench for Arm画面上でF1キーを押すことで
ヘルプが表示される。
BA-003: IAR Embedded Workbench
for Arm上でヘルプ
たとえば、ここで F1キーを押す
IAR Embedded Workbench for Armのメニューから
[ヘルプ] > [Arm用IARインフォメーションセンタ] > [ユーザガイド]
BA-004a: インフォメーションセンタ
からマニュアルを開く
推奨するマニュアル参照順序
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の標準的なマニュアル構成
BA-005: IAR Embedded Workbench
for Armのマニュアルの基本構成
Part.1
関連モジュールの概要説明
Part.2
関連モジュールの詳細説明
教科書的な説明
辞書的な説明
BA-006a: IDE プロジェクト管理および
ビルドガイド章目次
パート1.
プロジェクト管理とビルド
• 開発環境
• プロジェクト管理
• プロジェクトのビルド
• 編集
パート2.
リファレンス情報
• インストールファイル
• メニューリファレンス
• 一般オプション
• C-STAT オプション
• コンパイラオプション
• アセンブラオプション
• 出力コンバータオプション
• カスタムビルドオプション
• ビルドアクションオプション
• リンカオプション
• ライブラリビルダオプション
BA-007a: IAR C/C++ 開発ガイド章目次
パート1.
ビルドツールの使用
•
IAR ビルドツールの概要
•
組込みアプリケーションの開発
•
データ記憶
•
関数
•
ILINK を使用したリンク
•
アプリケーションのリンク
•
DLIB ランタイムライブラリ
•
アセンブラ言語インタフェース
•
C の使用
•
C++ の使用
•
アプリケーションに関する考慮事項
•
組込みアプリケーション用の効率的
なコーディング
パート2.
リファレンス情報
• 外部インタフェースの詳細 • コンパイラオプション • リンカオプション • データ表現 • 拡張キーワード • プラグマディレクティブ • 組込み関数 • プリプロセッサ • ライブラリ関数 • リンカ設定ファイル • セクションリファレンス • スタック使用制御ファイル • IAR ユーティリティ • C 規格の処理系定義の動作 • C89 の処理系定義の動作BA-008a: C-SPYデバッガガイド章目次
パート1.
基本デバッグ
• IAR C-SPY デバッガ • C-SPY を使用するにあたって • アプリケーションの実行 • 変数と式 • ブレークポイント • メモリとレジスタパート3.
高度なデバッグ
パート2.
アプリケーションの分析
• トレース • アプリケーションタイムライン • プロファイリング • コードカバレッジ • Power デバッグ • C-RUN ランタイムエラー解析•
[デバッガ]オプション
•
C-SPY ドライバについての追加情報
•
マルチコアデバッグ
•
割込み
•
C-SPY マクロ
•
C-SPY コマンドラインユーティリティ
パート4.
追加リファレンス情報
ツールオプションとプロジェクトオプション
BA-009a: IAR Embedded Workbench
for Armのオプション設定概要
ツール関係全般オプション
BA-010a: ツールオプション概要
表示・操作性 カスタマイズ ビルド動作等 カスタマイズ ソースコード管理 カスタマイズ デバッグ時スタック 解析動作等 カスタマイズ デバッガ動作等 カスタマイズBA-011a: プロジェクトオプション概要
開発フロー ターゲット設定 ライブラリ設定 コンパイラ設定 ※最適化など リンカ設定 ※メモリ配置、 チェックサム ICE固有の設定 ※リセット・速度 デバッグ用設定 ICE選択 書き込み設定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ファイル
ライブラリファイル .aファイル
モトローラ/インテル形式ファイル
.srec(.hex)ファイル
BA-012:ビルド時の生成ファイル
S010000070726F6A656374312E73726563EC S11300003804002019030000B3020000B30200000A S1130010B3020000B3020000B302000000000000BD S1130020000000000000000000000000B302000017 S1130030B302000000000000B3020000B30200009D S113004038B52D2401201349486012490860022064 S1130050040024B20A2C0FDA24B2200000F00DF8B8 ・・・ S1130280A142F8D110BD00BF2C0000004C000000BA S11302B07047FEE7DDFFFFFF2C0000000800002070 S11302C000000000BBFEFFFF080000005800000013 S11302D0000000200000000000F009F8002801D010 S11302E0FFF7C0FF0020FFF7ADFF00F002F8012088 S11302F0704700F001B800000746384600F002F8E5 S1130300FBE7000080B5FFF751FF024A11001820F7 S1130310ABBEFBE726000200C046C046C046C0464E S10F0320FFF7DAFFFFFFFFFFFFFFFFFF06 S9030319E0.mapファイル
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
.lstファイル
BA-012:ビルド時の生成ファイル
¥ In section .bss, align 4 29 int callCount; ¥ callCount: ¥ 00000000 DS8 4 3031 /* 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
IAR Embedded Workbench for Armのメニュー
[ツール] > [オプション] でIDEオプションを開き、
[エディタ] > [行番号の表示]にチェックを入れることで
行番号が表示される。
IAR Embedded Workbenchで新しくプロジェクトを
生成するとDebugとReleaseのビルド構成が生成される。
BA-014: ビルド構成DebugとReleaseの違い
Debug
項目
Release
あり
セミホスティング
なし
低
最適化
高
あり
C/アセンブラでデバッグ情報生成
なし
なし
マクロ定義NBDEBUG
あり
なし
リンカ:小さいルーチンのインライン化
あり
最適化の設定
• 最適化レベル
• なし
• 低*1
• 中
• 高(バランス)*2
• 高(速度)
• 高(サイズ)
*1 ビルド構成がDebugの場合の初期値
*2 ビルド構成がReleaseの場合の初期値
※ デバッグ時は、「なし」か「低」に設定を推奨。
CA-002: 最適化レベルとデバッグ情報の保持
•
変数の位置情報
• 変数のスコープおよび存在情報
•
ステップポイント
• ステップ実行時のソースコードと機械語の対応
• 関数のステップイン/アウト
• ブレークポイントの設置
•
コールスタック情報
• 関数を特定する情報およびコールスタック内での変数情報
最適化レベル 変数の位置情報 ステップポイント コールスタック情報 なし 保持 保持 保持 低 ほぼ保持 保持 保持 中 保持されない 保持 保持 高 保持されない 保持されない 保持CA-002: 最適化レベルとデバッグ情報の保持
•
プロジェクト全体
•
ソースグループ単位
•
ソースコード単位
•
関数単位
CA-003: 最適化の適用範囲と個別設定
プロジェクト全体 ソースグ ループ単 位 ソースコード単位 関数単位プロジェクト全体ではなく、ソースグループ単位やソースコード単位
で最適化レベルを変更する場合には以下の設定を実施。
CA-003: 最適化の適用範囲と個別設定
グループまたはソースコード個別に上書きする際には [継承した設定をオーバーライド] にチェック ダブルクリック関数単位で最適化レベルを設定するには#pragma optimizeを使用。
CA-003: 最適化の適用範囲と個別設定
関数単位 #pragma optimize の直下に記述された関数のみ 適用される。 ファイルソースに適用されている最適化レベルを 下げる方向にのみ指定可能。 ※ファイルの最適化レベルが[中]のコードに対して #pragma optimize= high は適用できない。次ページ以降で以下の手法について内容をご紹介
•
共通部分式除去
•
ループ展開
•
関数インライン化
最適化例1: 共通部分式除去
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:ループ展開
CA-004: 最適化手法について
for ( i = 0; i < 3; i++)
{
j[i] = i;
}
j[0] = 0;
j[1] = 1;
j[2] = 2;
入力ソースコード
最適化イメージ
ループを展開することで、ループ処理のオーバーヘッドを削減
最適化例3:関数インライン化
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]);
}
•
最適化の手法は一定の効果が保証されるものではなくコンパイラ
によって発見的・探索的に適用される。
•
デバッグやメンテナンスのしやすさを考慮し、
サイズの削減が必要なコードや処理速度の追求が必要なコードご
とに適用範囲(ソースファイル/グループ)を限定して高い最適化レ
ベルを適用することを推奨。
•
各適用モジュール毎に単体テストを行い、効果的な最適化オプ
ションを試行する。
CA-005: 最適化の考え方
[C/C++コンパイラ] > [プリプロセッサ]で
[追加インクルードディレクトリ] に指定。
__ramfunc キーワードを関数の前に追加。
注意
• main関数開始前には使用できない。
• 初期化処理で変数の初期化が終わるまではその関数を呼び出すこと
ができない。
CB-001:
RAM上への関数配置
IAR Embedded Workbench for Armでは、最適化の設定によっても変わ
るが、明示的に参照されない変数や関数は削除されることがある。
絶対削除されたくない変数や関数には、以下の指定が可能。
拡張キーワード__root
#pragma required=xxxx
リンカで同様のことをする場合にはEA-002を参照。
CB-002: 変数や関数が最終的になく
なってしまう
int gc5;
#pragma required=gc5
__root int gc6;
C記述で#pragma packを使用
*詳しくは C/C++開発ガイドのプラグマディレクティブを参照
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 で大きさを取得可能。
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型のサイズとすることも可能。
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の符号
を変更可能。
• Cortex-Mの場合
特別なキーワードは不要。ベクタテーブルに対応する関数名を記述。
• Arm7,9,11,Cortex-R/A (Cortex-M以外) の場合
__irqキーワードを記述し、ベクタテーブルに対応する関数名を記述。
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側のリソース(ファイルや時間)な
どを利用するセミホスティングも利用可能。
CB-008: C言語の標準ライブラリについて
•
幾つかの標準関数は、ハードウェアに依存。
例えば、printfなどは最終的に出力をするハードウェア用にコード
が必要。これをローレベルインタフェースと呼ぶ。
CB-008にあるようにデバッグ時にはデバッガ用のローレベルインタフェースが実
装されている。
•
以下の関数を実装することで標準関数を利用できる。
必要となる関数はどの関数を利用するかによって異なる。
CB-009: C言語の標準ライブラリを使
うためには?
__close
__lseek
__open
__read
__write
__exit
time
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 デバッグ制御 トレース機能 *M3/M4/M7のみSerial Wire Debug
Serial Wire Viewer
Serial Wire Output
1,2,4本 から選択
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に対応していることが条件となる。
DA-003: デバッグに最小限必要なピン
数は?
• SWDを使用すると信号線が減るがクロック差やスピード差はある
か?
SWDやJTAGと比べて信号線が減るが、実際にはCPUとの通信以外の制御
部分が処理の大半を占めるため、デバッガの動作速度の低下を体感するこ
とはない。
• JTAGとSWDを比べて、できることできないことは?
• JTAGでできてSWDできないこと
JTAG本来の機能である端子のバウンダリスキャンテスト
• SWDでできてJTAGでできないこと
トレース機能であるSWVトレース
• その他SWDのメリット
デバッグ用の端子数の減少( 5線式 ⇒ 2線式 )
上記に伴うコネクタ実装面積の削減が可能
DA-004: SWDとJTAGのデバッグ差は
あるのか?
ハーフピッチ20ピンコネクタ:MIPI-20
標準対応(ケーブル付)
11pin, 13pinから5V供給可能
DA-005:デバッグインタフェース
コネクタ I-jet
ハーフピッチ10ピンコネクタ:MIPI-10(JTAG, SWD/SWV)
標準対応(ケーブル付)
ピン配置はハーフピッチ19ピンコネクタの1~10番と同じ
DA-005:デバッグインタフェース
コネクタ I-jet
標準ピッチ20ピン変換アダプタ:Arm-20(JTAG,SWD/SWV用)
アダプタ標準添付
DA-005:デバッグインタフェース
コネクタ I-jet
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フォーマットのファイ
ル自体は大きくなるが、実コードのサイズは変わらな
い。
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またはマクロで有効化する必要がある。
DB-001: SWV機能の使用条件
SWV機能はSWOピンを使用する
DB-002: SWV対応コネクタ
MIPI-10
DB-003: SWV機能使用時のプロジェ
クト設定
[設定] > [ドライバ]を[I-jet/JTAGjet]を選択
[I-jet/JTAGjet] > [JTAG/SWD]で
インタフェースに[SWD]を選択
※ [一般オプション] > ライブラリ設定
stdout/stderrがSWO経由になっていると
強制的にSWDが選択される
DB-004: SWV(SWO)トレース
■こんなときに・・・
• コードの流れをバックトレース したい • コード実行時のタイムスタンプ を見たい など *補足 SWVトレースは1秒間に数千サン プリング程度なので、実行コード全 てを追うことできない。使用方法
DB-004: SWV(SWO)トレース
1.SWOトレースウィンドウ設定
2. SWOトレース
DB-005: SWV(SWO)トレースでコー
ドカバレッジ
■こんなときに・・・
• 実装されているコードが想定通りに 実行されているか確認したい。 など *補足 • デフォルトで有効となっている 「コードカバレッジ」プラグインの 機能を使用 • サンプリングタイミングにより、抜 け落ちることがあるが、長時間ト レースすることで信頼性のあるデー タとなる。 赤色のひし形 モジュールや関数の0% が実行されたことを示す。 緑色のひし形 モジュールや関数の100% が実行されたことを示す。 赤と緑のひし形 モジュールや関数の一部が実行されたことを示す。 黄色のひし形 文が1つも実行されていないことを示す。使用方法
※SWVトレースが可能な状態で
DB-005: SWV(SWO)トレースでコー
ドカバレッジ
1.コードカバレッジを選択 4.[更新] 3.デバッグ実行DB-006: SWV(SWO)機能 データログ
■こんなときに・・・
• 特定の変数やアドレスへの読み 書きアクセスをロギングしたい • 上記アクセスの時間を知りたい など *補足 • 変数またはアドレスは4つまで 指定可能メニューから[I-jet/JTAGjet] > [データログ]
使用方法
• 基本:観測したい変数をデータブレークポイントに設定
• オプション:Read時のみ/Write時のみ観測したい場合は以下の設定
DB-006: SWV(SWO)機能 データログ
3.[表示] > [ブレークポイント] 1.グローバルや静的変数上で右クリック 2.’変数’のデータログブレークポイントを設定使用方法
DB-006: SWV(SWO)機能 データログ
1.データログ
データログ一覧
DB-006: SWV(SWO)機能 データログ
■こんなときに・・・
• データアクセスが何回あったか、 読み書きが何回あったか確認し たい など *補足 • 「すべてのアクセス」数が読み書 きアクセスの合計より大きい場合、 アクセスの属性情報が正確にとれ なかったサンプリングがあるメニューから[I-jet/JTAGjet] > [データログ一覧]
データログのタイムライン表示
DB-006: SWV(SWO)機能 データログ
■こんなときに・・・
• データの変わったタイミングを時間 軸上でみたい • 他の割り込みなどとの時間関係を見 たい などメニューより[I-jet/JTAG-jet] > [タイムライン]
タイムラインのデータログ領域を右クリックし[有効化]を選択
DB-007: 割込みログ
■こんなときに・・・
• プログラム実行中に発生した割 り込みや例外をロギングしたい • 割り込みハンドラ関数の処理で かかった時間を知りたい など ※ハンドラの実行時間が短い場合には“入る”と“抜ける”の対応が取れないことがある ※ SWOの制約を受けるため、すべての情報が取得できない場合があるメニューから[I-jet/JTAGjet] > [割込みログ]
DB-007: 割込みログ
1.割込みログ 2.右クリックして[有効化]
割込みログ一覧
DB-007: 割込みログ
■こんなときに・・・
• 各割込みの発生回数や発生頻度を確認したい などメニューから[I-jet/JTAGjet] > [割込みログ一覧]
タイムライン表示
DB-007: 割込みログ
■こんなときに・・・
• 割り込みの発生タイミングを時間 軸上で見たい • 割り込みハンドラの処理にかかっ た時間を時間軸上で見たい • その他のイベントとの関係を時間 軸上で見たい などITMイベント ログ
DB-008: ITMイベント
■こんなときに・・・
• コードの実行タイミングを正確に知り たい • 実行時の変数の値を見たい • マルチタスクの各タスク入り口出口に 仕掛けて、タスク状況を把握したい など *補足 • ソースコード上で Arm_itm.hをinclude ITM_EVENT8_WITH_PC(1,1) と記述 • チャンネルは1-4が使用可能 ※参考URL ITM_EVENT8(channel, value) ITM_EVENT16(channel, value) ITM_EVENT32(channel, value) ITM_EVENT8_WITH_PC(channel, value)使用できるAPI
ITMイベント 一覧
DB-008: ITMイベント
■こんなときに・・・
• 各チャンネルのITMイベント発生 回数や頻度を知りたい • 実行時間が適正な間隔になってい るか知りたい • ウォッチしている値が適正な値に なっているか知りたい などタイムライン
DB-008: ITMイベント
■こんなときに・・・
• ITMイベントの発生タイミングを 時間軸上で見たい • 各ITMイベント間の関係や割り込 みなどのと関係を時間軸上で見た い • イベント間をドラッグドップで、 経過時間を知りたい などタイムライン
DB-008: ITMイベント
1.Arm_itm.hをインクルード 2.マクロをコードに記述 4.イベントログ 5.右クリックして[有効化] 3.ビルド&ダウン ロードタイムライン
DB-008: ITMイベント
1.タイムライン
2.表示したい機能の上で右クリックして[有効化]
•
MCUの対応
•
ETM機能の実装はMCUベンダの選択による
•
Trace Dataピン(1-4本)はMCUベンダの選択による
•
トレース機能付きエミュレータ(ICE)を使用
•
I-jet Traceが対応
•
コネクタの対応
•
トレースピンの接続に対応したコネクタが必要
•
レジスタ設定によるトレースポートピンの有効化
•
MCUによってはトレースポートピンが多重化されて他の機能に割り
当てられていることがあるため、FWまたはマクロで有効化する必要
DC-001: トレース機能の使用条件
MIPI-20
DC-002: Cortex-M用ETMトレース
対応コネクタ
ETMトレース用クロック
DC-003a: ETMトレース使用時の
プロジェクト設定
[デバッガ] > [設定] >
[ドライバ] で [I-jet/JTAGjet]を選択
[I-jet / JTAGjet] > [トレース]
[パラレル(ETM)] を選択
DC-003a: ETMトレース使用時の
プロジェクト設定
設定項目の詳細は
[ヘルプ] > [C-SPYデバッグ
ガイド]
を参照
[I-jet/JTAGjet] > [ETMトレース設定]
ETM Trace Settingsで[設定を試す]をクリック
クロック周波数のトレースの値が設定される
[ETMトレース]
実行された命令を表示
[ETM関数トレース]
実行された関数を表示
DC-007: コードカバレッジ:アセンブ
ラ
1. トレース取得を開始したいコード上で右クリックし、
[ブレークポイントの切り替え(トレース開始)] を指定
2. トレースを停止したいコード上で
[ブレークポイントの切り替え(トレース停止)] を指定
※ブレークしたときにトレースデータがICEから読み出され画面に表示される
DC-008: ETMトレース用のブレークポ
イント設定
DC-009: ETMトレース タイムラインで
コールスタック表示
DD-001: デバッグウィンドウ:
ブレークポイント
■こんなときに・・・
• ブレークポイントの一覧が見たい • ブレークポイントを貼っている ソースコードに飛びたい • 一時的にブレークポイントを全て 無効にしてデバッグしたい。 • ブレークポイントを削除したい • ブレークポイントを編集したい などDD-002: デバッグウィンドウ:
逆アセンブリ
■こんなときに・・・
• アセンブラレベルでステップ実 行したい • 実行中のアドレスを見たい • ライブラリなど、ソースファイ ルのないプログラムをデバッグ したい • 最適化の影響を確認したい などDD-003: デバッグウィンドウ:
メモリ
■こんなときに・・・
• 現在のメモリの値を見たい • メモリをPC上の保存したい • メモリ上でデータを検索したい などDD-004: デバッグウィンドウ:
シンボルメモリ
■こんなときに・・・
• アドレス順に変数や関数の一覧 を見たい などDD-005: デバッグウィンドウ:
レジスタ
■こんなときに・・・
• 現在の各種レジスタの値が見たい • デバッグ用にレジスタの値を変え てみたい などDD-006: デバッグウィンドウ:
ウォッチ
■こんなときに・・・
• 特定の静的変数やグローバル変 数の値をモニタリングしたい • ローカル変数の値をスコープ内 でモニタリングしたい などDD-007: デバッグウィンドウ:
ローカル
■こんなときに・・・
• 関数内のローカル変数や引数を 自動的にモニタリングしたい などDD-008: デバッグウィンドウ:
静的変数
■こんなときに・・・
• プログラム内の静的変数やグ ローバル変数を自動的にモニタ リングしたい などDD-009: デバッグウィンドウ:
自動(オート)
■こんなときに・・・
• ステップ実行でデバッグをして いるときに近辺の変数や関数情 報を自動的にモニタリングした い などDD-010: デバッグウィンドウ:
ライブウォッチ
■こんなときに・・・
• 特定の静的変数やグローバル変数を、プログ ラム実行状態のまま定期的にモニタリングし たい など更新間隔は、[ツール] > [オプション]
[デバッガ] の [更新間隔] にて設定
DD-011: デバッグウィンドウ:
クイックウォッチ
■こんなときに・・・
• 変数を簡単な式で評価したい count> 100 など 真なら1 • 任意のタイミングでC-SPYマク ロを実行したい など *補足 • C-SPYマクロは非常に強力かつ柔 軟 [ヘルプ] > [C-SPYデバッグガイド] の [C-SPY マクロの使用] を参照DD-012: デバッグウィンドウ:
コールスタック
■こんなときに・・・
• 実行中の関数の呼び出し元を知りたい • 各関数の引数も見たい などDD-013: デバッグウィンドウ:
スタック
■こんなときに・・・
• 現在のスタック使用状況を見たい • 現在のスタック使用率を見たい • それまでの最大スタック使用量を 知りたい など *補足 • OSを搭載している場合、OS側で各 タスクのスタックを管理するので、 別途プラグインなどを活用してス タックを確認動的なスタック使用量の解析
• RTOS不使用の場合には、動的スタック使用量の解析が使用できる。
• 有効にするには、[ツール] > [オプション] > [スタック] > [グラフィカ
ルスタックの表示…]をオンにする。
DD-013: デバッグウィンドウ:
スタック
動的な解析の表示
DD-014: デバッグウィンドウ:
ターミナルI/O
■こんなときに・・・
• printfデバッグがしたい • デバッグ用にパラメータなどを scanfでIAR EmbeddedWorkbench for Armの画面上か ら入力したい など *補足 • <stdio.h>をinclude • コードサイズが大きくなってしま う場合は、 [プロジェクト] > [オプション] > [一般オプション] > [ライブラリオ プション] から調整可能 • printfはデフォルトだとターミナ ルIOに出力されるが、ユーザコー ドで実装することでUARTなどに
DD-015: デバッグウィンドウ:
イメージ
■こんなときに・・・
• 現在のイメージ(デバッグ情報)を 確認したい など *補足 • ブートローダプロジェクトなどで複 数バイナリをデバッグするとき以外 は出番なしDE-001: シミュレータの設定
C-SPYシミュレータで出来ることは以下の通り
1. 命令レベルのシミュレーション
2. メモリの構成、検証
3. 割込みシミュレーション
4. イミディエイトブレークポイントとC-SPYマクロシステムを使用した周辺
シミュレーション
デフォルトではCPUコア単体+メモリの状態でのシミュレーションが可能
周辺や割込みを使うシミュレーションは3または4に関してユーザ側で要準備
DE-002: シミュレータの出来る事
3. 割込みを
疑似発生
4. C-SPYマクロ
周辺の模擬
1. CPUコア
割込みシミュレーションの使用法
シミュレータ動作時に、 ①シミュレータ→②割込み設定
割込み設定画面で、
③割り込み設定を右クリック
④設定したい割り込みイベントを選択
割り込みが登録される、 ⑤初回の割込みを起こしたいサイクル、周期などを
設定し、あとは通常の手順でシミュレーションを実施。
DE-003: 割込みシミュレーション
② ③⑤必要な項目を設定
①CPUコア単体でのシミュレーション。
“C-SPYデバッガガイド”に「C-SPY シミュレータは、ターゲットプロ
セッサの機能をソフトウェアで完全にシミュレーションするため、
ハードウェアがすべて揃っていなくてもプログラムロジックをデバッ
グできます。」と記載があるように、シミュレータは実機がない場合
などに多く用いられており、実機がある場合には実機を用いてのソフ
ト開発が適している。
DE-004:シミュレーションによる再現性
[デバッガ] > [設定] > [指定位置まで実行]に__exitを指定する
DF-001:デバッグ開始と同時に
プログラムをスタート
DF-002:ソースコードデバッグが
出来ない?
•
[ローカル]ウィンドウには、ローカル変数、つまりアクティブ
な関数の自動変数と関数パラメータを表示することが可能
•
ただ、コンパイラの最適化により正しい値を表示できない場合や
不明となる場合がある
•
デバッグ時にローカル変数を見るためには最適化を無し、もしく
は、低に設定をする
DF-003:ローカル変数はデバッグ時に
観測できる?
•
C/C++開発ガイドの
“リンカ設定ファイル” を参照
•
IARシステムズの日本法人が作成した簡易ガイドは
以下のページからダウンロード可能
http://www.iar.com/jp/ilink-setting-guide/
•
IAR Embedded Workbench for Armでは、最適化の設定によっても
変わるが、明示的に参照されない変数や関数は削除されることが
ある。
•
絶対削除されたくない変数や関数には、リンカで必ず出力する
指定をする事ができる。
EA-002:リンカ設定で変数/関数を
必ず出力するには?
[リンカ] > [入力] > [シンボルをキープ]で
変数や関数名を登録。
IAR Embedded Workbench for Armのデフォルトの設定ではスタックサ
イズを以下のオプション画面で変更できる。
[リンカ] > [設定] > [編集]、[スタック/ヒープサイズ]
[リンカ] > [アドバンスド] > [スタックの使用量解析を有効にする]に
チェックを入れ、メイクを実行するとマップファイルに解析結果が出
力される
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
静的なスタック解析では以下の2つ方法で解析の補助情報を与えること
ができる
・ソースコード上に#pragmaで補助情報を与える
・制御ファイルで補助情報を与える
EA-005:静的なスタック解析の
補助情報を与える
ソースコード上に#pragmaで補助情報を与える
• #pragma calls
→ 関数が呼ばれることを明示的に指定
• #pragma call_graph_root
→ 解析のrootの指定
EA-005:静的なスタック解析の
補助情報を与える
void Fun1(), Fun2();
void Caller(void (*fp)(void))
{
#pragma calls = Fun1,
Fun2
(*fp)();
}
#pragma
call_graph_root="interrupt"
void My_Handler (void ) {
・・・
制御ファイルで補助情報を与える
EA-005:静的なスタック解析の
補助情報を与える
possible calls
main:
f1;
max recursion depth
recf: 10;
call graph root [ interrupt ]:
SysTick_Handler,Default_Handler;
section領域を定義する方法
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つずつ指定する方法
範囲で指定する方法
[リンカ] > [チェックサム]にて、[未使用コードメモリをフィルする]に
チェックを入れて、フィルパターンを設定し、対象領域の開始アドレ
スと終了アドレスを指定する。
EA-007: 未使用領域を特定のコードで
埋めたい
個別オプションにてコードセクションの定義が可能
EA-008: ファイルごとにコードセク
ションを定義したい
IAR Embedded Workbench for Armのリンカはコード効率などの点から、
適宜並び替えて配置するため記述した順番での配置とはならない。
順番を指定するための方法は以下の通り。
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フォルダ内に、マップ
ファイルが表示され、ダブルクリックすることでエディタ画面で見
ることができる
C言語の標準ライブラリのなかでprintf系、scanf系のライブラリは比較
的大きなコードサイズ。
そのためIAR Embedded Workbench for Armではオプションで使用する
ライブラリの大きさを指定することが出来る。詳しくは[C/C++ 開発ガ
イド]の、Printf フォーマッタの選択、Scanf フォーマッタの選択を参
照。
EA-011:ライブラリを組込むとコード
サイズが大きい?
FAQで参考となるドキュメントを提示
https://www.iar.com/jp/support/tech-notes/general/checksum-calculation-with-xlink/
EA-012:チェックサムの実装法が
わからない
LA-001: Armの命令セット
•Armの命令種類
命令セット ビット 特徴 Arm 32bit 32ビット命令セット*パフォーマンス高いがコード密度低い Thumb 16bit 16ビット命令のサブセット*コード密度高いがパフォーマンスやや低い Armv6-M Thumb16bit + 32bit 16ビット命令+Thumb2の32ビット命令を6個サポート。
Armv7-M Thumb2 16bit + 32bit 16ビット+32ビット混在の命令セット。 *パフォーマンスおよびコード密度高い •
Armファミリー毎の命令対応
名称 命令セット 特徴 Arm6 ArmArm7 Arm9 Arm11 Arm+Thumb 命令セットを使い分ける際にはCPUのモード切替が必要
Cortex-M0/M0+ Armv6-M Thumb CPUモードを変えることなく必要に応じて32bit命令を使用可能 CPUモードを変えることなく必要に応じて32bit命令を使用
プロジェクトのオプション画面
LA-002: IAR Embedded Workbench for
ArmでCPUコアの選択と命令の選択
コア/マイコン選択:
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 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 IAR DLIB ランライム ライブラリの コード ただし 上書き可能 参照 ジャンプ