問題タブ [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.
unit-testing - Arduinoコードを単体テストするにはどうすればよいですか?
Arduino コードを単体テストできるようにしたいと考えています。理想的には、コードを Arduino にアップロードしなくてもテストを実行できるようにすることです。これに役立つツールやライブラリは何ですか?
便利な開発中の Arduino エミュレーターがありますが、まだ使用する準備ができていないようです。
Atmel のAVR Studioには便利なチップ シミュレータが含まれていますが、Arduino IDE と組み合わせて使用する方法がわかりません。
c++ - __cxa_pure_virtual の目的は何ですか?
avr-gcc でコンパイル中に、次のようなリンカ エラーが発生しました。
次のようなドキュメントを見つけました。
この
__cxa_pure_virtual
関数は、純粋仮想関数が呼び出されたときに呼び出されるエラー ハンドラーです。純粋仮想関数を持つ C++ アプリケーションを作成している場合は、独自の
__cxa_pure_virtual
エラー ハンドラー関数を指定する必要があります。例えば:
extern "C" void __cxa_pure_virtual() { while (1); }
この関数を提案どおりに定義するとエラーが修正されますが、知りたいのですが:
- この機能の目的は何か、
- なぜ自分で定義する必要があるのか
- 無限ループとしてコーディングすることが許容されるのはなぜですか?
c++ - avr-gcc を使用して C/C++ でプリメイン初期化を実行するにはどうすればよいですか?
main
(Arduino/avr-gcc を使用して)前にいくつかの初期化コードが実行されるようにするために、次のようなコードがあります。
理想的には、次のように簡単に記述できるようにしたいと考えています。
しかし、これはコンパイルされません...
同じ効果を達成するためのより冗長な方法はありますか?
注:コードは Arduino スケッチの一部であるため、main
関数は自動的に生成され、変更できません (たとえばinitialize
、他のコードの前に呼び出すなど)。
更新:理想的には、初期化はsetup
関数で実行されますが、この場合、関数の前に発生する他のコードがありますmain
。
debugging - AVRプログラムのメモリ(SRAM)使用量を視覚化するにはどうすればよいですか?
AVRマイクロコントローラー(ATMega328P)で実行されているCプログラムで問題が発生しました。スタック/ヒープの衝突によるものと思いますが、確認したいと思います。
スタックとヒープごとにSRAMの使用状況を視覚化する方法はありますか?
注:プログラムはavr-gccでコンパイルされ、avr-libcを使用します。
更新:私が抱えている実際の問題は、mallocの実装が失敗している(returning NULL
)ことです。すべてのmalloc
ingは起動時に発生し、すべてのfree
ingはアプリケーションの最後に発生します(実際には、アプリケーションの主要部分が無限ループにあるため、これは決して発生しません)。したがって、断片化は問題ではないと確信しています。
c++ - avr-gcc C++ コンストラクターに渡された文字列をコピーする必要をなくすにはどうすればよいですか?
ArduinoUnitユニット テスト ライブラリでは、TestSuite に名前を付けるメカニズムを提供しました。ライブラリのユーザーは、次のように記述できます。
これは想定される使用方法です。TestSuite の名前は文字列リテラルです。ただし、見つけにくいバグを防ぐために、次のようなさまざまな用途に対応する必要があると感じています。
そのため、次のように TestSuite を実装しました。
コンストラクターでのメモリ割り当てエラーの処理に失敗するという問題はさておき、次のようにポインターをメンバー変数に単純に割り当てることをお勧めします。
動的メモリ割り当てを廃止できるように、インターフェイスを変更して「正しく」使用するようにする方法はありますか?
c++ - new を使用せずに C++ で Factory Method パターンを実装できますか?
私は組み込み環境 (Arduino/AVR ATMega328) で作業しており、C++ で Factory Method パターンを実装したいと考えています。ただし、使用しているコンパイラ (avr-gcc) はnew
キーワードをサポートしていません。を使用せずにこのパターンを実装する方法はありnew
ますか?
avr-gcc - avr-gcc: 「'__progmem__' 属性は無視されました」という警告を抑制します
この警告を抑制する方法を知っている人はいますか? それらを回避する方法はありません (それらは私が使用するフレームワークに由来します)。
ありがとう!
embedded - シリアル出力で文字を整形!
EFSL を使用して SD カードを ATmega128 に接続しています。カードは初期化されますが、シリアル ポート出力で「不明なエラー 0xff(sandisk docs p5-13 を参照)」というエラーが表示されます。
それだけではありません。「sprintf」を使用して、シリアル ポートに表示する文字列を形成しました。不可解なことは、出力に「%02d」などの実際の書式設定文字も含まれていることです! アプリケーション自体がクラッシュしていると思います。ソースコードを提供できますが、大きすぎます。見たい人がいたらここにコピペします。
サンディスクのドキュメントp5-13もチェックしましたが、わかりません...
私はこれについて助けが必要になるでしょう...誰かがこれについて何か知っているなら教えてください...
gcc - GNU AS に行ごとのデバッグ情報または GDB を (AVR) アセンブリの単一ステップ行に出力させるにはどうすればよいですか?
アセンブリで gdb の行番号デバッグ情報を GAS に出力させる方法がわかりません。私は avr-gcc クロス コンパイラを使用していることに注意してください。
次のコマンド ライン オプションを使用してアセンブルしています: avr-gcc -g -ggdb -Os -mmcu=atmega644 -ffunction-sections -fsigned-char -Winvalid-pch -Wall -Wno-long-long -x assembler-with -cpp -Wa,-ggdb -c -o z813.o z813.s
ほぼ同じ一連の引数を使用して C コードをコンパイルすると、「objdump -l -d」を使用して行番号とソース ファイルの拡張を確認できます。
ただし、アセンブリ オブジェクトには何もありません。すなわち
avr-gdb で (simulavr リモート gdb 接続を介して)、シンボル名と情報は認識しますが、アセンブル コードをシングル ステップで実行できません。これが関係していると思います。
私はこれを info/man/google で見つけて、可能性のあるフラグを並べ替えようと努力しました。どんな助けでも大歓迎です!
optimization - このコードが avr-gcc によって生成されるのはなぜですか? また、どのように機能しますか?
これは、私が取り組んでいる C プロジェクトから逆アセンブルされた AVR コードのスニペットです。この奇妙なコードが生成されていることに気付きましたが、それがどのように機能するのか理解できません。私はそれがある種のばかげた最適化であると仮定しています...
説明は何ですか?
具体的には、2 番目の命令が R25 から 0xFF だけではなく 0xFF を減算するのはなぜINC R25
ですか?