Arduino IDE: mengapa sketsa tidak dikompilasi (dan bagaimana cara menghindarinya)

gambar

Karena saya gencar mengembangkan di Arduino IDE, pertanyaan ini sangat mengkhawatirkan saya. Mengapa sketsa yang ditulis dalam satu versi lingkungan pengembangan menolak dikompilasi dalam versi tetangga? Pengguna Arduino Mega Server membuat saya kewalahan dengan pertanyaan yang sama . Mengapa AMC mengkompilasi dalam 1.6.5 dan menolak untuk mengkompilasi dalam 1.6.4, 1.6.7 dan 1.6.8?

Dan baru-baru ini, dalam proses porting Server Arduino Mega ke pengendali Genuino 101 yang baru, saya dapat memecahkan misteri besar ini. Dan dalam artikel ini saya akan membagikan pengetahuan suci ini dengan Anda dan sketsa Anda setelah itu akan selalu berhasil dikompilasi. Jadi ...

Logika sesuatu


Secara logis, kode yang berhasil dikompilasi dalam versi lingkungan pengembangan, misalnya, 1.6.5, harus dikompilasi dalam versi IDE yang berdekatan, karena versi ini hanya berbeda dalam karakter ketiga dan hampir sama, dengan modifikasi kecil . Tetapi ini tidak terjadi. Mengapa

Dapur domestik


Untuk memahami hal ini, Anda perlu memahami bagaimana versi lingkungan pengembangan IDE Arduino terbentuk dan bagaimana pengguna bekerja dengan lingkungan pengembangan ini.

Mari kita mulai dengan para pengguna. Sebagian besar dari mereka mengkompilasi proyek primitif, secara kiasan, dalam 20 baris dan tidak ada masalah dengan proyek ini. Proyek-proyek ini berhasil dikompilasi dalam versi IDE apa pun karena mereka hanya menggunakan panggilan fungsi pustaka standar dan tidak memodifikasi pustaka itu sendiri.

Tetapi proyek yang agak berkembang di Arduino tidak lagi sesuai dengan β€œ20 baris” dan mau tidak mau menggunakan fungsi yang kurang umum dari perpustakaan (yang lebih rentan terhadap modifikasi dari versi ke versi) dan mau tidak mau harus memodifikasi perpustakaan sendiri untuk kebutuhan spesifik mereka dari proyek.

Dan begitu Anda memodifikasi pustaka sistem, Anda menjadi sandera dan dipaksa untuk "menyeretnya" dari versi ke versi.

Sekarang mari kita lihat bagaimana versi-versi IDE Arduino terbentuk. Dan mereka dibentuk secara sewenang-wenang (saya curiga pada akhirnya, satu programmer khusus, beberapa Mario) dari tim penerbit. Dan versi perpustakaan tertentu apa yang akan dimasukkan dalam kit distribusi dan dalam bentuk apa (dengan modifikasi apa) tetap berada di hati nurani "Mario" ini.

Dan sekarang perhatian, ini sangat penting! Tim penerbit hanya memiliki satu tujuan - bahwa distribusi satu versi disetujui bersama dan konsisten di dalam dirinya sendiri. Tugas mereka adalah memastikan bahwa semua contoh standar berfungsi dengan benar. Dan itu saja! Tugas kompatibilitas antar versi tidak diajukan sama sekali.

Dan karena 99% pengguna mengkompilasi proyek dalam "20 baris", pendekatan ini sempurna "bergulir" dalam praktiknya. Dan fakta bahwa setiap proyek serius tidak dikompilasi adalah masalah dari proyek-proyek ini. Alhamdulillah, mekanisme untuk terjadinya masalah sekarang jelas, dan sekarang sudah menjadi jelas bagaimana menangani ini.

Contoh nyata


gambar

Mari kita ingat porting AMS ke Genuino 101 (ini bekerja mulai dari versi 1.6.7 dan lebih tinggi). Di sini, tim Arduino menyimpan lelucon lain untuk kita (orang baik, mereka tidak membiarkan kita santai).

Upaya mengkompilasi proyek untuk kontroler baru menyebabkan banyak kesalahan kompiler. Analisis pesan menunjukkan bahwa kompiler sangat tidak menyukai perpustakaan Ethernet kami. Kenapa dia tidak menyenangkan kompilator?

Kami mulai mengerti.

Perpustakaan kami: versi = 1.0.4 (tidak suka kompiler)
Perpustakaan dari IDE 1.6.7: versi = 1.0.4 (seperti kompiler)

Namun.

Perpustakaan kami: 31 file (tidak suka kompiler)
Pustaka dari IDE 1.6.7: 31 file (seperti kompiler)

Namun.

Perpustakaan kami: 123 KB (tidak suka kompiler)
Perpustakaan dari IDE 1.6.7: 123 KB (seperti kompiler)

Namun.

Dengan kata lain, Mario β€œmentok” pustaka IDE 1.6.7 Ethernet dengan nomor versi yang sama seperti pada IDE 1.6.5, jumlah file yang sama dan ukuran yang sama, tetapi dengan ISI YANG BERBEDA dan lupa peringatkan kami tentang ini. Dan ini adalah "konten yang paling berbeda", seperti laba-laba yang menggunakan IDE-nya dan perpustakaan tingkat rendah lainnya (juga dimodifikasi pada 1.6.7).

Bravo, Mario! Dengan pendekatan ini, tidak ada yang akan dikompilasi kecuali untuk contoh standar dan sketsa 20-line.

Solusi praktis (teka-teki dari Arduino)


Sekarang mekanisme mengapa proyek tidak dikompilasi dalam versi yang berbeda dari IDE Arduino telah menjadi sangat jelas dan, karenanya, cara untuk menyelesaikan masalah ini menjadi sangat jelas. Dalam kasus khusus ini, solusinya terdiri dari tiga bagian.

  • Bagian Satu Menemukan perpustakaan yang berfungsi. Ingat, tugas tim penerbit untuk membuat versi IDE yang konsisten? Jadi di suatu tempat harus ada versi perpustakaan yang berfungsi yang kita butuhkan.
  • Bagian Dua Mentransfer perpustakaan Ethernet yang berfungsi dari Mario kecil yang nakal ke tempatnya di proyek Arduino Mega Server. Tidak ada yang rumit di sini - cukup salin ke tempat perpustakaan kami yang tidak berfungsi di IDE 1.6.7 Ethernet.
  • Bagian tiga. Modifikasi untuk proyek Arduino Mega Server dari pustaka porting dan jelas bekerja di IDE 1.6.7 Ethernet.

Hal yang sama perlu dilakukan dengan semua pustaka proyek yang tidak dikompilasi (yaitu, temukan versi pustaka yang berfungsi dari IDE dan transfer ke tempatnya di proyek dan modifikasi jika perlu). Tetapi dalam kasus ini, kami beruntung, semua perpustakaan lain bekerja dengan baik (karena Mario tidak berhasil memodifikasinya secara diam-diam, meskipun ia bisa dan pasti akan melakukan ini dalam versi IDE yang baru, tetapi kami sudah tahu bagaimana cara menghadapinya).

Kesimpulan


Itulah rahasia sukses bekerja di Arduino IDE dengan proyek-proyek kompleks. Sekarang Anda dapat merasa dipersenjatai sepenuhnya dan tidak akan sulit bagi Anda untuk membuat proyek Anda berhasil dalam versi apa pun dari Arduino IDE.

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


All Articles