ホスト上で組み込みプロジェクトの単体テストを行うために、関数ポインターを使用して、実行時に関数の「実際の」実装とモックを変更できるようにしました。したがって、私の関数 '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に指示する方法があるかどうかです。