問題タブ [arm]
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.
assembly - 「[Lp002]:IAR ARMツールで再配置に失敗しましたか?」を修正する方法
ARM用のアセンブラーで小さなモジュールを作成し、ベアメタル組み込みアプリケーションとリンクしました。アプリケーションを再構築しているときに、「エラー[Lp002]:再配置に失敗しました:値が範囲外または不正です」というメッセージが表示されることがあります。さらに不可解なのは、Cモジュールのコードをコメントアウトした後にエラーが発生することです。
IARマニュアルは、「セクションまたはコードの並べ替え」についてあいまいです。しかし、コンパイラによって.cファイルから生成されたアセンブラファイルを見ると、それらのセクション宣言と私のものに違いはありません。私は実際にコードをCでスタブアウトしてから、アセンブルされたファイルを引き継ぐことから始めました。
c - ARM プロセッサの使用を開始するにはどうすればよいですか?
初心者向けの ARM プロセッサのデータシートとユーザー マニュアルから直接始めるか、最初に ARM の世界について理解してから先に進むことをお勧めしますか?
gcc - ARM7のKeil対GCC?
KeilはARM7開発に関してGCCとどのように比較されますか?私は中規模のプロジェクトにハードウェアコンサルタントを選ぶ過程にあり、一部はkeilを使用し、一部はgccを使用しています。どちらのオプションを使用する場合の落とし穴も知りたいのですが...
python - 組み込み ARM9 デバイス上の Python/mySQL?
小さな組み込み ARM9 デバイス (Linux を実行) がセンサーから情報を収集し、リモートの mySQL データベースに接続してデータを挿入する必要があるアプリケーションがあります。ARM9 デバイスで Python 2.5 を正常に実行しています。x86 Windows 上で動作する Python 2.5 でプロトタイプ アプリケーションを開発しました。それは mySQL と INSERTS に問題なく接続します。この問題に関する私の混乱は、使用する前に ARM プロセッサ用にクロス コンパイルする必要がある "mySQL Connect/C" を使用することに起因しています。
- この DB アプリを ARM デバイスに移植または移動する最良の方法は何ですか?
- クロス コンパイルが必要なサポート ライブラリに、基になる x86 バイナリはありますか?
- それとも、MySQLdb は単にプラットフォーム間で移植可能ですか?
c++ - GCC C ++(ARM)および構造体フィールドへのconstポインター
簡単なテストコードがあるとしましょう
これは、ベアメタルARM用にCodeSourcery G ++(gcc 4.3.2)でコンパイルされています。また、非常に標準的なリンカースクリプトもあります。
Cで(main.cとして)コンパイルすると、オブジェクト「データ」は期待どおりにFlashに入ります。C ++で(main.cppとして)コンパイルされると、このオブジェクトはRAMに入れられ、フラッシュからRAMに値をコピーするだけの追加コードが追加されます(値はすでに計算されています。コピーするだけです!)。したがって、コンパイラはアドレスを計算できますが、どういうわけか「それを使用する」ことを望んでいません。問題の根本は、アドレスの乗算です。「* 2」の乗算がないと、両方のバージョンが期待どおりに機能します。「データ」はFlashに配置されます。また、「データ」が次のように宣言されている場合:
また、すべてが大丈夫です。
CおよびC++コンパイルのすべてのファイルは同一であり、唯一の違いはコンパイラーの呼び出しです。main.cppの場合はg ++、main.cの場合はgccです(警告のレベルに違いがあり、c ++ではRTTIと例外が無効になっています)。
この「C++の問題」を克服するための簡単でエレガントな方法はありますか?Cortex-M3のビットバンド領域のビットのアドレスのconst配列を作成するには、このような操作が必要です。これはバグですか、それともC ++コンパイラの奇妙な制限ですか?
「C」ファイルでデータオブジェクトを作成し、「extern」だけでデータオブジェクトを作成できることは知っています。C++にそれらを含めますが、それはあまりエレガントではありません[;
助けてくれてありがとう!
optimization - ARMasmで2つのハーフワードを高速飽和およびシフト
32ビットワードに2つの符号付き16ビット値があり、定数値(1から6まで可能)で右にシフト(除算)し、バイト(0..0xFF)に飽和させる必要があります。
例えば、
- shift=5の0xFFE100AAは、0x00000005になる必要があります。
- 0x23451234は0x00FF0091になる必要があります
次のような擬似コードのように、値を同時に飽和させようとしています。
しかし、私が取得するコードは非常に醜くて遅いです。:)私が今持っている最高の(最速の)ものは、次のように、各半分の別々の飽和です:
しかし、それは10サイクルです。:(もっと速くできますか?
ps:後で、このためのUSAT16命令を見つけましたが、これはARMv6専用です。そして、ARMv5TEとARMv4で動作するコードが必要です。
編集:今、私は私の最初のコードを書き直します:
しかし、それは美しくありません。
linux - ARM Linux とクロス ツールチェーンの問題
おそらく腕のツールチェーンに問題がありますが、他に何か間違っている可能性があります。Samsung s3c2440 ARM9 uCを使用して中国製の開発ボードqq2440を使用しています。ネイティブ gcc(4.3.3) で Ubuntu x86 を使用しており、バージョン arm-unknown-linux-ulibc-gcc (crosstool-NG-1.3.2) 4.3.2 をクロスコンパイルしています。
http://blog.leshak.ru/english/pages/how-to-install-u-boot-linux-2629-rootfsjffs2-busybox-1132-into-nand-qq2440/のチュートリアルに従い、 Leshakのカーネル を使用しましたそのボードのパッチ。問題は、彼のバイナリは完全に機能し、私のバイナリは機能しないことです...
RS232 (シリアル ポート) 経由でボードと通信し、ターゲット Linux でシリアル ターミナルを構成しています。Leshakのuboot イメージを使用します。カーネルを構成するには、次のコマンド ラインを使用します。
ターゲットには、 Leshakによって作成されたパッチを適用したバニラ Linux ソース バージョン 2.6.29 を使用します。Linux は主流の製品ではないため、これが Linux によって公式にサポートされるとは正直信じていません。
カーネル イメージが起動し始めますが、帯域幅 (または CPU 周波数) が非標準値に変更される可能性があります (すべての標準値を既に試しています)。カーネルをメモリにロードすることを示すドットの代わりに、代わりにゴミしかありません。残念ながら、ネットワーク インターフェイスもファイル システムも起動しないため、起動プロセスが終了しない可能性があります。そのため、途中でパニックになることがわかりました。
次に何をすべきか?
ありがとうございます。それでは、お元気で、
クリス
embedded - ROMFS を RAM にアタッチするとはどういう意味ですか?
uClinux 2.4 を実行する ARM プラットフォーム用のカーネルを構築しています。Linux 構成の「General Setup 」の下に、「 m68knommu-style attached romfs in RAM support 」というオプションがあります。私の ARM アセンブリ スキルは多少制限されていますが、このオプションを有効にすると、ROMFS がカーネル BSS の最後にコピーされます。
これの目的は何ですか?
c++ - reinterpret_cast tovoid*が関数ポインタで機能しない
関数ポインタをvoid*変数にキャストすることを再解釈したいと思います。関数ポインタのタイプはタイプになりますClass* (*)(void*)
。
以下はサンプルコードです。
上記のコードは、Visual Studio/x86コンパイラでうまく機能します。しかし、ARMコンパイラでは、コンパイルエラーが発生します。理由はわかりません。
エラー:#694:reinterpret_castはconstまたは他の型修飾子をキャストできません
関数ポインタを別の型にキャストするの説明を読みました
以下の説明が気になりました。
関数ポインタと通常のポインタの間のキャスト(たとえば、a
void (*)(void)
をaにキャストするvoid*
)。一部のアーキテクチャでは、追加のコンテキスト情報が含まれている可能性があるため、関数ポインタは必ずしも通常のポインタと同じサイズである必要はありません。これはおそらくx86で問題なく動作しますが、未定義の動作であることを忘れないでください。
void (*)(void*) -> void*
少なくともほとんどのコンパイラでほぼ同じようにコンパイルされるように、このような変換を効果的に行うにはどうすればよいですか?