Saya ingin membuat sketsa yang sekecil mungkin, untuk keperluan pengujian. Masalahnya adalah, ketika saya mengkompilasi sketsa BareMinimum (dengan setup dan loop kosong), saya mendapatkan 466 byte untuk Uno dan 4.242 kekalahan untuk Leonardo. Apakah ada cara untuk menulis kode Anda sendiri yang tidak memiliki fungsi tambahan (yaitu Timer0 untuk millis()
dan delay()
). Saya juga ingin dapat menonaktifkan fungsi keyboard / mouse untuk Leonardo.
programming
sketch
arduino-leonardo
Dokter
sumber
sumber
Jawaban:
Anda harus dapat membuat definisi papan Anda sendiri dengan file boards.txt khusus sesuai https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification . Seperti yang saya lihat ada beberapa fitur usb dalam definisi leonardo. Saya berharap bahwa kompilasi inklusi 4K didasarkan dari flag-flag ini dan bukan tipe prosesor.
Di mana boards.txt akan menggunakan bagian unggahan, bootloader dari Leonardo dan build dari uno.
Ini semua dengan asumsi pustaka inti tidak menggunakan flag spesifik prosesor untuk menyertakan fungsi USB.
Jika Anda mendapatkan pekerjaan seperti itu. posting kembali, saya yakin orang lain akan tertarik seperti itu.
Saya baru-baru ini mengalami keterbatasan 4K yang digunakan pada demo perpustakaan yang benar-benar memaksimalkan UNO dan harus memasukkan
sekitar sejumlah besar fitur tambahan di sketsa agar sesuai pada Leonardo.
Saya telah berasumsi (salah) bahwa 4K ini adalah karena saya masih menyertakan Serial.print yang ketika melalui CDC USB pada Leo. Tapi saya melihat setelah memori dump dari sketsa kosong mereka masih ada di sana.
Itu masuk akal. Karena Leonardo masih memerlukan klien USB-CDC (4K) untuk mendeteksi sambungan 1200 Baud dari AVR-DUDE untuk menggerakkan reboot jarak jauh.
Karenanya membuat custom boards.txt tanpa USB di build, juga perlu dimiliki
dihapus.
Setelah dimuat pada target, ini akan membutuhkan unggahan untuk disinkronkan dengan reset manual target. Karena kemampuan untuk reboot jarak jauh hilang.
sumber
Saya baru-baru ini ingin melakukan ini. Karena tidak ada cara yang baik untuk melakukannya, saya akhirnya menulis sebuah tambalan untuk Stino luhur-teks Arduino plugin untuk melakukan hal ini. Ini kemudian diterima, jadi itu harus dalam pemasangan Stino terbaru.
Ini menambahkan opsi baru ke Stino:
Menggunakan mode ini menghasilkan hasil kompilasi seperti berikut:
Untuk Uno:
Untuk seorang leonardo
Sebenarnya pemrograman leonardo dengan output yang dikompilasi di atas mungkin merupakan ide yang buruk, karena mungkin merusak fungsi reset otomatis, tetapi Anda bisa , jika Anda mau. Hat-tip untuk mpflaga karena mencatat ini dalam jawabannya.
Perhatikan bahwa laporan memori sebenarnya salah, tapi itu masalah terpisah .
Kode yang digunakan untuk di atas adalah:
Beberapa catatan:
milis()
atau serupa.#include <Arduino.h>
.main
. Anda tidak pernah kembalimain
. Jika Anda ingin mengatur barang, itu berjalan sebelumwhile (1)
.sumber
Meskipun tergantung pada sketsa Anda, Anda dapat mengurangi ukurannya dengan menggunakan kembali kode dengan metode.
Ambil kode ini:
1.322 byte pada Arduino Uno. Sekarang mari kita mengecilkannya sedikit:
1.194 byte. Itu tentang penurunan 10%!
Bagaimanapun juga, meskipun sketsa itu tidak terlalu menyusut, kadang-kadang bisa menjadi rute termudah ketika Anda dua byte melebihi batas, atau hanya ingin membuat sketsa yang lebih ringkas untuk memulai tanpa kehilangan fungsionalitas apa pun. Ini tidak untuk setiap situasi, tetapi saya kadang-kadang merasa berguna.
sumber
@annonomus penguin, pasti kita bisa. Walaupun kode mengkompilasi menjadi 1180 byte flash + 13 byte RAM untuk uno di komputer saya, kami dapat meningkatkannya :) jadi tantangan golf diterima dan juga beberapa tips bermanfaat karena kami berada dalam bisnis belajar.
Langkah 1: kurangi persyaratan variabel. Menggunakan int untuk port yang dipimpin tampaknya sedikit berlebihan, kita tentu saja tidak memiliki 65535 port IO yang dapat dialamatkan pada arduino :) Jadi kita mengubahnya ke byte hanya untuk bersenang-senang. Kami akan mengubahnya ke #define nanti, tetapi untuk menunjukkan dampak penggunaan tipe variabel yang terlalu besar.
Kompilasi menjadi 1172 byte + 13 byte RAM. Ini menghemat 8 byte flash karena operasi yang dibutuhkan lebih sedikit untuk byte daripada integer. Saya harapkan 12 byte ram, tapi oke. Tidak banyak, tetapi setiap byte yang disimpan baik.
Langkah 2: ubah variabel menjadi definisi ketika itu masuk akal. Misalnya, byte yang dipimpin tidak diperlukan, pin tidak akan lepas sendiri.
Kompilasi menjadi 1142 byte byte + ram 11 byte. Sudah 38 byte disimpan. Ini karena lebih sedikit operasi register yang diperlukan untuk mengambil nilai int. Kami juga menyimpan 2 byte dari RAM. (masih bertanya-tanya mengapa byte tidak dikompilasi menjadi 1 byte kurang ram .....)
Langkah 3: optimalkan kode. Saya melihat 2 penundaan. Saya ingin tahu apakah saya mengubahnya ke 1 penundaan akan menghemat ruang, tetapi saya harus mencari tahu nilai pin LED dan beralih (invert) itu. Kita dapat melakukannya dengan digitalRead (), tetapi apakah itu akan menghemat ruang?
Kompilasi menjadi 1134 bytes + 11 bytes ram. Yay! 8 byte lainnya. Itu membuat total 46 byte dan 2 baris kode lebih sedikit.
Juga tip umum lain untuk mengurangi kodeisasi. Jangan gunakan kelas String. Ini BESAR, pelajari cara berurusan dengan array char, strcpy (), strcmp (). Jika semua yang Anda miliki adalah beberapa operasi string dasar, penggunaan kelas String sebagian besar hanya membuang ruang pada flash dan RAM.
sumber