関数とAttribute


【関数のAttribute】

 関数にもアトリビュートによる多くの修飾機能が用意されています。
これらにより、記述を簡単にしたり、メモリへの配置を指定することができます。
 アトリビュートの一覧を下表に示します。アトリビュート名、アトリビュート内の
変数についてはアンダーバー付き(例えば、shadowの代わりに__shadow__)でも
記述できます。アンダーバーを付けると予約語と重なる心配がなくなります。

 関数には引数と戻り値を持つものがあります。これらはデータと同じ扱いで
型宣言が必要です。使える型もデータの型と同じです。引数や戻り値を持たない
場合には、voidという型宣言を使います。

アトリビュート修飾 機能 と 書式
address(addr) 関数の開始番地を絶対番地で指定する
void foo(void) __attribute__((address(0x100))){
  ・・・・・
}
alias("target") 指定した関数に別名を定義する
void foo(void) __attribute__((alias("bar"))) {
  ・・・・
}
auto_psv または
no_auto_psv
割り込み処理関数の定義の際に使用し、割り込み処理の始めに
PSVPAGレジスタ設定文を挿入する(auto_psv)
または挿入しない(no_auto_psv)を指定する
boot 関数をbootセグメントに配置する
void __attribute__((boot)) func();
    //func()関数をbootセグメントに配置
far 関数の配置を自由にしてよいことを指定
near 関数をニア領域に配置することを指定
interrupt 割り込み処理関数の指定(別ページで詳細に解説)
section("section_name") 関数を指定したセクションに配置する
extern void foobar(void) __attribute__((section(".libtext")));
   // 関数foobarを.libtextセクションに置く
   section修飾はaddress修飾と一緒には使えない
secure 関数を保護セグメントに配置する
  void __attribute__((secure)) func();
shadow 割り込み処理で使われ、レジスタ保存をスタックではなく
シャドーレジスタを使うよう指定
  void __attribute__((interrupt, shadow)) _T1Interrupt(void);
unused 関数を使わないことを指定
コンパイルエラーメッセージが出ない




   目次ページへ