問題タブ [avr-gcc]
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++ - リンク中に必要な .o ファイルを表示するように GNU ld に指示できますか?
ちょっとした背景:組み込みセンサー システム用の AVR バイナリをビルドしようとしていますが、サイズ制限に近づいています。私はいくつかの外部ライブラリを使用していますが、ライブラリごとに 1 つのオブジェクトにコンパイルするとかなり大きくなります。これらを小さなオブジェクトにまとめて、必要な機能だけがプログラムにリンクされるようにしたいと考えています。大きなライブラリを分割することで、バイナリ サイズを 2k 減らすことができました。
ゲームの各段階でどのオブジェクトが使用されているかを知ることは、より効率的に分割できるようにするのに非常に役立ちます。ld
リンクしているオブジェクトを印刷する方法はありますか?
assembly - avr tiny では、マイクロコントローラーの電源が入ったときに sram に保存されるデータはどのように初期化されますか?
最初にいくつかの背景。avr tiny では、データはレジスタ、sram、eeprom、またはプログラム空間に格納できます。レジスタと sram は揮発性ストレージですが、eeprom とプログラム空間はそうではありません。(つまり、電源が入っていなくてもデータは残ります。)
(avr-gcc ライブラリを使用して) c でプログラミングする場合、典型的なコードは次のようになります。
でコンパイル:
そして、 .elf から intel .hex を抽出します:
次の test.hex を取得します。
そして、次の逆アセンブル:
では、sram に入れたかったデータ (0xef) はどのように初期化されるのでしょうか?
答えは、メインの前のルーチンによるものです。
sram に格納する必要があるデータは、プログラム空間のアドレス 0x5a にあります。次の方法で sram に挿入します。
- x レジスタの上位バイトと下位バイトは、sram 内のデータを配置するアドレス (0x60) に設定されます。このアドレスはプログラム メモリではなく、データ メモリ内にあることに注意してください。
- z レジスタも同様ですが、データがプログラム空間 (0x5a) 内にあるアドレスを使用します。
- z レジスタに格納されているアドレスのプログラム メモリの内容は、lpm オペコードを介してレジスタ r0 にロードされます。z レジスタ値は、sram にロードする次のデータ (最終的に、ここではなし) を指すようにインクリメントされることに注意してください。
- r0 のデータは、sram の x レジスタに格納されているアドレスに格納されます。
- sram にあるはずのすべてのデータが初期化されるまで繰り返します。
これは、メインへの rcall の前に発生します。
より良い/より明確な答えはありますか?
c - pgm_read_byte マクロ (AVR-GCC) を Mircrochip C18 Compiler に移植するには?
T6963 ベースの LCD ドライバを AVR-GCC からマイクロチップ C18 コンパイラに移植しています。マクロ " pgm_read_byte "を見たことがあります。このマクロを移植する方法を知っている人はいますか?
アップデート
ここから、マクロの実装を見ることができます
eclipse - Eclipse Arduino メーカー: *** エラー 1
以下は、プロジェクトをビルドしようとしたときに表示されるエラーです。どのファイルまたはディレクトリについて話しているのかわかりません。すべてのファイルとディレクトリは、プロジェクト ディレクトリ内にあります。
http://arduino.cc/playground/Code/Eclipseの指示に従ってIDE をセットアップしました。
Arduinoコアファイルはプロジェクトディレクトリ内にあり、特にArduinoコアライブラリに追加されるべきですか? 私が与えたのはliArduinoCore.a
、Arduino IDE によって生成されたファイルだけでした。これが問題でしょうか?
エラーメッセージ
arduino - Arduino プロジェクトをリンクして Simulink コードを含めることはできません
仕事では、最近、組み込みアプリケーション用の C コードを生成できる Simulink Coder を含む MATLAB/Simulink のトレーニングを受けました。やってみたかったので、Arduinoを買って飛び込みました。 簡単なスケッチは問題なく書けますが、Simulinkで生成されたコードを統合しようとすると、壁にぶち当たります。
最初は Arduino IDE を使用し、次に Eclipse と Arduino プラグインを使用し、最後に Xcode とembedXcode テンプレートを使用しました。(私のSimulinkの仕事用マシンはPCですが、「無許可のソフトウェア」をインストールすることは許可されていないので、残りは自宅のMacで行いました。) 3つとも同じavr-gccコンパイラを使用しています。
3 つすべてに同じ障害点がありました。生成された関数呼び出しで「未定義の参照」エラーが発生しました。これは、基本的な構文やヘッダーのインクルードではなく、リンカの問題であると考えています。Eclipse と Xcode のコード補完は正常に機能しており、コール シグネチャを何らかの方法で変更すると、エラーが変化します。データ構造への参照を作成できます。
私の知る限り、デフォルトのメイクファイルは、フォルダー内のすべてのファイルをコンパイルおよびリンクするように設定されています。少なくとも Xcode を使用して、「mass_model2.o」ファイルが作成されています。最後に、"myFunction.c" および "MyFunction.h" ファイルを個別に単純な関数呼び出しで手動で作成すると、デバイス上で期待どおりにコンパイルおよび実行されます。
必死になって、生成された「.c」ファイルの内容全体をコピーし、同じ「.h」参照を保持して、メイン スケッチ ファイルの mysetup()
とloop()
関数の後に貼り付け、プロジェクトから「.c」ファイルを削除しました。 . これは実際にコンパイルして実行しました!ただし、生成されたコードを使用するために手を加える必要はありません。
これを適切にコンパイルおよびリンクするにはどうすればよいですか?
Simulink コードは非常に冗長なので、重要な部分を次に示します。
mass_model2.h の抜粋:
mass_model2.c の抜粋:
他の参照ヘッダー「rtwtypes.h」と「mass_model2_private.h」は、生成されたコードで使用される特定の型を定義しますint16_T
。これらのファイルはプロジェクトに含まれており、それらに関連するエラーは表示されません。
私のスケッチ ファイルでは、setup()
関数は を呼び出しますmass_model2_initialize()
。loop()
入力 (ポテンショメータ) を読み取り、 に値を設定しmass_model2_U.PotPos
、 を呼び出しますmass_model2_step()
。次にmass_model2_Y.ServoCmd
、値を取得して出力用のサーボに書き込み、最後にdelay()
.
c++ - ベクトルC++なしですべての配列を新しい配列にコピーします
上記を試してみました。idxをループし、新しいシーケンスをled_patternにコピーしてから、それをループし、戻って次のシーケンスを取得します。
ここで、ベクトルを使用して配列全体を渡す方法を見つけました。 C ++:配列をコピー
しかし、ベクトル(私は信じています)は私が使用しているコンパイラ(avr-gcc / c ++)では機能しません
これをC++内に実装するにはどうすればよいですか?私はPythonで以下が機能することを知っています。配列を別の変数に割り当てることができ、それを「複製」します。
ありがとう
avr - ATMega2560 上の vsnprintf
ツールキットを使用して、ATMega2560 で楕円曲線暗号を実行しています。ツールキットで印刷機能を使用しようとすると、空の文字列が表示されます。x86 バージョンでは問題なく変数が出力されるため、出力関数が機能することはわかっています。私は ATMega の経験がなく、この問題について何か助けていただければ幸いです。印刷コードは以下に含まれています。
大きな数値を出力するコード (それ自体が util_print を呼び出します)
大きな数値変数を実際に出力するコード:
編集: UART が初期化されており、printf ステートメントをコンソールに出力できます。
c++ - avrg++で関数宣言エラーを無効にする
私はこのMakefileを使用して、CPPとCの次のフラグを持つArduinoスケッチをコンパイルしています
cppファイルをコンパイルするときに、関数が宣言される前に使用されると、致命的なエラーが発生します。私はavrg++オプションを調べたところ、オプション-Wimplicit-function-declarationがそれを有効にしていることがわかりました。また、makeファイルで使用される-Wallオプションによって有効になります。
-Wallオプションを有効にしたい(他の多くの警告を有効にするため)が、-Wimplicit-function-declarationオプションのみを無効にします。
ドキュメントを確認しましたが、これを行う方法がわかりませんでした。誰かが親切にそれを行う方法を教えてもらえますか?
c++ - C++ で複数のファイルにまたがる複数の名前空間内でクラスを使用する
次のコードをavr-g++
(AVR マイクロコントローラー用の C++ コンパイラー) でコンパイルする際に問題があります。
このクラスで使用されるいくつかの列挙型とクラスをこのファイル内に定義しましたが、コードが長くなりすぎないように含まれていないことに注意してください。
エラーが表示されます
私のプロジェクトには、modules
作業中のプロジェクトに固有のものを表すいくつかのファイルがあります。これらのファイルは、 という名前のサブディレクトリにありModules
ます。ヘッダーファイルLIBcpp.hpp
はその上のディレクトリにあります。Modules
サブディレクトリ内のすべてのヘッダー ファイルが含まれます。
クラスPin
は、名前空間内にある名前空間内で定義されIO
ますuC
。IO.hpp
このクラスは、 によってインクルードされるという名前のヘッダー ファイルで定義されますLIBcpp.hpp
。
私が試したこと:
IO.hpp
ヘッダー ファイルにヘッダー ファイルを含めるSPI.hpp
- 同じエラーが発生する
このエラーを解決する方法がわかりません。この問題を解決するためにさらにコードや情報が必要な場合は、提供します。
ありがとう!
これはIO.hpp
、要求されたとおりです。
c++ - NULL ポインター引数のコストはどれくらいですか?
C(++) (AVR-Gcc) で組み込みシステムにメニューを実装する際に、引数を取り、通常はそれらを使用する void 関数ポインターになってしまいました。
場合によっては (実際にはかなりの数)、関数は実際には引数を必要としないため、次のようにします。
別の関数型にオーバーロードできることはわかっていますが、複数のオブジェクトをインスタンス化し、それらを軽量に保ちたいため、実際にはこれを行わないようにしています。
NULL ポインターを使用して複数の関数を呼び出すことは (実際のポインターを対象としている場合)、より多くの関数プロトタイプを実装するよりも悪いことですか?