Debugging kode Arduino (AVR). Bagian 1. Virtual debugging

Kata Pengantar


Seperti yang Anda ketahui, lingkungan Arduino (AVR) tidak mengandung fungsi debugging di dalam sirkuit, yang menciptakan ketidaknyamanan luar biasa dalam menemukan kesalahan kompleks dan memelihara proyek. Saya ingin menunjukkan dua cara dengan mana Anda dapat men-debug sketsa Anda dari tingkat kesulitan yang berbeda. Untuk metode pertama, Anda hanya perlu program, dan untuk yang kedua, Anda memerlukan adaptor yang murah (dibandingkan dengan debugger asli), yang bisa Anda rakit sendiri atau beli yang sudah jadi.
Secara umum, tidak ada yang baru bagi mereka yang menggunakan debugger terus-menerus, tetapi dapat bermanfaat bagi pengguna Arduino (AVR).

Bangun dengan Makefile


Sebelum kita sampai pada deskripsi debugging di perangkat keras (di bagian kedua) kita perlu melakukan beberapa pelatihan. Mungkin banyak orang tahu bahwa lingkungan Arduino memanggil kompiler avr-gcc dengan seluruh lingkungan, secara otomatis mengkonfigurasi parameter untuk memanggilnya dan memulai proses pembangunan. Jadi, kita perlu mengulangi proses ini secara eksplisit. Kami tidak akan melakukan ini secara manual, meskipun beberapa gerakan masih diperlukan. Ini diperlukan untuk mendapatkan file objek debug dalam format ELF. Lingkungan Arduino membersihkan setelahnya sendiri dan kami tidak memiliki akses ke opsi kompilator atau hasil kompilasi.

Ini membawa kita pada masalah penggunaan utilitas untuk secara otomatis membangun proyek avr-gcc, atau lebih tepatnya, sketsa dengan perpustakaan Arduino. Di sini orang bisa sedih, karena ini bukan masalah sederhana, tetapi seperti yang mereka katakan, semuanya sudah dilakukan sebelum kita. Ternyata github sudah memiliki semua yang Anda butuhkan untuk merakit sketsa dengan perpustakaan Arduino. Proyek ini disebut Arduino-Makefile . Karena tidak sulit menebak dari deskripsi, proyek ini berisi Makefile untuk membangun proyek secara otomatis di Arduino. Dari fitur yang tercantum dalam deskripsi, kami hanya akan memperhatikan beberapa.

Paket Arduino-Makefile adalah kumpulan file konfigurasi, contoh, dan deskripsi. Tidak ada utilitas yang harus menggunakan semua ini. Juga tidak ada lingkungan pengembangan, mis. perakitan dilakukan melalui baris perintah. Ini berarti bahwa Anda dapat mengencangkan setiap IDE yang sesuai untuk Anda, yang mendukung perakitan melalui Makefile. Saya biasanya menggunakan Visual Studio.

Jika Anda hati-hati melihat isinya, Anda akan melihat bahwa ada satu global Makefile universal (Arduino.mk), yang termasuk dalam file rakitan lokal tertentu. Anda hanya perlu menentukan pengaturan pribadi (minimum) untuk tujuan khusus perakitan, dan sisanya akan dilakukan dalam mode otomatis (variabel pengaturan, mencari dependensi, dll.). Ini sangat nyaman, seperti yang akan ditunjukkan di bawah ini.

Penting untuk dicatat bahwa file dengan berbagai ekstensi (* .ino, * .pde, * .c dan * .cpp) didukung. Faktanya adalah bahwa salah satu debugger akan menjadi AVR Studio 4. Ketika Anda memuat file debug ke dalamnya, sumber-sumber di pohon proyek akan terletak di folder yang berbeda: file cpp di sumber, dan sisanya di header. Jika kita meninggalkan ekstensi untuk sketsa (ino), file tidak akan masuk ke sumber dan penyorotan sintaks tidak akan menindaklanjutinya. Tidak mungkin melihatnya. Oleh karena itu, kami mencatat bahwa ekstensi untuk sketsa selama perakitan untuk debugging di AVR Studio perlu diubah ke standar (.c atau .cpp).

Toolkit


Kami mengetahui bahwa kami dapat mengumpulkan sketsa. Sekarang mari kita lihat bagaimana proses perakitan dan debugging akan diatur. Saya berjanji untuk menunjukkan dua cara. Masing-masing dari mereka memiliki pro dan kontra. Mari kita tinjau secara singkat.

Metode 1 . Kami membuat file debug, muat ke Proteus, debug di sana. Keuntungan: - relatif mudah untuk debugging (dengan koneksi monitor port serial, Anda hanya perlu menyiksa diri sendiri); - akses ke dunia luar melalui port serial; - Konstruksi grafik (alat ukur virtual tersedia); - kemampuan untuk mensimulasikan rangkaian secara real time;








- Di jendela terpisah, register mk, area memori, variabel global, dan kode sumber tersedia, tentu saja, termasuk versi assemblernya.

Kekurangan:
- Proteus berbayar;
- seperangkat periferal terbatas;
- model yang rumit tidak dapat memperhitungkan semua fitur dari komponen asli.

Metode 2 . Kami membuat file debug, muat ke dalam AVR Studio 4, debug dengan menggunakan plug-in Proteus VSM Viewer khusus untuk AVR Studio 4.



Kelebihan dan kekurangannya hampir sama dengan metode 1. Anda dapat menambahkan bahwa AVR Studio memperlihatkan pohon terperinci dari semua register mikron simulasi, hingga bit, yang sangat nyaman. Dari minus, perlu dicatat bahwa debug kode yang dioptimalkan memiliki karakteristik sendiri dan tidak begitu mudah untuk memahami bagaimana membuat debugger berhenti di tempat yang tepat.

Metode 3 . Kami membuat file debug, memuatnya ke AVR Studio 4, debug itu menggunakan emulator perangkat lunak mTII JTAG ICE dan adaptor khusus (HappyJTAG2). Keuntungan: - ini adalah debugging nyata dalam perangkat keras nyata menggunakan JTAG ICE mkII debugger (dukungan mic hingga ATmega2560); - HappyJTAG 2.45 berfungsi pada Windows 7 x64, Anda hanya perlu melewati satu jendela, di mana mereka meminta Anda untuk membeli driver.

 





Kekurangan:
- pengoperasian HappyJTAG2 yang tidak stabil dengan kode sumber yang kecil diperhatikan;
- pekerjaan AVR Studio yang tidak stabil saat melakukan operasi debugging;
- penulis HappyJTAG2 telah lama meninggalkan gagasannya (tampaknya dengan munculnya AVR Studio 5 dan Atmel Studio);
- beberapa fitur koneksi (COM4 atau salah satu dari 4 port serial pertama harus bebas atau tidak ada, karena AVR Studio melakukan iterasi melalui COM1-COM4 untuk mencari debugger). Hal ini gratis atau tidak ada karena HappyJTAG2 berfungsi, demikian, dari dalam.

Seperti yang dapat Anda lihat, saya menunjukkan tiga cara, tetapi saat ini, hanya dua dari mereka yang secara praktis menghasilkan saya. Metode pertama akan dijelaskan dalam artikel ini. Sayangnya, saya tidak dapat mengulangi metode kedua. Anda perlu menemukan kombinasi "kompatibel" dari Proteus dan AVR Studio. AVR Studio 4.19.730 dan Proteus 7.7 SP2 terbaru digunakan dalam gambar. Sekali waktu saya menggunakan metode ini, tetapi di hadapan seorang debugger besi, menggunakannya tidak masuk akal. Saya meninggalkan metode ketiga untuk bagian kedua. Di sana Anda akan memerlukan adaptor dan deskripsi koneksinya ke papan Arduino yang mendukung debug JTAG.

Dan apa yang kita butuhkan untuk seluruh dapur ini? Pertama, Anda perlu melupakan tentang Arduino IDE yang celaka, itu hanya dapat digunakan untuk pemeriksaan kontrol saat menyusun sketsa. Selanjutnya, kita akan membutuhkan:

-Arduino-Makefile - satu set file konfigurasi untuk perakitan manual proyek di Arduino;
- Editor dengan highlight sintaksis C ++ dan kemampuan untuk mengeksekusi perintah eksternal ( Notepad ++ , VS20xx, Far, ...);
- Proteus 7.x - simulator sirkuit campuran (analog-digital) yang terkenal;
- program terminal ( PutTY , ZOC Pro), yang akan menjadi analog dari monitor;
- Program yang membuat port serial virtual null-modem (VSPD, ...);
- Arduino IDE 1.6.x (kita membutuhkan librari dan kompiler avr-gcc);
- WinAVR (kita perlu binutils dari setnya, ini adalah seperangkat perintah unix untuk Windows);
- avr gcc 4.9.2(kompiler lebih segar jika Anda tidak ingin menggunakan yang datang dengan IDE Arduino);
- AVR Studio 4.19.730 - versi terbaru dari lingkungan pengembangan dari Atmel sebelum beralih ke Visual Studio (hanya diperlukan untuk bagian kedua);
- HappyJTAG 2.45 (hanya diperlukan untuk bagian kedua).

Kami akan menganggap bahwa Anda tahu cara bertanya kepada Google di mana mendapatkan seluruh peternakan ini. Untuk berjaga-jaga, saya akan memberikan tautan yang bermanfaat di akhir artikel. Beberapa komentar tentang toolkit.

Seperti yang Anda tahu, Proteus dibayar, tetapi ini bukan hal yang paling menyedihkan. Sayangnya, perpustakaannya tidak begitu dekat dengan dunia nyata seperti yang kita inginkan. Misalnya, Anda tidak dapat memodelkan Ethernet shield W5100 di dalamnya (setidaknya dalam versi 7.x). Oleh karena itu, pengikut Arduino yang terkasih, lakukan jalan yang benar. Hanya debugging dan hanya di perangkat keras yang akan menyelamatkan jiwa Anda dari pertanyaan yang diajukan secara tidak benar. Kami akan menggunakan Proteus sebagai alat pelatihan, dan di lapangan - hanya JTAG.

Debugging Arduino Sketches (AVR) di Proteus 7.x


Cukup untuk kata-kata umum, sekarang spesifik. Ada banyak opsi untuk memulai proses perakitan, Anda tidak dapat menuliskan semuanya, jadi saya akan fokus hanya pada satu dan mencoba menggambarkannya dengan jelas. Melihat skema umum, Anda dapat menerapkannya pada perangkat pengembangan Anda. Untuk kenyamanan, saya akan memecah deskripsi seluruh proses dalam langkah-langkah, beberapa dapat dilewati. Saya berharap bahwa pengguna Arduino yang paling tidak berpengalaman pun akan mengerti tentang apa ini.

Langkah 1 . Unduhdan instal lingkungan pengembangan Arduino. Untuk jelasnya, mari kita asumsikan bahwa itu akan berasal dari seri 1.6.x. Di sini saya akan segera membuat beberapa komentar. Secara umum, kita hanya perlu perpustakaan dari Arduino. Terlepas dari segala sesuatu yang lain, gagasan tentang bentuk sederhana dari program ini sangat baik (jika Anda membandingkan C # dan C ++ atau, Tuhan melarang, C ++ / CLI, maka ini adalah surga dan bumi). Kurangnya alat debugging yang normal menyebabkan, terus terang, untuk pemrograman yang buta huruf. Alih-alih secara sadar mengubah algoritma yang dipahami menjadi kode program, pengguna Arduino dipaksa untuk membuat kombinasi mantra sihir, menyaring informasi melalui Serial.print (), dan hanya beberapa yang mencoba membaca sumber perpustakaan secara statis. Sulit untuk melihat semuanya.

Saya terganggu, dan Anda mungkin berhasil menempatkan lingkungan dengan cara standar. Dianjurkan agar folder Arduino berada di root partisi (C: \ Arduino). Hal ini disebabkan oleh path makefile yang tidak suka spasi di File Program. Nanti kita akan mengkonfigurasi path untuk mereka yang sudah memiliki folder di "Program Files" dan harus melakukan satu hal yang sulit bagi pengguna Windows - titik persimpangan pada folder. Mungkin ruang bisa diloloskan, tetapi saya belum mencoba ini.

Untuk kepastian, katakanlah bahwa jalan ke lingkungan adalah: C: \ Program Files \ Arduino.

Langkah 2 . Unduhdan membongkar Arduino-Makefile. Bongkar isi folder Arduino-Makefile-master ke C: \ Arduino-Makefile. Saya ingin segera mencatat bahwa di dalam ada file README.md, yang lebih baik untuk melihat github, di mana banyak hal dijelaskan. Anda juga harus mencatat file arduino-mk-vars.md, yang berisi deskripsi variabel yang digunakan dalam makefile pengguna (proyek).

Agar utilitas utilitas berfungsi, Anda memerlukan kit utilitas gnu bin, yang merupakan bagian dari WinAVRpada waktunya. Saya tidak tahu apakah ada situs resmi untuk merakit utilitas yang sama ini untuk Windows, tetapi Anda dapat melakukan hal berikut. Anda perlu mengunduh WinAVR lama yang bagus dari versi terbaru dan mengeluarkan folder utils darinya, di mana utilitas perintah berada. Anda dapat menginstal, menyalin folder dan menghapus WinAVR (karena termasuk kompiler avr-gcc lama, yang tidak kita perlukan).

Selanjutnya, misalnya, buat folder c: \ avr-gcc dan salin utils ke sana. Setelah itu, tambahkan path C: \ avr-gcc \ utils \ bin ke variabel PATH (melalui properti Computer): Path harus menjadi yang pertama dalam pencarian. Jangan lupakan perubahan ini, karena ini dapat mempengaruhi program lain jika Anda menggunakan lingkungan pengembangan serupa lainnya . Langkah 3

set PATH=C:\avr-gcc\utils\bin;%PATH%



. Anda sendiri tahu dari mana Anda mendapatkan / membeli Proteus [7.2 - 7.8]. Mengapa tepatnya seri ini dan interval versi seperti itu? Karena saya mencobanya dan tampaknya pada proyek-proyek sederhana, mereka cukup bagus. Versi di atas 7.8 tidak dapat memuat file objek dari salah satu proyek saya di IAR, dan di bawah ini saya tidak mencoba. Delapan hanya kereta untuk saat ini, mungkin kemudian seseorang akan menulis sesuatu tentangnya. Di sini kita akan mengambil secara khusus Proteus 7.8 SP2.

Langkah 4 . Menggunakan artikel , buat titik persimpangan pada folder dengan lingkungan Arduino yang diinstal, mis. C: \ Arduino harus referensi C: \ Program Files \ Arduino. Ini perlu agar tidak lebih bijak dengan dukungan ruang di makefile. Jadi, tanpa menyalin folder dengan Arduino, kami mendapat salinannya di tempat yang tepat. Siapa yang menggunakan Jauh dapat menggunakan kombinasi Alt + F6 pada folder.

Kami mengubah pengaturan lingkungan Arduino. Path ke folder dengan sketsa: C: \ Arduino-Makefile \ contoh. Jika Anda menggunakan editor eksternal (Notepd ++, ...), maka Anda dapat memeriksa pengaturannya. Pada saat yang sama, ketika jendela diaktifkan, Arduino akan memperbarui konten editornya secara otomatis. Kami memilih papan Arduino Mega 2560 dan prosesor ATmega2560 (sebenarnya, tidak begitu penting apa yang harus dipilih di sini, yang terpenting adalah memutuskan pengontrol yang digunakan).

Kami menulis contoh program untuk menguji perakitan dari lingkungan Arduino, menyebutnya sebagai Contoh1 dan menyimpannya di folder sketsa: Kompilasi dan verifikasi bahwa perakitan lolos. Di Arduino 1.6.7, objek file linker (ld.exe) mengalami kesalahan, saya menggantinya dengan yang lain (misalnya, dari perakitan ini ). Langkah 5

void setup()
{
DDRD |= ( 1 << DDD2 );
}

void loop()
{
PIND |= ( 1 << PIND2 );
}



. Salin file C: \ Arduino-Makefile \ contoh \ WebServer \ Makefile ke folder dengan sketsa kami: C: \ Arduino-Makefile \amples \ Example1. Kami memperbaiki isinya sebagai berikut:

Makefile
# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile

# Suppress printing of Arduino-Makefile configuration.
#ARDUINO_QUIET = 1

# Directory where the Arduino IDE and/or core files are stored. Usually can be auto-detected as `AUTO_ARDUINO_DIR`.
ARDUINO_DIR = ../../../Arduino

# Directory where tools such as `avrdude`, `avr-g++`, `avr-gcc`, etc. are stored in the `bin/` subdirectory.
AVR_TOOLS_DIR = ../../../Arduino/hardware/tools/avr

# Directory where the `*.mk` files are stored.
# Usually can be auto-detected as parent of `Arduino.mk`.
ARDMK_DIR = ../../../Arduino-Makefile

# Device type as listed in `boards.txt` or `make show_boards`.
BOARD_TAG = mega

# Microcontroller model.
# Usually can be auto-detected as `build.mcu` from `boards.txt`
MCU = atmega2560

#CPU speed in Hz
#Usually can be auto-detected as `build.f_cpu` from `boards.txt`, except in
#some 1.5+ cores like attiny where there is a clock submenu.
#F_CPU = 16000000L

# What name you would like for generated target files.
# Defaults to the name of your current working directory, but with underscores (_) instead of spaces.
#TARGET = project

# Baudrate of the serial monitor.
# Defaults to `9600` if it can't find it in the sketch `Serial.begin()`
MONITOR_BAUDRATE = 9600

DEBUG = 1

DEBUG_FLAGS = -O1 -gdwarf-2 -gstrict-dwarf

include ../../Arduino.mk

Kami menyisipkan di awal sumber kami sebuah garis yang secara eksplisit menghubungkan Arduino.h (ini tidak perlu jika ada dependensi pustaka yang ditunjukkan dalam variabel ARDUINO_LIBS): Jangan lupa untuk menyimpan sumber dan Makefile. Selanjutnya, berada di folder Example1, kita masukkan perintah make (menggunakan konsol atau di Far, atau dengan cara lain yang mudah), sebuah footcloth besar akan muncul, mirip dengan yang ditampilkan di IDE Arduino ketika Anda menghidupkan output informasi lengkap tentang proses build. Ini adalah jika semuanya dilakukan dengan benar, jika ada sesuatu yang tidak berfungsi, maka pertama-tama cobalah untuk memahami secara mandiri apa yang salah, dan kemudian menulis komentar pada artikel.

#include "Arduino.h"

void setup()
{
DDRD |= ( 1 << DDD2 );
}

void loop()
{
PIND |= ( 1 << PIND2 );
}



Karena kami mengomentari baris ARDUINO_QUIET = 1 di Makefile, ada header dengan nilai-nilai variabel Makefile itu sendiri sebelum informasi perakitan. Beberapa dari mereka ditentukan, sementara yang lain dihitung saat mereka maju. Ini membantu menemukan kesalahan saat mengedit Makefile proyek.

Awal kaki
-------------------------
Arduino.mk Configuration:
- [AUTODETECTED] CURRENT_OS = WINDOWS
- [USER] ARDUINO_DIR = ../../../Arduino
Usage: egrep [OPTION]... PATTERN [FILE]...
Try `egrep --help' for more information.
- [USER] ARDMK_DIR = ../../../Arduino-Makefile
- [AUTODETECTED] ARDUINO_VERSION = 167
- [DEFAULT] ARCHITECTURE = avr
- [DEFAULT] ARDMK_VENDOR = arduino
- [DEFAULT] ARDUINO_SKETCHBOOK =
- [USER] AVR_TOOLS_DIR = ../../../Arduino/hardware/tools/avr
- [COMPUTED] ARDUINO_LIB_PATH = ../../../Arduino/libraries (from ARDUINO_DIR)
- [COMPUTED] ARDUINO_PLATFORM_LIB_PATH = ../../../Arduino/hardware/arduino/avr/libraries (from ARDUINO_DIR)
- [COMPUTED] ARDUINO_VAR_PATH = ../../../Arduino/hardware/arduino/avr/variants (from ARDUINO_DIR)
- [COMPUTED] BOARDS_TXT = ../../../Arduino/hardware/arduino/avr/boards.txt (from ARDUINO_DIR)
- [DEFAULT] USER_LIB_PATH = /libraries (in user sketchbook)
- [DEFAULT] PRE_BUILD_HOOK = pre-build-hook.sh
- [USER] BOARD_TAG = mega
- [COMPUTED] CORE = arduino (from build.core)
- [COMPUTED] VARIANT = mega (from build.variant)
- [COMPUTED] OBJDIR = build-mega (from BOARD_TAG)
- [COMPUTED] ARDUINO_CORE_PATH = ../../../Arduino/hardware/arduino/avr/cores/arduino (from ARDUINO_DIR, BOARD_TAG and boards.txt)
- [USER] MONITOR_BAUDRATE = 9600
- [DEFAULT] OPTIMIZATION_LEVEL = s
- [DEFAULT] MCU_FLAG_NAME = mmcu
- [DEFAULT] CFLAGS_STD =
- [DEFAULT] CXXFLAGS_STD =
- [AUTODETECTED] DEVICE_PATH =
- [DEFAULT] FORCE_MONITOR_PORT =
- [AUTODETECTED] Size utility: AVR-aware for enhanced output
- [COMPUTED] BOOTLOADER_PARENT = ../../../Arduino/hardware/arduino/avr/bootloaders (from ARDUINO_DIR)
- [COMPUTED] ARDMK_VERSION = 1.5
- [COMPUTED] CC_VERSION = 4.8.1 (avr-gcc)
-------------------------
mkdir -p build-mega


Kami berasumsi bahwa semuanya berjalan dengan baik, maka Anda harus memiliki ayah mega-bangunan, di mana Contoh1 kita yang lama ditunggu-tunggu. Diri adalah file yang paling tepat untuk semua tindakan dimulai. Dengan file ini, kita akan "mencuci otak" mik virtual dalam Proteus dan menyembuhkan ... dengan tingkat kebebasan lain.

Langkah 6 . Kembali ke Proteus. Buat proyek baru (file dsn) di folder sumber . Kami mengeluarkan komponen - mikrokontroler ATmega2560 dari perut perpustakaan dan memasukkannya ke tempat yang cocok, itu sangat menyakitkan. Isi properti komponen dalam gambar. Memasang COMPIM belum perlu, itu akan diperlukan untuk bekerja dengan monitor. Kemudian kita masuk ke mode debug Debug \ Start / Restart Debugging. Dapatkan gambar yang terlihat seperti ini.







Nah, dan kemudian, itu semua tergantung pada imajinasi Anda. Tidak hanya Example1.ino, tetapi juga sumber dependen lainnya akan tersedia di jendela sumber. Anda dapat membuka kode assembler, register prosesor, memori, dan yang lainnya. Baca dok di Proteus.

Langkah 7 . Anda perlu memasang monitor. Untuk menulis kemalasan, saya berharap melakukannya sendiri. Singkatnya, artinya adalah ini. Anda membuat dua port serial virtual yang dihubungkan oleh modem null (lebih disukai dengan angka lebih besar dari COM4). Anda meresepkan satu dalam komponen COMPIM Proteus, dan yang kedua dalam program terminal (Putty). Jangan lupa untuk memperbaiki kecepatan dan penyandian keluaran dalam program terminal, secara teori seharusnya bertepatan dengan penyandian file sumber, jika Anda ingin membuat keluaran ke monitor dalam bahasa Rusia.

Langkah 8 . Jika ingin digunakanavr gcc 4.9.2 , Anda perlu meletakkan konten arsip di root disk dan memperbaiki jalur di variabel AVR_TOOLS_DIR. Hanya di sana, ukuran avr tidak bekerja untuk saya, tampaknya. Anda dapat mengubahnya ke yang datang dengan WinAVR (atau Arduino).

By the way, bahwa ukuran output dalam bentuk kebutuhan yang normal untuk menambahkan opsi untuk panggilan avr-size (file Arduino.mk): Link bermanfaat : 1. Arduino IDE 1.6.x . 2. Arduino-Makefile . 3. WinAVR . 4. AVR yang gcc 4.9.2 . 5. Tautan keras, dll. Di Windows . 6. Putty . 7. Notepad ++ .

avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1)










Source: https://habr.com/ru/post/id390427/


All Articles