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++ コンパイラ ] > [ プリプロセッサ ] で [ 追加インクルードディレクトリ ] に指定。
CA-006: インクルードパスを指定するには?
__ramfunc キーワードを関数の前に追加。
注意
• main 関数開始前には使用できない。
• 初期化処理で変数の初期化が終わるまではその関数を呼び出すこと ができない。
CB-001: RAM 上への関数配置
__ramfunc void foo(void);
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};
とする。もしくは、 で 型のサイズとすることも可能。
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 の符号 を変更可能。
CB-006: 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
D. デバッグ /ICE
DA-001: CoreSight テクノロジ機能・
接続まとめ
名称 接続
ICE
基本機能 特徴
ドキュメント内
PowerPoint プレゼンテーション
(ページ 41-54)