【関数の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 関数を使わないことを指定
コンパイルエラーメッセージが出ない