問題タブ [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.
c - arm (ベア メタル): バイナリ ファイルを関数として呼び出す
AT91sam9 ARM コントローラ用の AT91Bootloader があります。ハードウェアの初期化を追加する必要がありますが、コンパイルしたのは .bin ファイルだけです。binファイルをメモリにロードして、それを呼び出そうとしました:
でも、結果が出ません。アセンブラはできるだけ使わないようにしてください。以前にアセンブラを紹介されたことがありますが、ARM アセンブラは複雑で理解できません。ブートローダの途中から呼び出して、bin ファイルを実行し (たとえば、0x00005000 などのメモリ セクタにある)、ブートローダに戻って独自のコードを実行し続けるにはどうすればよいですか?
gdb - ソフトウェア割り込み例外からコールスタックを取得する方法
を使用して、ベアメタルARMプラットフォームで実行されているプログラムをデバッグしようとしていますgdb
。ある時点で、SWI
(ソフトウェア割り込み)例外が生成されます。ただし、バックトレースには、次のように例外が生成されたものは表示されません。
(gdb)c
ARMで実行されているプログラムはでコンパイルされましたがarm-none-linux-gnueabi-gcc -O2 -c -ggdb
、私も-O0
同じ結果で使用してみました。
どうすれば意味のあるコールスタックを取得できますか?この例外を生成しているものを見つける別の方法はありますか?
gdb - ソフトウェア割り込み例外または未定義命令例外?
JTAG コネクタと gdb を使用してベアメタル ARM (v5TE 準拠) でプログラムを実行しています。プログラムはスーパーバイザー モードで一部の SDRAM から実行され、アーム命令のみを使用します。
ある時点で例外が発生します。ctrl+CI で gdb を停止すると、CPSR が未定義の例外モードを示していることを確認できますが、プログラム カウンターはソフトウェア割り込み例外を示しています ( 0xffff0008
)。ARM ARM によると、未定義命令例外が発生した場合、 はまたはであるPC_und
必要があります。SWI が発生したか、または未定義の命令例外が発生しましたか?0xffff0004
0x00000004
私の質問をより明確にするために編集してください:
私のプログラムの目的は、カスタム ボードのハードウェアをテストすることです。ハードウェアに問題がある場合、RAM 内のプログラムが破損している可能性があり (以下に示すように)、例外が生成される原因となります。ハードウェアが正常な場合、テスト ソフトウェアは問題なく動作します。RAM アドレスの範囲は 0 から 0x40000000 で、プログラムは 0x1000 から 0x2000 の間にロードされます。スーパーバイザ モードのスタック ポインタは 0xff0 に設定されます。中断ベクトルは、ブレークポイントのみで構成されます。
未定義の例外モードから登録します。
スーパーバイザー モードからの登録:
スーパーバイザ リンク レジスタが指すアドレス周辺の RAM 内の (破損した) プログラムを次に示します。
プログラム オブジェクト ファイルからのダンプ:
boot - タイプ 1 ハイパーバイザーのブート シーケンス
タイプ 1 の仮想化を使用した非常に基本的なクエリがあります。私は本当にブートプロセスを理解しようとしています。
タイプ 1 ハイパーバイザーは、基本的にベア メタル レベルで実行され、ハードウェアと直接通信します。
私の質問は、システムが起動してブートストラップ コードが読み込まれるときに、次に読み込まれるコンポーネントがハイパーバイザーであるか、初期化自体に最初に管理オペレーティング システムが必要かということです。
タイプ 1 ハイパーバイザーを参照して、ブート シーケンスを親切に説明してくれる人はいますか?
ハイパーバイザー コンポーネントを直接参照するブートストラップ コードのようなものであるべきだと思いました。ハイパーバイザー コンポーネントは、他の仮想 VM インスタンスのカーネルのロードを担当します。
assembly - アセンブリでの再配置
アセンブリで記述されたベアメタル ARM の起動コードがあり、それがどのように機能するかを理解しようとしています。バイナリは外部フラッシュに書き込まれ、起動時にその一部を RAM にコピーしています。このウィキペディアのエントリを読んでも、このコンテキストでの移転の概念はまだ正確にはわかりませんでした。RAM は低アドレス ウィンドウにマップされ、フラッシュは高アドレス ウィンドウにマップされます。ここでリンク レジスタの値をテストする理由を誰か説明してもらえますか?
ld - リンカスクリプトのセクションロードアドレスと実行アドレス
ベアメタル ARM アプリケーション用にカスタマイズされたリンカー スクリプトを作成しています。アプリケーションはフラッシュ メモリに保存されます。現時点では、アプリケーション全体を SDRAM にコピーする起動コードがあり、高速化のために SDRAM で実行を続けています。このスクリプトを変更して、コード全体をフラッシュから直接実行したいのですが、特定の要素を理解するのに問題があります。
以下のリンカ スクリプトでは、.ram_data
セクションに実行アドレスRAM
とロード アドレスがありますROM
(どちらのセクションも SDRAM にあります)。私が理解していることから、リンカーは実行アドレスを使用して、PC 相対ではないすべての要素のシンボル解決を行いますが、ロードアドレスはどうですか? ベアメタル ARM のコンテキストでは、プログラム ローダーのようなものは存在せず、リンカがフラッシュ内のプログラムを書き込む場所に影響を与えることはできません。では、リンカは実際には何に使用されるのでしょうか?
同様に、リンカは実行時に SDRAM が (rx) または (rw) であることにどのように影響を与えることができますか? メモリ領域でこれらのオプションを変更すると、実際に何かが変更されますか?
arm - ARM 開発のクイックスタート
ARMプラットフォームでの開発に挑戦したい、特にベアメタルに興味があります。私は QEMU を使用してそれを開始しようとしていますが、この学習方法には包括的なチュートリアルがなく、必然的に別のレベルの複雑さが追加されます。次の要件を満たす適切な ARM 開発プラットフォームを提案してください (重要度の降順でソート)。
- 優れたステップバイステップのチュートリアルが付属しています。
- 基本的な入出力を提供します。いくつかの点滅を見て、いくつかのボタンを押すことができるようにしたい. さらに、数字ディスプレイ (電卓のようなもの) や液晶ディスプレイさえあれば素晴らしいでしょう。
- 少なくともいくつかのデバッグ機能を提供します。
- モダン。
assembly - 分岐なしでデジタルロジック機能を実現するシステムはありますか?
電気工学でこれを尋ねるつもりでしたが、プログラミングに関連していると判断しました。
デジタル ロジックでは、カルノー図またはブール代数を使用して、真理値表を最小化された関数に減らすことができます。CPU上では、これらの関数はもちろん条件文を使って表現できますが、可能な場合は常に、ビット操作のみを使用して、分岐なしでそれらを実現する標準的なアプローチがあるかどうかに興味があります。
これが今日できることが興味深いことなのか、それとも今日のプロセッサで実際により効率的であるのかはわかりません。それでも、それは過去に関連していた可能性があり、とにかく知ることは興味深いでしょう.
だから、私が持っているとしましょうf = !a*b + !b*!c
、または同様の関数:追加のレジスタを使用して、合計ビットを計算し、マスキングすることによって、分岐を回避する「スマートな」方法があるかどうかを見つけるためのシステム(カルノーのような)はありますか? それとも、見える場合は見えるもので、そうでない場合は見えないものですか?
gcc - Newlib の代替?
私は IA-32 タイプのプロセッサを扱う組み込みソフトウェア エンジニアです。コンパイラ ツール チェーンを探しています。無料が望ましいです。
以前は Mentor Graphics CodeBench Lite を使用していましたが、現在は使用できません。
他の GCC ディストリビューションも調べましたが、glibc のベアメタル実装はありません。newlib 以外はありませんが、GPL と LGPL のライセンスの問題により使用できません。私たちは OEM であり、顧客 (および私たち) は独自のコードを持っています。
どんな提案でも大歓迎です。
c - シミュレーターでのランタイム関数呼び出しでの ARM ハード フォールト
ベアメタル(OSなし)ARM Cortex M3のサードパーティソースからいくつかのプロジェクトをビルドして実行しようとしています。
newlib で arm-none-eabi-gcc(success) でビルドします。
TI Code Composer Studio のシミュレーターで実行します。
問題:
実行すると、ランタイム ライブラリ関数の最初の呼び出しでハード フォールト (対応する ISR に入る) に失敗します。
今まで、memmove または memcpy の呼び出しで失敗していました。逆アセンブリをトレースすると、命令で正確に失敗することがわかります
BLXメムセット
質問: 障害の原因とそのデバッグ方法 ???