問題タブ [newlib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1245 参照

c - STM32 CubeMX/GNU/Eclipse-Toolchain のリターゲット (newlib および libgloss)

Eclipse CDT 4.5.1 (Mars)、ARM GCC 4.9 2015q3、Liviu Ionescu による GnuArmEclipse-Plugin、OpenOCD 0.9.0、および STM32CubeMX 4.11.0 を使用して、STM32F401C Discovery Board 用の Windows ベースのツールチェーンをセットアップしました。

基本的に、STM32CubeMX を使用して SW4STM32 プロジェクトを生成し、すべてを新しい Cross ARM GCC Eclipse C プロジェクトにインポートし、いくつかのパラメーター (シンボル、CPU タイプ、FPU、リンク ファイル) を調整しました。シンプルな LED 点滅の例が正常にビルドされ、OpenOCD で実行できます。ブレークポイントも機能します。

newlib または newlib nano で必要なシステム コール (たとえば、_sbrkおよび) を提供するために、リンカー オプション_writeを使用して開始しました。--specs=nosys.specsこのようにして、動的メモリ割り当ては問題なく機能します。_writeただし、ディスプレイに印刷したり、UART 経由でデータを送信したりするために、関数を自分で実装したいと考えています。

libgloss では、_write関数に弱いシンボルがあるため、再実装するだけで十分です。私はこれを私のmain.cで行いました:

LED が点滅することを期待していましたが、メイン関数内のトグル コマンドだけが効果を示しました。

書き込み関数が呼び出されないのはなぜですか? 私は何か見落としてますか?

0 投票する
1 に答える
1189 参照

c - retarget.o がスタティック ライブラリにアーカイブされている場合、retarget.c の "_write" などの関数がリンクされないのはなぜですか?

デバッグ用に printf 出力をシリアル ポートに再ターゲットするために retarget.c を実装します。リンク コマンドが次のようになっている場合は、リンクして非常にうまく機能します。

arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs -g -mcpu=cortex-m4 -mthumb -fmessage-length=0 -std=c99 -fno-builtin -Wl,--gc-sections -Wl,-Map=main.map -T"$(LINKERFILE)" -o main.elf main.o retarget.o $(BUILDDIR)/libs.a -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group

しかしretarget.o、アーカイブファイル$(BUILDDIR)/libs.aにアーカイブすると、リンクコマンドは次のようになります。

arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs -g -mcpu=cortex-m4 -mthumb -fmessage-length=0 -std=c99 -fno-builtin -Wl,--gc-sections -Wl,-Map=main.map -T"$(LINKERFILE)" -o main.elf main.o $(BUILDDIR)/libs.a -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group

_write正常にリンクできたのですが、関数 printf がシリアルポートに何も出力せず、 retarget.cなどの自作バージョンの関数が最終的にコンパイルされたプログラムで使用されていないようです。

0 投票する
2 に答える
936 参照

c - スタティック ライブラリの Newlib スタブ

Eclipse を使用してベアメタル アプリケーションを開発しています。私は newlib にリンクしているので、_sbrk() の独自の実装を提供しました。この機能は通常、私のプロジェクトに含まれており、すべてうまく機能していました。

ここで、この関数を、過去数か月にわたって開発した静的ライブラリに移動しようとしています。

リンク中にundefined reference to _sbrkエラーが発生します。ファイルが配置されているパスは、Eclipse 設定に正しく含まれています (同じディレクトリ内の他のファイルは正しくリンクされています)。

明らかに、リンカーがコードを通過する順序に問題があり、この関数は破棄されます。

使ってみ__attribute__((used))ましたが、運が悪かったです。

Eclipse の設定を使用して、この問題を解決するにはどうすればよいですか? (Makefile ベースまたはコマンド ライン コンパイルは、私が必要とするソリューションではありません)。

0 投票する
1 に答える
155 参照

c - newlib に静的にリンクされたプログラムを xv6 で実行できませんでした

xv6 で newlib にリンクされたプログラムを実行しているときに、いくつかの問題が発生しました。(これは私が使用した newlib ポートです)

このツールチェーンを使用して newlib をコンパイルしました。コンパイルに問題はなく、libc.a、libm.a、およびその他のライブラリ ファイルを取得できます。

次に、Hello World プログラムを作成し、newlib に対して静的にリンクしました。プログラムは単純に次のようになります。

しかし、生成された実行可能ファイルは xv6 ファイルシステムには大きすぎるため (これは設計上の制限です)、削除しました。ストリップ後のファイル サイズは 53k であるため、fs に入れても問題ありません。

「make qemu」を実行すると、システムに入ることができ、他のプログラムは正常に動作しました。しかし、テスト プログラムを実行すると、数秒間スタックし、「panic: loaduvm: addr must be pagealigned」と表示されます。プログラムを削除したためか、xv6 ソース コードに適用しなければならないパッチや変更があるためか、またはその他の理由によるものですか?

PS私は公式のGithubリポジトリからxv6の最新バージョンを使用しています。以下は、テストプログラムをコンパイルするために使用したフラグです。

0 投票する
0 に答える
148 参照

c - iprintf を呼び出すとイメージが失敗する

Cortex-M3 (SmartFusion2 内) 用の小さなベア メタル テスト プログラムを作成しています。GCC ARM Embedded ツールチェーン (5-2016-q1-update) を使用しています。関数で最初に行うことは、mainデバッグ出力用に UART を初期化することです。次に、いくつかの文字を UART に直接出力して、起動を示します。この UART は、 の newlib syscalls 内でも使用されます_write_rmain私の関数呼び出しの次の行printf。これを への呼び出しのままにしておくとprintf、引数がないため、コンパイラはputs(-O0 を指定していても) への呼び出しに最適化します。これは正しく動作します。私が電話をかけるとiprintfコンパイラはそれを最適化しません。以前の UART への直接呼び出しからでも、出力がまったく表示されません。これは、起動時に何か問題が発生していることを示唆していますが、何が原因かわかりません。

要約すれば:

は正しく動作し、通話が になっnmたことを教えてくれます。期待どおりに 2 行の出力が表示されます。printfputs

ただし、次のコードでは出力がまったく表示されません。

これのデバッグを開始する場所についての手がかりをいただければ幸いです。