Bagaimana cara men-debug sketsa Arduino?

10

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?

0xakhil
sumber
silakan lihat playground.arduino.cc/Main/DevelopmentTools untuk alat IDE dan debugger
Dallo

Jawaban:

8

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:

function foo(){
    ;
}

atau palsu:

function read_temperature(){
    return(95);
}

, 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,

PORTC ^= 0x01;

, 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.

JRobert
sumber
6

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.

Majenko
sumber
5

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.

russ_hensel
sumber
3

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.

masukkan deskripsi gambar di sini

Visual Mikro
sumber
1
Perhatikan bahwa ini dilakukan melalui cetakan serial yang dibuat secara otomatis dan dimasukkan ke dalam kode Anda.
per1234
Itu benar kecuali cetakan dan cetakan serial atau wifi dimasukkan ke dalam temp temp copy dari kode bukan kode sebenarnya! Semuanya dijelaskan dengan jelas dalam dokumen visualmicro.com dan untuk beberapa yang memiliki hardware debugger (tidak biasanya untuk Uno dll) mereka juga didukung. Setiap metode memiliki kelebihan dan kekurangannya sendiri.
Visual Micro
Dari Debugger untuk Arduino : "Itu tidak mendukung melangkah melalui kode dan itu didasarkan pada kode tersembunyi yang dimasukkan ke dalam program Anda sebelum membangun untuk berkomunikasi dengan debugger."
Peter Mortensen
Betul. Ini menghindari kebutuhan pengguna untuk menambahkan cetakan serial, memungkinkan vars yang diperbarui diperbarui sementara cpu berjalan, menunjukkan grafik dan pin digital dll. Ini berbeda dari hardware debugger tetapi cepat dan mudah dan memiliki manfaat lain. Ini semua didokumentasikan dengan baik di visualmicro.com jadi silakan baca. Jika Anda naik mendukung gdb atau Anda menggunakan atmel studio ada tentu saja opsi debug lainnya. Itu semua tergantung pada keahlian Anda dan perangkat keras apa yang Anda miliki. Jika Anda memiliki Arduino asli, di Atmel studio Anda dapat menggabungkan arduino dengan atmel debug atau sim.
Visual Micro
2

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.

Hans
sumber
0

Untuk membuat penggunaan serial.printlebih terkontrol, Anda dapat menentukan variabel boolean global untuk mengaktifkan dan menonaktifkan debug. Setiap baris serial.printakan dibungkus dalam ifpernyataan 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.

Temberang
sumber
0

Lebih baik daripada langsung serial.print, gunakan macro. Contoh:

#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif

Gunakan seperti ini:

function doIt(param1, param2) {
    trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");

    ...

    traceln1("<-doIt");
}

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.

Mangar
sumber
0

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.

old_timer
sumber