Operasi untuk meningkatkan buffer port serial dari Arduino IDE





Saya bukan penggemar berat infrastruktur Arduino. Ya, hari ini kami sudah memiliki lebih banyak opsi - misalnya, IDE pro dan Platform IO . Namun, saya selalu merasa mulas dari IDE asli. Dan saya menghargai sepenuhnya hanya sehari sebelumnya, ketika saya ingin melakukan sesuatu yang sangat sederhana: meningkatkan buffer penerimaan dari port serial ATmega32. Pada akhirnya, saya menemukan solusi yang dapat membantu Anda dengan masalah lain juga - jadi meskipun Anda tidak secara khusus membutuhkan fitur ini, Anda mungkin merasa terbantu untuk melihat apa yang sebenarnya saya lakukan.



Pengalaman ini memberi saya kesan ganda. Di satu sisi, saya membenci editor nondescript ini karena menyembunyikan terlalu banyak dari saya dan menyediakan sangat sedikit alat yang berguna. Di sisi lain, saya terkesan dengan betapa fleksibelnya ketika Anda menggali detail struktur internalnya.



Pertama, Anda mungkin bertanya mengapa saya menggunakan IDE. Singkatnya, saya tidak menggunakannya. Namun, jika Anda melakukan sesuatu yang akan digunakan orang lain, hampir tidak mungkin untuk diabaikan. Bagaimanapun Anda mengatur IDE Anda sendiri, segera setelah kode Anda online, seseorang akan mencoba menggunakannya dengan IDE. Saya pernah menulis tentang komputer berbasis $ 4 Z80 . Saya jarang punya waktu untuk membangun apa yang saya tulis, tetapi saya benar-benar ingin mencoba membangun komputer kecil ini. Untuk sementara, semuanya berada dalam keadaan setengah terbongkar, dan kemudian mereka mengirimi saya pembayaran untuknya. Saya menerimanya, dan - seperti yang mungkin sudah Anda duga - masih tergeletak setengah terbongkar. Tetapi akhirnya saya menemukan waktu untuk menyelesaikan proyek dan mengunduh CP / M.







Satu-satunya masalah dengan proyek ini adalah kurangnya pilihan yang baik untuk mentransfer data darinya ke PC dan sebaliknya. Sepertinya hal terbaik yang harus dilakukan adalah membuat file hex Intel dan menyalin / menempelkannya melalui terminal. Saya menginginkan sesuatu yang lebih baik, dan akibatnya saya berakhir di lubang kelinci pada Sabtu pagi. Akibatnya, saya menemukan cara untuk menambahkan item menu saya sendiri ke Arduino IDE untuk mengedit pengaturan kompiler tergantung pada perangkat keras yang digunakan dalam proyek. Trik ini layak dipelajari karena bisa berguna di luar tugas khusus ini.



Masalah: Batas ukuran buffer port serial Arduino



Saya tidak akan mengganggu Anda dengan detail tentang cara membuat papan berfungsi, karena Anda hanya akan tertarik jika memilikinya. Semua detail ada dalam pembahasan di Hackaday.io jika Anda benar-benar membutuhkannya. Akibatnya, buffer port serial Arduino tidak cukup besar untuk dianggap dapat diandalkan untuk transmisi melalui XModem. Semuanya tampaknya berfungsi dengan buffer 64-byte default, tetapi XModem mengirim lebih banyak data, dan mudah untuk membayangkan buffer meluap.



Seberapa sulit mengupdate buffer? Di sisi lain, ini adalah tugas yang sepele. Di sisi lain, ini sangat sulit, karena alat Anda berusaha sangat keras untuk membantu Anda.



Set alat



Proyek komputer kecil menggunakan chip Z80 asli dan ATMega32A untuk hampir semua fungsi tambahan. Ini menyediakan kecepatan jam, port serial, penyimpanan, dll. Namun, Arduino IDE tidak secara langsung mendukung ATMega32A, jadi Anda harus memasang kotak alat untuk melakukannya. Situasi itu membutuhkan MightyCore , jadi saya menggunakannya.



Pustaka port serial dikonfigurasi dengan pernyataan #define sehingga Anda dapat mengoreksi ukuran buffer. Secara default, jika tidak ada yang dikonfigurasi, Anda akan mendapatkan nilai berdasarkan jumlah RAM yang tersedia:



#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


Membuat perubahan



Sederhana, bukan? Tentukan simbol sebelum memuat HardwareSerial.h. Sial - file ini dimuat ke Arduino.h. SP ingin menambahkannya ke program Anda dan membuatnya booting terlebih dahulu. Tampaknya beberapa versi IDE memeriksa untuk melihat apakah Anda telah mengaktifkannya agar tidak dapat mengaktifkannya kembali, tetapi versi 1.8.5 tidak. Mungkin saya bisa memberikan beberapa pengaturan ke kompiler? Nggak. Setidaknya tidak melalui IDE.



Saya sudah mencoba banyak hal. Saya ingin, tentu saja, hanya mengubah perpustakaan utama. Tapi ini tidak bagus. Nanti, Anda mungkin memerlukan pengaturan default. Jika Anda memperbarui kotak alat, maka semua pembaruan akan hilang. Saya ingin menghindari ini. Seseorang di Internet menyarankan untuk membuat salinan file platform dan memodifikasinya. Bukan solusi yang sempurna.



Memeriksa asumsi dengan



Saya dapat melihat bahwa apa yang saya lakukan tidak berfungsi karena saya untuk sementara memasukkan pernyataan #if dan #error di HardwareSerial.cpp. Misalnya:



#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif


Sekarang, jika error 256 crash saat mengkompilasi, saya tahu ukurannya sudah disetel. Jika tidak, maka sistem menolak perubahan saya.



Pengorbanan: menambahkan pengaturan ke menu tingkat papan



Saya benar-benar ingin menemukan cara untuk mengubah pengaturan hanya dalam proyek tertentu, dan dengan demikian mengatur ukuran buffer serial. Saya tidak berhasil. Tapi saya berhasil mengubah boards.txt dari Mighty Core. Ya, saya harus memastikan bahwa pembaruan tidak menimpa hasil edit saya, tetapi sederhana, dan jika ada sesuatu yang hilang di file, itu akan terlihat jelas.







Jelas ini karena saya telah membuat menu untuk IDE, yang hanya muncul saat menggunakan ATMega32 untuk Mighty Core. Di menu, Anda dapat memilih salah satu ukuran buffer preset.



Untuk mencapai hasil ini, Anda perlu mengambil tiga langkah:



  1. Beri tahu IDE bahwa Anda memiliki item menu baru dan jelaskan tampilannya.
  2. Item baru harus mengubah pengaturan kompiler.
  3. Karena sistem yang ada juga mengubah pengaturan kompiler, Anda perlu memastikannya tidak rusak.


Langkah pertama mudah. File boards.txt saya berada di ~ / .arduino15 / packages / MightyCore / hardware / avr / 2.0.5 / boards.txt. Hampir di bagian paling atas ada daftar item menu, dan pada akhirnya saya menambahkan milik saya:



# 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)


Kemudian saya memindahkan baris ke bawah dan menambahkan menu saya di depan pengaturan LTO yang ada untuk ATMega32:



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


Struktur menu



Anda dapat melihat bahwa objek 32.menu mengelompokkan semua item bersama-sama untuk prosesor tertentu. Berikutnya adalah tombol menu kami (SerialBuf). Ini diikuti dengan kunci unik untuk setiap item menu. Penting untuk tidak menggunakannya kembali. Jika, misalnya, Anda memiliki dua kunci SB64, maka hanya satu yang akan berfungsi.



Jika Anda menetapkan tanda sama dengan untuk tombol ini, Anda dapat menetapkan teks ke item menu ini. Misalnya, "Default" atau "64/64". Anda juga dapat menambahkan properti ke kunci dan itu akan ditetapkan saat item diaktifkan.



Jika, misalnya, memilih 256/256, maka kompilator menyetel properti compilerSB.c.extra_flags. Mengapa saya memberikan nama seperti itu untuk properti itu, Anda akan mengerti nanti.



Hidup berdampingan secara damai



Properti compilerSB.c.extra_flags tidak ada. Benar, ini disebut compiler.c.extra_flags. Namun, penyiapan Mighty Core LTO menggunakan kunci yang sama. Oleh karena itu, penting agar menu baru muncul terlebih dahulu dan juga menetapkan properti palsu. Maka Anda perlu memperbaiki kode 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


Perubahan utamanya adalah setiap set flag ditambahkan ke menu preset. Ini menambahkan semua tanda ke properti yang benar, compiler.c.extra_flags.



Saya mengonfigurasi perangkap kesalahan untuk semua kasus untuk memastikan bahwa semuanya telah ditetapkan dengan benar.



Kustomisasi untuk diri Anda sendiri



Anda tentu saja dapat mengubah opsi jika Anda membutuhkan sesuatu yang berbeda. Anda juga dapat menggunakan trik ini untuk mengatur parameter lain sebelum file Arduino.h mendapatkan kendali. Ada dokumentasi tentang cara mengonfigurasi berbagai parameter platform, termasuk boards.txt.



Mungkin lebih baik membuat file boards.txt saya sendiri yang terpisah dengan informasi yang sama, tetapi kemudian saya harus membawa serta Mighty Core lainnya. Sebagai gantinya, saya hanya menyimpan salinan file ini sebagai boards.txt.custom, dan jika menu saya menghilang, saya akan membandingkan isinya dengan boards.txt untuk melihat apa yang berubah.



Secara alami, jika Anda tidak perlu berurusan dengan orang-orang pendukung yang menggunakan IDE, maka Anda bisa melupakannya. Lebih baik menggunakan Pro IDE, bahkan dengan beberapa kekurangannya. Nah, Anda selalu bisa merujuk ke Platform.io.



Lihat juga:






All Articles