問題タブ [armcc]
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 - ARMCC: memcpy の問題 (アライメント例外)
一部のソフトウェアを gcc-toolchain から armcc-toolchain に移植しています (プロセッサは同じ (Cortex-A9) のままです)。C コードでは memcpy が使用されます。armcc は、memcpy への呼び出しを __aeabi_memcpy への呼び出しに置き換えます。FAQ では、__aeabi_memcpy について次のように述べています ( ARM コンパイラは memcpy() をどのように処理しますか? )。
多くの場合、memcpy() への呼び出しをコンパイルするときに、ARM C コンパイラは代わりに、特化され最適化されたライブラリ関数への呼び出しを生成します。RVCT 2.1 以降、これらの特殊な関数は ARM アーキテクチャ用の ABI (AEABI) の一部であり、次のものが含まれます。
しかし、私のすべてのケースで memcpy への呼び出しが正常に機能する gcc とは対照的に、armcc では、memcpy への呼び出しはそれぞれ __aeabi_memcpy で継続的にアライメント例外を生成します。一方、memcpy の呼び出しは、送信元アドレスと宛先アドレスが 4 バイトで整列されていない呼び出しを処理できることがわかりましたが、両方とも 4 バイトで整列されていない場合に限ります。例えば:
動作します。しかし、例えば:
アライメント例外が発生します。タイプ uint8_t* のポインターを使用しているため、コンパイラーに、アドレスが任意のアライメントを持つことができることを明示的に伝えます。しかし、明らかに、この __aeabi_memcpy はアライメントのすべての組み合わせを処理できるわけではありません。この問題を解決するにはどうすればよいですか (できれば、既存のコードで memcpy のすべての呼び出しを変更せずに、ユーザー固有のバージョンの memcpy を使用します)。手伝ってくれてありがとう。
gcc - gccのarm命令ldrエラーはarmccで正常に動作します
上記のコマンドは何をしますか? それを使用するとエラーが発生しますが、armcc
問題なくコンパイルされますarm-none-eabi-gcc
命令に続くガベージ -- `ldr r2,=0x0:OR:(Region_64K<<1):OR:Region_Enable'
gcc のどこで
ARMCCで
c - 別のマクロを呼び出した後、マクロの値を継続的にインクリメントする
構造化スキーマを念頭に置いてヘッダー ファイルを作成しています。私の目標は、別のマクロを呼び出した後にインクリメントされるベース アドレスを定義することです。これの目的は、新しいベース アドレスの実行中のカウントを保持し、コンパイル時に最大物理アドレスを超えているかどうかをチェックすることです。
以前は、アドレスをカウントするためにグローバル変数を使用することを考えていましたが、これは実行時に解決されるため、メモリ破損の可能性を防ぐために、バイナリが出力される前のコンパイル時にこれが必要です。
例として私が意味することは次のとおりです。
以下は、検査時にヘッダーファイルがどのように見えるか (または同等のもの) です。
実際には、以下のコード ブロックは 1 行目と 2 行目を次のように展開します。
そして、ファイルの最後で #error チェックを行い、境界を超えていないことを確認します
上記からわかるように、メモリのすべての領域が完全に使用されるわけではありません。2 と 3 の間のように、50 バイトのバッファーがあります。つまり、ベースアドレスは次のいずれかになります。
- #define OR を使用してハードコードされた値
- 前の領域のベースからのオフセット + 前の領域のサイズ
これは、使用しているコンパイラ (ARMCC RVCT 5.03) 内で可能ですか?
前もって感謝します
assembly - arm アセンブリ命令を gnu と同等のものに
以下は、arm アセンブラーと互換性のある行のコードです。これらを gnu の同等のものに変換したいと考えています。基本的に、ベアメタルのcortex-r4でコードを実行しようとしていましたが、インターネットを見た後、gnu用のスタートアップとリンカーファイル(cortex-r4用)が見つからないため、最終的にこれらをgnuアセンブリに変換することにしました. 以前にこれらを試して変更しましたが、いくつかのエラーがありました(ただし、コードはスムーズにコンパイルされましたが、エラーは実行時でした)
スタートアップ ファイルまたはリンカー ファイルを提供または案内していただけると助かります。
よろしく、
gcc - コンパイル警告のリスク
主に 2 種類のコンパイル警告があります。
1. 関数の暗黙の宣言
in a.c
、char *foo(char *ptr1, char *ptr2)
in 、いくつかの関数は宣言なしでb.c
この関数を使用し、コンパイラは関数の戻り値を整数として扱うようであり、関数宣言よりも少ないまたは多い変数を渡すことができることがわかりましたfoo
foo
foo
2. 列挙型と別の型の混在
私のターゲットチップはARM11で、これら2種類のコンパイル警告を解決しなくても、プログラムは問題なく実行できるようですが、これらの背後には何らかのリスクがあるに違いないと思います. これら2種類のコンパイル警告が予期しない問題を引き起こす可能性があるという良い例を誰か教えてもらえますか?
一方、これら 2 つの警告に潜在的なリスクがある場合、なぜ C コンパイラはこれらの種類の警告の発生を許可し、直接エラーに設定しないのでしょうか? 裏話は?
c++ - クラス定義で型 (enum、struct など) を宣言すると、コード サイズが大きくなります
armccコンパイラを使用して組み込みソフトウェアを開発しています。デバッグ目的で、 -O0フラグを使用して最適化を最小限に抑えます。コードをわかりやすくするために、いくつかの列挙型と構造体の定義をパブリック アクセスを持つクラスに移動しました。
これから:
これに:
そして、myClass のようにそれらに到達します。
しかし、驚いたことに、コードに他に違いはなくても、コード サイズが 600 バイトほど増加しました。列挙型を直接の値に置き換えるコンパイラの最適化 (-O0 でもいくつかの最適化がアクティブになっている) が原因であると思いますが、これについてはわかりません。コード サイズが増加した原因 (または、最適化が妨げられた原因) は何ですか?
c - 関数の引数での__packed属性の使用は何ですか
パディングを避けるため__packed
に宣言で属性を見てきました。ただし、関数の引数で属性struct
を使用する利点は何ですか。__packed
著者は__packed
、整数がアラインされていない可能性があることをコンパイラに伝えていたと言います。どういう意味ですか?
編集:以下はgcc
コンパイラで動作しますか
c++ - C++ プログラムのクロス コンパイル中にアクセス許可が拒否される
arm-v8 のクロスコンパイル用に gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux をインストールしました。しかし、ビルド中に許可が拒否されています。私は命令を使用しました:
gcc - gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux のコンパイラ オプションは何ですか?
オプションを使用していました:
ArmLinuxToolChain を使用した arm-v7 (32 ビット) のクロス コンパイル用。
の同等のコンパイラ オプションはgcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux to build for armv8
何ですか? -march=armv8-a -mtune=cortex-a53 で同じオプションを使用してみましたが、次のようになりました。
aarch64-linux-gnu-g++: エラー: 認識されないコマンド ライン オプション '-mfloat-abi=softfp'