問題タブ [arm7]
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.
gcc - UART に出力しようとすると ARM7 printf がハングする
さまざまな印刷コマンドに問題があります。
printf() を呼び出そうとするたびに、システムがハングするか、リセットされることがあります。
UART が動作しており、UART_PutChar() を使用してコンソールに正常に出力できます。
fprintf は単純な文字列を印刷するだけの単純なケースで機能しますfprintf(stdout, "test\n");
が、フォーマットされた文字列はシステムをfprintf(stdout, "test %d\n", 1);
ハングさせます .data セクションからデータを印刷しようとしているときにもハングが発生します
改行を印刷するとprintfが機能しますprintf("\n");
printfは、次のような場合にのみ 改行を印刷します
場合によっては、fprintf が失敗すると、EOF が返されます (今は覚えていないので、関連性があれば明日提供します)
(f)printf は putchar を呼び出しているようで、UART に再ターゲットしました。不思議なことに、それは newlib-nano によって提供される呼び出しまたはルーチン
であるべきだと思います(そして printf はそれらを呼び出していません)。
IDE として、EmBitz とそれが提供するツールチェーン (arm-none-eabi) を使用しています。私が使用しているCPUはat91sam7x128です。JTAG を使用してプログラムをデバッグできないため、デバッグには UART のみを使用する必要があります。_write
_write_r
UPDATE スターター スクリプト: SAM7.s
リンカー スクリプト
更新 2 syscall の私の迅速で汚い再実装。
plot - ARM 汎用レジスタをプロットする
ARM7 命令をエミュレートし、レジスタ値を経時的にプロットできるアプリを探していました。µVision IDE 5 を試しましたが、できないようです。おすすめのアプリはありますか?
exception - arm7tdmi で、FIQ と RIQ が同時に発生した場合、最初に FIQ と次に IRQ を実行するにはどうすればよいですか?
arm7tdmi で、命令が実行され、同時に FIQ と IRQ の両方が同時に発生するとします。現在、優先度に従って FIQ が処理され、次に IRQ が処理されますが、私の質問は、FIQ から戻った後に IRQ をどのように処理するかということです。 FIQ の戻り時に行われるプロセスと、FIQ ハンドラーの return ステートメントの後に制御がどのように IRQ ハンドラーに転送されるか?
例: アドレス => 命令
; 0x00000108 で命令が実行され、FIQ と IRQ が発生したとします。
c++ - 送信後に GDB のバージョンを特定できませんでした: arm-none-eabi-gdb --version、応答:
Kinetis Design Studio で GDB PEMicro Interface Debugging を使用してプロジェクトをデバッグしようとしていますが、次のエラーが表示されます: 「myProject の起動中に問題が発生しました。」送信後に GDB のバージョンを特定できませんでした: arm-none-eabi-gdb --version、応答:
コンピューターをフォーマットしましたが、数日かかります。そして、同じ設定の他のコンピューターがあり、うまく機能しました。
私の設定:
Eclipse 設定 -> C/C++ -> ビルド -> グローバル ツール パス
- ビルド ツール フォルダー: (空)
- デフォルトのツールチェーン: GNU Tools for ARM Embedded
- ツールチェーン フォルダー: /opt/Freescale/KDS_v3/toolchain/bin
Eclipse 設定 -> C/C++ -> ビルド -> ワークスペース ツール パス
- ビルド ツール フォルダー: 空
- デフォルトのツールチェーン: グローバル デフォルト
- ツールチェーン フォルダー: 空
プロジェクト プロパティ -> C/C++ ビルド -> ツール パス
- 空の
プロジェクト プロパティ -> C/C++ ビルド -> 設定 -> ツールチェーン
- 名前: ARM 組み込み用 GNU ツール
- アーキテクチャ: アーム
- プレフィックス: arm-none-eabi-
- サフィックス: (空)
- ツールチェーン パス: /opt/Freescale/KDS_v3/toolchain/bin
プロジェクトのプロパティ -> C/C++ ビルド -> 環境 -> PATH
- 起源:ビルドシステム
起動構成のデバッグ -> [メイン] タブ
- プロジェクト: myProject
- C/C++ アプリケーション: myProject/myProject.elf
デバッグ起動構成 -> デバッガー タブ
- GDB クライアント設定 -> 実行可能ファイル: ${cross_prefix}gdb${cross_suffix}
- コマンド:
mem inaccessible-by-default をオフに設定
tcp 自動再試行をオンに設定
tcp 接続タイムアウトを 240 に設定します
どうすれば修正できますか?
assembly - ARM (ARM7TDMI) で最も効率的に下位 16 ビットのハーフワードを取得する方法は?
レジスタに 32 ビットの値があるとします。r0 = 0x12345678; タスクは、0x5678 である下位ハーフワード部分を取得することです (または、上位ハーフワードを無効化します)。C コードに関しては、次と同等です。r0 = r0 & 0xFFFF;
制限: 他のレジスタを使用せずに、単一の ARM7TDMI 命令で実行する必要があります。これは、上半分を取得することがLSR r0, r0, #16
.
これまでのところ、左シフト + 右シフト、回転 + シフトの 2 つの命令で実行できます。または、マスク 0xFFFF と AND-ing を含む追加のレジスタを使用します。
ARM7TDMI では、0xFFFF のような定数と単純に AND することはできません。これは、即値スキームに適合しないためです。
また、最近の ARM-s には を実行することで解決する "MOVT" があるようMOVT r0, #0
ですが、ARM7TDMI にはありません。
MOVTはとても基本的なことなので、MOVTがなくても可能だと信じたいです。