問題タブ [bare-metal]

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 投票する
2 に答える
2987 参照

gcc - Newlib の代替?

私は IA-32 タイプのプロセッサを扱う組み込みソフトウェア エンジニアです。コンパイラ ツール チェーンを探しています。無料が望ましいです。

以前は Mentor Graphics CodeBench Lite を使用していましたが、現在は使用できません。

他の GCC ディストリビューションも調べましたが、glibc のベアメタル実装はありません。newlib 以外はありませんが、GPL と LGPL のライセンスの問題により使用できません。私たちは OEM であり、顧客 (および私たち) は独自のコードを持っています。

どんな提案でも大歓迎です。

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

c - シミュレーターでのランタイム関数呼び出しでの ARM ハード フォールト

ベアメタル(OSなし)ARM Cortex M3のサードパーティソースからいくつかのプロジェクトをビルドして実行しようとしています。

newlib で arm-none-eabi-gcc(success) でビルドします。

TI Code Composer Studio のシミュレーターで実行します。

問題:

実行すると、ランタイム ライブラリ関数の最初の呼び出しでハード フォールト (対応する ISR に入る) に失敗します。

今まで、memmove または memcpy の呼び出しで失敗していました。逆アセンブリをトレースすると、命令で正確に失敗することがわかります

BLXメムセット

質問: 障害の原因とそのデバッグ方法 ???

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

arm - 腕皮質 m4 でスリープ モードに入る

Cortex m4 プロセッサを 1 秒弱スリープさせようとしています。スリープ状態にしてから 1 秒後に、またはボタンが押されたときに、中断したところから再開できるようにしたいと考えています。リファレンス マニュアルを調べたところ、VLPS モードが私のニーズに合っているようです。そのモードへの入り方や のプログラム方法がわかりませんNVIC

詳細情報: ベア メタルの C でこれを行っています。

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

embedded - ベアメタル用の pthread を使用するクロス コンパイル プログラム

わかりました、これは非常に一般的な質問かもしれませんが、私はトピックに精通していないので、ヒントをいただければ幸いです.

ARM 用の SoucereyCodeBench からのクロス コンパイル ツール チェーンがあります (arm-xilinx-linux-gnueabi-)。コンパイラ オプションを使用するライブラリをクロス コンパイルしました。-DSC_INCLUDE_FX -DSC_USE_PTHREADS -pthreads -fPIC -DPIC

したがって、ベア メタル プログラム用のライブラリを使用する場合は、ベア メタル コンパイラ (arm-xilinx-eabi-) 用の pthreads が必要になると思います。

そうしないと、そもそも私のプログラムが実行またはコンパイルされない可能性があります。では、ベア メタル用に pthread をコンパイルすることはできますか?

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

embedded - ベアメタル ARM アプリを起動する際の問題

LLVM を使用して、ベアメタル ARM Cortex M4 開発用のコードを生成しようとしています。IR の作成は順調に進んでおり、LLVM は (私の意見では) 正しい ARM Thumb ASM を生成しています。

テストを行うために Arm 開発キットを購入しました: Atmel SAM4L-EK http://www.atmel.com/tools/SAM4L-EK.aspx

開発ボードの黄色の LED を点灯させるアプリケーションを作成しました。(ボードから何かを取得したいだけです) Atmel Studio で付属のアプリを実行したところ、LED は正常に動作しました。しかし、私のアプリケーションは何もしないようです...

マニュアルによると、LED は PC10 に接続されています。ATSAM4LC4C MCU のデータシートでは、GPIO ポートのアドレスは 0x400E1000 であり、1 つのポートが 0x0200 バイトのアドレス空間を必要とするため、ポート C は 0x400E1000 + 0x0400 にあると記載されています。

これは私が持っているプログラム出力です(LLVM出力):

このコードは、GPIOEnableRegister のビット 10 を 1 に設定します。

次に、OutputDriverEnableRegister のビット 10 を 1 にします。

次に、OutputValueRegister のビット 10 を 1 にします。

その時点で、LEDが点灯するはずです...

これは私が使用した起動コードです:

両方のアセンブラー ファイルは、次のようにオブジェクト ファイルにコンパイルされました。

GNU ARM アセンブラの使用

これは私が使用したリンカースクリプトです:

次に、オブジェクト ファイルは次のように ELF バイナリにリンクされました。

GNU Arm リンカの使用

次に、Atmel Studio を使用して ELF バイナリをボードにアップロードしました。

ボットは何も起こりません (リセット後も)

どんな洞察も大歓迎です!

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

memory - MMU を使用した ARM ベアメタル: 連続した読み取りで異なる値が生成される

コンテキスト (おそらく不要):

学習課題として、Raspberry Pi 用のミニ「OS」を実装しようとしています。

私は現在、非常に馬鹿げたメモリ管理システムを実装しています。既に MMU を有効にしており、使用可能な kmalloc を取得中です。

コードとデータ セグメントの後にマップされた既存の小さなカーネル ヒープから、既にメモリのチャンクを割り当てることができます。より多くのページをマッピングすることで、必要に応じて成長させようとしています。また、物理的に連続したチャンクを生成できる必要があります。

コードはGithubでホストされています。この質問専用のブランチとデバッグ コードがあります。これは、よく整理された、よくコメントされた、または非常に賢いコードの例ではないことに注意してください。:)

実際の質問:

データ アボートをデバッグしようとしているときに、非常に奇妙なことがわかりました。

これは私の kmalloc からのコードの一部です:

私はそれを3回実行します。結果は次のとおりです。

1 回目と 3 回目の反復は正常に見えます (ただし、next_free の値は 0 であるはずですが、0xffffffff であるため、データの中止が発生します)。しかし、私のコードは 2 番目に何をしているのでしょうか? O_o 連続して 4 回読み取られたときに、printf が chunk->next_free に対して 2 つの異なる値を出力するようにするには、どのような黒い魔術が必要ですか? O_o

データは適切に整列されており、ページはキャッシュ可能かつバッファリング不可 (キャッシュ不可にしても意味がありません) であり、コンパイラーの最適化がオンでもオフでも同じ結果が得られます。そこにデータメモリバリアを投げてみましたが、実際には何もしません。作成したアセンブリも確認しましたが、問題ないようです。

TLBの破損が原因である可能性があると思いました。新しいページをマッピングするたびに、「統一された単一のエントリを無効にする」(mcr p15, 0, %[addr], c8, c7, 1) を発行しています。それは十分ですか?

qemu でデバッグを試みましたが、使用済み物理ページのビットマップを設定するとデータが異常終了しますが、この部分は Pi では問題なく動作します。

この動作の原因についての手がかりを探しているだけです。より多くのコンテキストが必要な場合は、質問してください。ただし、私のコードは今のところ急速に変化し、多くの printf が乱雑になっています。


ETA: 最初の 2 つの printf の -O0 を使用した逆アセンブリ:

そのため、 のアドレスをchunkr3 に入れ、 a を実行してldrを取得しますnext_free。2 番目の prinf の前にもう一度実行します。コアは 1 つしかなく、DMA は実行されていないため、呼び出し間でメモリ内の値が変更されることはありません。

-O2 の場合:

そのため、引き続き で値をフェッチしますldr。そのため、両方の最適化レベルで同じ結果が得られます。


新しい編集: printfs をさらに追加しましたが、この時点で特異点が発生しているようです:

この行の後、chunk->next_free はハイゼンベルクの猫に変わります。以前は、0 として読み取られます。

構造は次のように定義されます。

chunknext重ならないでください。

「特異点線」を の下に移動すると、next->next_free = chunk->next_free2 つの値が交互に表示されなくなりますが、それでも奇妙*prev_list = nextです。しかし、next->next_free はまだ 0 に設定されています。