Saya mulai coding untuk Arduino baru-baru ini. Dan bug dalam kode ini membunuh saya. Karena tidak ada hardware debugger di Arduino, serial.print () adalah satu-satunya jalan saya. Apa metode / praktik yang Anda terapkan untuk debug kode Arduino?
10
Jawaban:
Modularitas adalah teman Anda. Tulis loop utama Anda untuk melakukan hal tersebut dengan memanggil fungsi, yang memanggil fungsi, ..., hingga tingkat di mana fungsi Anda menjadi sederhana. Mulai dengan loop utama dan level berikutnya ke bawah, buat fungsi rintisan; baik kosong:
atau palsu:
, itu tidak melakukan apa pun kecuali mengembalikan apa pun yang dibutuhkan tingkat panggilan untuk dapat melanjutkan. Ketika level itu bekerja, turunkan level dan mulai mengisi kode sederhana yang juga memanggil fungsi rintisan. Secara bertahap batalkan fungsi pada suatu waktu hingga Anda memiliki aplikasi yang berfungsi.
Untuk men-debug fungsi yang mengembalikan nilai buruk, atau untuk membuatnya tanpa pengaruh dari aplikasi Anda yang lain, Anda bisa membuat perancah - sketsa sederhana yang hanya memberi makan fungsi beberapa nilai contoh, dan di dalam fungsi tersebut, cetak nilai parameter dan beberapa nilai perantara, hingga Anda mendapatkan wawasan tentang bagian fungsi yang gagal. Saya bahkan membuat fungsi palsu yang meminta saya di terminal untuk mengembalikan nilai. (Jelas teknik ini hanya dapat bekerja jika sistem dapat mentolerir kecepatan relatif glasial kita manusia! Penggunaan lain untuk perancah.)
Stubbing bekerja dengan sangat baik untuk mendukung fungsi-fungsi yang berhubungan dengan perangkat keras, memungkinkan Anda mulai membuka aplikasi sebelum Anda harus menyelami lembar data, masalah waktu, dan hal-hal kecil lainnya (seperti, tidak memiliki bagian!) Yang mungkin terhenti kemajuan Anda.
Berbicara tentang masalah waktu, mengganti pin keluaran pada titik tertentu dalam program Anda, seperti masuk dan keluar dari ISR, memberi Anda gelombang persegi di pin Arduino yang frekuensi atau siklus kerjanya dapat memberi Anda wawasan tentang pengaturan waktu internal dari program Anda. Bentuk port-I / O langsung, misalnya,
, akan mengubah waktu kurang dari panggilan
digitalWrite()
. Berguna jika Anda memiliki ruang lingkup yang berguna, atau salah satu DMM dengan kemampuan untuk mengukur frekuensi dan / atau siklus tugas.Demikian pula, Anda dapat menggunakan pin keluaran analog untuk menampilkan nilai numerik ke meter Anda dari dalam program tanpa mengganggu timing terlalu banyak atau menggembungkan kode dengan fungsi I / O serial. Gunakan formulir I / O langsung di sini juga.
sumber
Saya menggunakan Serial.print () dan saya membuat LED flash.
Cukup banyak yang dapat Anda lakukan.
Juga, saya memastikan kodenya dapat dibaca dan mudah dimengerti. Hancurkan hal-hal menjadi langkah-langkah sederhana dan buat fungsi untuk setiap langkah, sehingga Anda dapat melihat urutan kejadian yang tepat.
sumber
3 Teknik Lainnya:
Bangun fungsionalitas suatu program dengan menguji secara perlahan pada setiap tahap, dengan cara itu Anda hanya menghadapi sekumpulan kecil bug pada suatu waktu.
Bangun program di sekitar penerjemah perintah sehingga Anda dapat bekerja dengan bagian pada waktu seperti di sini .
Denyut nadi pada waktu yang signifikan dan gunakan lingkup.
sumber
The Visual Micro plugin untuk Visual Studio menyediakan Arduino Debug . Termasuk jejak dan istirahat kode sumber juga memungkinkan ekspresi dan variabel untuk "diawasi" dan / atau dimodifikasi.
sumber
Pergi dari alat mewah seperti ARM atau platform lain (AVR, PIC dengan alat yang layak) Saya setuju bahwa fasilitas debug Arduino terlalu terbatas. Tetapi ini adalah alat pemula dengan entri rendah.
Serial.print () adalah teman Anda. Untuk proyek khusus saya (kuliah), saya tidak memasang LED, jadi Serial.print () itu. Jika saya ingin menguji apakah kode berjalan dengan benar melalui pernyataan, saya biasanya menempatkan Serial.print ("A"); , lalu pergi ke B, C, dll. atau sesuatu melalui bagian Saya sedang debugging. Saya membandingkan surat debug dengan apa yang saya harapkan seharusnya dilakukan.
Selain itu, tidak ada breakpoints atau kode loncatan. Arduino tidak lebih dari sebuah papan dengan chip atmega AVR, lingkungan pengembangan bootloader + dan banyak pustaka perangkat lunak. Sayangnya, bekerja dengan bootloader membatasi kemampuan debugging.
sumber
Untuk membuat penggunaan
serial.print
lebih terkontrol, Anda dapat menentukan variabel boolean global untuk mengaktifkan dan menonaktifkan debug. Setiap barisserial.print
akan dibungkus dalamif
pernyataan yang hanya akan dieksekusi jika flag debug dinyalakan. Dengan cara ini Anda dapat meninggalkan garis debug dalam kode bahkan ketika Anda selesai, tetapi pastikan untuk mengatur bendera debug ke OFF nanti.sumber
Lebih baik daripada langsung serial.print, gunakan macro. Contoh:
Gunakan seperti ini:
Anda mungkin memiliki tingkat jejak yang berbeda
(#ifdef TRACE2 ...)
dengan detail lebih lanjut.Dan Anda mungkin menggunakan makro "F"
(trace1(F("param1"));)
,. Makro "F" mencegah bahwa string akan menggunakan jumlah SRAM yang sangat terbatas.sumber
Berkedip LED, cetak hal-hal pada port serial, dan tulis dan debug bagian kecil kode sekaligus, kadang-kadang hanya beberapa baris.
Ada saat di mana Anda dapat memodulasi. Jika dalam C, misalnya, Anda dapat mengembangkan dan menguji fungsi perhitungan misalnya yang tidak menyentuh perangkat keras pada komputer host, prosesor lain, bungkus fungsi dengan bangku tes untuk memasukkan input dan memeriksa output, dll.
Cara lain yang serupa mungkin menggunakan simulator set instruksi jika Anda memiliki akses ke satu (jika tidak, itu adalah proyek yang sangat mendidik dan bermanfaat, setelah Anda melakukan beberapa dari mereka Anda dapat menggedor satu dalam satu atau dua akhir pekan). Bahkan lebih baik jika seseorang memiliki klon Verilog atau VHDL dari prosesor ( OpenCores misalnya) Anda dapat mencoba GHDL, Verilator , atau Icarus Verilog . Mungkin cukup dekat untuk memasukkan periferal yang Anda minati, dan Anda bisa mendapatkan visibilitas tingkat sinyal ke dalam apa yang terjadi di dalamnya.
Memang itu mungkin bukan tiruan yang sempurna, tapi itu mungkin cukup bagus. Verilator membuatnya sangat mudah untuk membuat periferal dalam C / C ++ sehingga Anda dapat mensimulasikan apa pun yang terhubung dengan perangkat AVR Anda.
Output UART dan LED berkedip dan / atau berkedip garis GPIO dan menggunakan osiloskop atau voltmeter. Kunci untuk tidak menjadi gila adalah menulis dan men-debug sebagian kecil kode. Saya lebih baik menulis 10 baris sekaligus dan melakukan 100 tes dari 1000 baris dan mencoba men-debug semuanya dalam satu kesempatan. Terutama ketika Anda mengetahui sebagian besar lembar data dan panduan referensi pemrogram untuk perangkat keras tidak selalu benar. Beberapa peretasan selalu diperlukan.
sumber