2011-02-09 16 views
2

私はAVR MCU用のスタティックライブラリを作成しています。私はavr-gccとAVR Libcを使用しています。ライブラリ関数の中には、SPIを使用してデバイスと通信するものがあります。ただし、SPI通信はすべてのAVR MCUで同じ方法で行われるわけではありません(すべてのAVR MCUで同じレジスタが使用されているわけではありません)。それはビッグバンギングによってさえできます。したがって、私はユーザーにSPIルーチンを提供することを望んでいます。ユーザが自分のライブラリ内で独自の機能を提供できるようにするにはどうすればよいですか?

どうすればいいですか?すべてのライブラリ関数が追加の引数としてコールバック関数を受け取るべきですか? SPIハンドラとして機能するライブラリ内のグローバル変数を持つべきですか?私は関数を外部にする必要があります(externを使用)?

はシンプルで簡単な解決策は、単に適切な名前のextern関数を宣言することで、

+0

コンパイル時に選択する必要がありますか(たとえば、特定のSPIライブラリにリンクできますか)、実行時にリンクされているライブラリの中から選択する必要がありますか? – payne

+0

コンパイル時。 – eepp

答えて

4

、ありがとうございました。これにより、既存のextern関数を使わずにライブラリをコンパイルすることができます。しかし、あなたやあなたのユーザーは、適切な機能を提供せずに完全な実行可能ファイルをリンクすることはできません。

私はこのアプローチを自分で使い、それを推薦しました。不要な複雑さを避け、すべてのCプログラミング環境にとって絶対不可欠なものは使用しません。また、明示的なエラーは実行時ではなくビルド時にフラグが立てられます(未定義コールバック関数が呼び出されるとランタイムクラッシュは発生しません)。

+0

独自のSPIハンドラを含める必要があることは、ドキュメントに明記されていることを確認してください。 –

+0

そのような関数(つまり、ユーザが提供する関数がなくても使用されるべきである)のための "デフォルト"の実装を提供することが理にかなっているならば、あなたのライブラリにデフォルトの実装を提供することによって 'avr- '__attribute __((weak))'でシンボルを宣言します。これにより、ライブラリユーザーが必要な機能を1つだけ実装するような問題は隠されますが、コンパイル時およびリンク時には別の機能は実装されません。これはあなたの特定のSPIの問題(*ユーザーが機能を提供すること)には役に立たないかもしれませんが、他のものには良いかもしれません(*ユーザーが機能を提供できるようにする)。 – ndim

関連する問題