カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810554
FAQカテゴリ(大) コンパイラ
最終更新日 2013-12-30

質問内容

TN84583: EWAVR v 6.10 以降でのデータポインタとコードポインタ

回答内容

対象となるEW: AVR

問題
IAR Embedded Workbench AVR v 6.10 で下記のコードを書くと、

void fun (void)
{
 ;
}
void *p = (void*)fun;
int main( void )
{
 return 0;
}

以下のエラーになる。
Error[Pe029]: expression must have a constant value ...\main.c

背景
void * は DATAポインタなので、エラーになる。
このポインタの型は CODEメモリの中を指す関数へのポインタと大きく異なります。データポインタがコードポインタより小さいためエラーになります。-mt オプションを使用すると、デフォルトのポインタは 8ビット、-msを使用すると 16ビットになります。

解決策
• EWAVR 6.x のコンパイラはこれらの問題を検出するように改良されました。正しくサンプルコードを書き直すには、

void fun (void)
{
    ;
}
typedef void (*f_p)(void);
f_p p = fun;


• 問題を避けるため、コンパイラオプション -v3 -ms か -v6 -mh を使用して、同じサイズのデータポインタとコードポインタを得ることができます。

• xmega デバイス、例えば -v5 デバイスである ATxmega128D4 を使用する場合 -v5 -ms オプションを使用することができますが、その関数は キーワード __nearfunc を使用してnear 領域に配置する必要があります。

__nearfunc void fun (void)
{
    ;
}
void *p = (void*)fun;

or use the pragma type_attribute:

#pragma type_attribute=__nearfunc

void fun (void)
{
   ;
}

void *p = (void*)fun;

 


全ての製品の名前は、それぞれの所有者の商標または登録商標です。

参考資料URL