11

printf()標準 C ライブラリに Newlib を使用する ARM GCC ツールチェーン環境で、STM32F411RET マイクロコントローラの関数を再ターゲットしようとしています。

をリターゲットする方法を検索するとprintf()、多くの人が実装する必要があると言い_write()ます_write_r()。そして、それは両方とも機能しているようです。

しかし、私はまだそれらについて質問があります:

  1. Newlibのドキュメントを見ると、出力ファイルに実装できると書かれwrite()ていますが、機能していないようです。実装できるように見えます_write()が、この機能はドキュメントには記載されていません。どうしたのwrite()?アンダースコアは何か違うのですか?

  2. _write_r()よりも好ましい状況は_wirte()どれですか?C の再入力の概念がわかりません。例はありますか?

これを読んでくれてありがとう。

4

1 に答える 1

4

最初の質問については、Newlib が名前の前にアンダースコアを追加することで、名前の衝突(「名前空間のクリーン バージョン」) を回避したいためです。C コンパイラが外部名の前にアンダースコアを追加するのはなぜですか?も参照してください。

2 番目の質問については、C の再入可能性と再入可能性を参照してください。. ボード上で実行されているマルチスレッド プログラムがあり、複数のスレッドが newlib 関数を呼び出すことができる場合、syscall の再入可能バージョンを使用する必要があります。割り込みハンドラが newlib 関数を呼び出すことができる場合は、再入可能なシステムコールも使用する必要があります。ただし、シングルスレッド アプリケーションで再入可能システムコールを使用してもまったく問題ありません。

たとえば、マルチスレッド アプリケーションで再入不可の syscall を使用する場合、グローバル errno フラグは 1 つだけです。2 つ以上のスレッドでエラーが発生した場合、グローバル errno 値が上書きされる可能性があります。再入可能な syscall では、各スレッドに独自の errno フラグがあります ( _reent-struct内-実装については、こちらを参照してください)。したがって、各スレッドは独自のエラーをチェックして処理できます。

注: 使用するシステムコール モデルを選択するには、newlib を再コンパイルする必要があります。http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html#sec_configure_hostを参照してください。

于 2015-08-24T06:37:41.913 に答える