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
-
http://supp.iar.com/Support/?Note=84583
Techl note 84583: 英文サイト