問題タブ [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.
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 が点滅することを期待していましたが、メイン関数内のトグル コマンドだけが効果を示しました。
書き込み関数が呼び出されないのはなぜですか? 私は何か見落としてますか?
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などの自作バージョンの関数が最終的にコンパイルされたプログラムで使用されていないようです。
c - スタティック ライブラリの Newlib スタブ
Eclipse を使用してベアメタル アプリケーションを開発しています。私は newlib にリンクしているので、_sbrk() の独自の実装を提供しました。この機能は通常、私のプロジェクトに含まれており、すべてうまく機能していました。
ここで、この関数を、過去数か月にわたって開発した静的ライブラリに移動しようとしています。
リンク中にundefined reference to _sbrk
エラーが発生します。ファイルが配置されているパスは、Eclipse 設定に正しく含まれています (同じディレクトリ内の他のファイルは正しくリンクされています)。
明らかに、リンカーがコードを通過する順序に問題があり、この関数は破棄されます。
使ってみ__attribute__((used))
ましたが、運が悪かったです。
Eclipse の設定を使用して、この問題を解決するにはどうすればよいですか? (Makefile ベースまたはコマンド ライン コンパイルは、私が必要とするソリューションではありません)。
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の最新バージョンを使用しています。以下は、テストプログラムをコンパイルするために使用したフラグです。
c - iprintf を呼び出すとイメージが失敗する
Cortex-M3 (SmartFusion2 内) 用の小さなベア メタル テスト プログラムを作成しています。GCC ARM Embedded ツールチェーン (5-2016-q1-update) を使用しています。関数で最初に行うことは、main
デバッグ出力用に UART を初期化することです。次に、いくつかの文字を UART に直接出力して、起動を示します。この UART は、 の newlib syscalls 内でも使用されます_write_r
。main
私の関数呼び出しの次の行printf
。これを への呼び出しのままにしておくとprintf
、引数がないため、コンパイラはputs
(-O0 を指定していても) への呼び出しに最適化します。これは正しく動作します。私が電話をかけるとiprintf
コンパイラはそれを最適化しません。以前の UART への直接呼び出しからでも、出力がまったく表示されません。これは、起動時に何か問題が発生していることを示唆していますが、何が原因かわかりません。
要約すれば:
は正しく動作し、通話が になっnm
たことを教えてくれます。期待どおりに 2 行の出力が表示されます。printf
puts
ただし、次のコードでは出力がまったく表示されません。
これのデバッグを開始する場所についての手がかりをいただければ幸いです。