ArduinoIDEのシリアルポートバッファを増やすための手術





私はArduinoインフラストラクチャの大ファンではありません。はい、今日はすでに多くのオプションがありますたとえば、プロIDEプラットフォームIOなどです。ただし、元のIDEからは常にハートバーンが発生します。そして、私が非常に単純なことをしたかった前日、ATmega32シリアルポートの受信バッファを増やすことだけを完全に評価しました。結局、私は他の問題にも役立つ解決策を思いついたので、この機能が特に必要ない場合でも、私が何をしたかを正確に確認すると役立つ場合があります。



この経験は私に二重の印象を残しました。一方で、私はこのわかりにくいエディターを、私から隠しすぎて、便利なツールをほとんど提供していないことを軽蔑しています。一方で、内部構造の細部を掘り下げてみると、その柔軟性に感銘を受けました。



まず、おそらく私がIDEを使用している理由を尋ねているでしょう。要するに、私はそれを使用しません。ただし、他の人が使用するようなことをした場合、無視することはほとんど不可能です。ただし、独自のIDEを設定すると、コードがオンラインになるとすぐに、誰かがIDEでそれを使用しようとします。私はかつて4ドルのZ80ベースのコンピューターについて書いたことがあります。自分が書いているものを作成する時間はめったにありませんが、この小さなコンピューターを作成してみたかったのです。しばらくの間、すべてが半分分解された状態にあり、それから彼らは私に彼の代金を送ってくれました。私はそれを受け取りました、そして-あなたが推測したかもしれないように-それはまだ少し半分分解されて横たわっていました。しかし、私はついにプロジェクトを終了する時間を見つけ、CP / Mをダウンロードしました。







プロジェクトの唯一の問題は、プロジェクトからPCに、またはその逆にデータを転送するための適切なオプションがないことでした。Intel hexファイルを作成し、ターミナルからコピーして貼り付けるのが最善のようです。私はもっ​​と良いものが欲しかったので、土曜日の朝にウサギの穴に行き着きました。その結果、プロジェクトで使用されているハードウェアに応じてコンパイラ設定を編集するために、独自のメニュー項目をArduinoIDEに追加する方法を思いつきました。このトリックは、この特定のタスク以外でも役立つ可能性があるため、学ぶ価値があります。



問題:Arduinoシリアルポートのバッファサイズの制限



ボードを持っている場合にのみ興味があるので、ボードを機能させる方法の詳細については気にしません。あなたが本当にそれを必要とするならば、すべての詳細はHackaday.io議論にあります。その結果、Arduinoシリアルポートバッファは、XModemを介した送信が信頼できると見なされるほど大きくありませんでした。すべてがデフォルトの64バイトのバッファーで機能しているように見えましたが、XModemはより多くのデータを送信しており、バッファーがオーバーフローしていることは容易に想像できます。



バッファを更新するのはどれほど難しいですか?一方、これは簡単な作業です。一方で、あなたのツールはあなたを助けるために非常に一生懸命に努力しているので、それは非常に困難です。



ツールのセット



小さなコンピュータープロジェクトでは、ほとんどすべての補助機能に実際のZ80チップとATMega32Aを使用しています。クロック速度、シリアルポート、ストレージなどを提供します。ただし、Arduino IDEはATMega32Aを直接サポートしていないため、これを行うにはツールボックスをインストールする必要があります。状況はMightyCoreを必要としたので、私はそれを使用しました。



シリアルポートライブラリは#defineステートメントで構成されているため、バッファサイズを修正できます。デフォルトでは、何も設定されていない場合、使用可能なRAMの量に基づいて値を取得します:



#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_TX_BUFFER_SIZE 16
#else
#define SERIAL_TX_BUFFER_SIZE 64
#endif
#endif
#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif


変更を加える



簡単ですよね?HardwareSerial.hをロードする前にシンボルを定義します。たわごと-このファイルはArduino.hにロードされます。SPはそれをプログラムに追加し、最初に起動させます。一部のバージョンのIDEは、再度有効にしないように、すでに有効になっているかどうかを確認したようですが、バージョン1.8.5では有効になりません。たぶん私はいくつかの設定をコンパイラに渡すことができますか?いいえ。少なくともIDEを介してではありません。



私はたくさんのことを試しました。もちろん、メインライブラリを変更したかっただけです。しかし、これは良くありません。後で、デフォルト設定が必要になる場合があります。ツールボックスを更新すると、すべての更新が失われます。私はこれを避けたかった。インターネット上の誰かが、プラットフォームファイルのコピーを作成して変更するようにアドバイスしました。完璧な解決策ではありません。



で仮定を確認する



HardwareSerial.cppに#ifステートメントと#errorステートメントを一時的に挿入していたため、実行していたことが機能していないことがわかりました。例えば:



#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif


これで、コンパイル時にエラー256がクラッシュした場合、サイズが設定されていることがわかります。そうでない場合、システムは私の変更に抵抗します。



トレードオフ:ボードレベルのメニューに設定を追加する



特定のプロジェクトでのみ設定を変更し、シリアルバッファのサイズを設定する方法を本当に考えたかったのです。私は成功しませんでした。しかし、私はなんとかMightyCoreからboards.txtを変更することができました。はい、更新によって編集内容が上書きされないようにする必要がありますが、それらは単純であり、ファイルに何かが不足している場合は明らかです。







明らかにこれは、IDEのメニューを作成したためです。このメニューは、ATMega32 for MightyCoreを使用している場合にのみ表示されます。メニューで、プリセットバッファサイズの1つを選択できます。



この結果を得るには、次の3つの手順を実行する必要があります。



  1. 新しいメニュー項目があることをIDEに伝え、それがどのように見えるかを説明します。
  2. 新しいアイテムはコンパイラ設定を変更する必要があります。
  3. 既存のシステムもコンパイラ設定を変更するため、破損しないようにする必要があります。


最初のステップは簡単です。私のboards.txtファイルは〜/ .arduino15 /パッケージ/ MightyCore /ハードウェア/ avr / 2.0.5 /boards.txtにありました。ほぼ一番上にメニュー項目のリストがあり、最後に私のものを追加しました:



# Menu options
menu.clock=Clock
menu.BOD=BOD
menu.LTO=Compiler LTO
menu.variant=Variant
menu.pinout=Pinout
menu.bootloader=Bootloader
menu.SerialBuf=Serial Port Buffers (RX/TX)


次に、行を下に移動し、ATMega32の既存のLTOセットアップの前にメニューを追加しました。



32.menu.SerialBuf.disabled=Default
32.menu.SerialBuf.disabled.compilerSB.c.extra_flags=
32.menu.SerialBuf.disabled.compilerSB.cpp.extra_flags=
 
32.menu.SerialBuf.SB64=64/64
32.menu.SerialBuf.SB64.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB64.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB128=128/128
32.menu.SerialBuf.SB128.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
32.menu.SerialBuf.SB128.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
 
32.menu.SerialBuf.SB12864=128/64
32.menu.SerialBuf.SB12864.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB12864.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB256=256/256
32.menu.SerialBuf.SB256.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
32.menu.SerialBuf.SB256.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
 
32.menu.SerialBuf.SB25664=256/64
32.menu.SerialBuf.SB25664.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB25664.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB25632=256/32
32.menu.SerialBuf.SB25632.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32
32.menu.SerialBuf.SB25632.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32


メニュー構成



32.menuオブジェクトが、特定のプロセッサのすべてのアイテムをグループ化していることがわかります。次はメニューキー(SerialBuf)です。この後に、メニュー項目ごとに固有のキーが続きます。それらを再利用しないことが重要です。たとえば、SB64キーが2つある場合、そのうちの1つだけが機能します。



このキーに等しい符号を割り当てると、このメニュー項目にテキストを割り当てることができます。たとえば、「デフォルト」または「64/64」。キーにプロパティを追加することもでき、アイテムがアクティブ化されたときに割り当てられます。



たとえば、256/256を選択した場合、コンパイラはcompilerSB.c.extra_flagsプロパティを設定します。なぜこのような名前を思いついたのか、少し後でわかります。



平和な共存



compilerSB.c.extra_flagsプロパティが存在しません。正しくは、compiler.c.extra_flagsと呼ばれます。ただし、Mighty CoreLTOセットアップは同じキーを使用します。したがって、新しいメニューが最初に表示され、偽のプロパティを設定することが重要でした。次に、LTOコードを修正する必要があります。



# Compiler link time optimization
32.menu.LTO.Os=LTO disabled
32.menu.LTO.Os.compiler.c.extra_flags={compilerSB.c.extra_flags}
32.menu.LTO.Os.compiler.c.elf.extra_flags=
32.menu.LTO.Os.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags}
32.menu.LTO.Os.ltoarcmd=avr-ar
 
32.menu.LTO.Os_flto=LTO enabled
32.menu.LTO.Os_flto.compiler.c.extra_flags={compilerSB.c.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.compiler.c.elf.extra_flags=-w -flto -g
32.menu.LTO.Os_flto.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.ltoarcmd=avr-gcc-ar


主な変更点は、フラグの各セットがプリセットメニューに追加されることです。これにより、すべてのフラグが正しいプロパティ、compiler.c.extra_flagsに追加されます。



すべてが正しく割り当てられるように、すべてのケースにエラートラップを構成しました。



あなた自身のためのカスタマイズ



もちろん、何か別のものが必要な場合は、オプションを変更できます。このトリックを使用して、Arduino.hファイルが制御を取得する前に他のパラメーターを設定することもできます。board.txtなど、さまざまなプラットフォームパラメータを構成する方法に関するドキュメントがあります。



同じ情報を使用して独自のboards.txtファイルを作成する方がよい場合もありますが、残りのMightyCoreを持っていく必要があります。代わりに、そのファイルのコピーをboards.txt.customという名前で保存しました。メニューが表示されなくなった場合は、その内容をboards.txtと比較して、何が変更されたかを確認します。



当然、IDEを使用する人々のサポートに関与する必要がない場合は、それを忘れることができます。いくつかの欠点はありますが、ProIDEを使用することをお勧めします。そうですね、いつでもPlatform.ioを参照できます。



参照:






All Articles