7

ホスト上で組み込みプロジェクトの単体テストを行うために、関数ポインターを使用して、実行時に関数の「実際の」実装とモックを変更できるようにしました。したがって、私の関数 'foo' は .c ファイルでは次のようになります。

// the 'real' implementation of the function to be used during runtime
void fooImplementation ( )
{
    /* ... */
}
// the function pointer, initialized to the 'real' implementation
void (*foo) ( ) = fooImplementation;

関数ポインターが、コードではなくデータのみを運ぶことが許可されている内部 L1 データ メモリに存在するため、ターゲット プロセッサ (Blackfin) が例外を生成することが判明しました。

機能する解決策は、各関数ポインターに属性を割り当てて、L1 データ メモリに存在しない別のセクションに配置することです。次に例を示します。

void (*foo) ( ) __attribute__ (( section(".ext_mem"))) = fooImplementation;

ただし、これによりコードが少し読みにくくなり、エラーが発生しやすくなります (属性の割り当てを忘れた場合、単体テストは正常に実行されますが、関数がターゲットで呼び出されるとすぐにコードによって例外が生成されます)。

だから私の質問は、デフォルトですべての関数ポインタを別のセクションに置くようにgccに指示する方法があるかどうかです。

4

1 に答える 1

2

gcc には、デフォルトですべての関数ポインタを特定のセクションに特別に配置するオプションはありません。もちろん、コンパイラとリンカーのルールを書き直さない限り。

__attribute__質問で述べたように、キーワードを使用する必要があります。コードが複雑に見える場合は、その周りにマクロを作成できます。

#define SPECIAL_FOO(x) void (*x) ( ) __attribute__ (( section(".ext_mem"))) 

そして、次のように使用します。

SPECIAL_FOO(foo) = fooImplementation;

ただし、別の方法もあります。この SO スレッドを参照して、タスクを達成するためのカスタム リンカー スクリプトの作成について詳しく理解することができます:特定のコンパイラによって生成された変数を特定の ELF セクションに強制する (gcc を使用)

于 2014-07-31T11:43:03.503 に答える