Bagaimana cara menulis sketsa makefile yang kompatibel?

9

Saya ingin menulis sketsa saya sehingga saya bisa membuat / mengunggahnya menggunakan Arduino IDE, atau secara opsional menggunakan GCC dan makefile.

Saya tahu tentang menyertakan fungsi deklarasi di atas, tetapi apakah ada hal lain yang harus dilakukan agar sketsa saya dianggap valid C ++ oleh kompiler saya?

Perbarui 1

Memahami apa yang dilakukan Arduino IDE terhadap file .ino dan .pde baik-baik saja, tetapi tidak sesuai dengan pertanyaan saya, jadi ini bukan duplikat. Yang ingin saya ketahui adalah "bagaimana cara saya menulis sebuah program sehingga dianggap valid baik oleh IDE Arduino dan g ++.

Makefile resmi (?) Yang tersedia di sini menjelaskan apa yang harus dilakukan jika menggunakan makefile alih - alih IDE:

# The Arduino environment does preliminary processing on a sketch before
# compiling it.  If you're using this makefile instead, you'll need to do
# a few things differently:
#
#   - Give your program's file a .cpp extension (e.g. foo.cpp).
#
#   - Put this line at top of your code: #include <WProgram.h>
#
#   - Write prototypes for all your functions (or define them before you
#     call them).  A prototype declares the types of parameters a
#     function will take and what type of value it will return.  This
#     means that you can have a call to a function before the definition
#     of the function.  A function prototype looks like the first line of
#     the function, with a semi-colon at the end.  For example:
#     int digitalRead(int pin);

... tapi ini tidak menjelaskan bagaimana penggunaan kedua IDE dan makefile.

Perbarui 2

Saya baru-baru ini menemukan PlatformIO yang tidak menjawab pertanyaan ini secara langsung, tetapi tidak mengotomatiskan banyak proses (menghasilkan file Scons untuk Anda) dan sejauh ini saya lebih suka alur kerja lebih dari Arduino IDE dan pendekatan sumber + makefile. Dukungan baik dari penulis juga.

hoosierEE
sumber
Jadi pertanyaan itu jauh di luar pengetahuan saya, tetapi beberapa hal yang harus Anda pertimbangkan adalah termasuk file Arduino.h. Memasukkan bootloader; dan yang lainnya. Saya akan mengikuti pertanyaan ini :)
Madivad
Saya sarankan Anda melihat Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret
inotool.org
jippie
1
Anda tidak dapat menulis "program" yang dianggap sah oleh IDE dan G ++ secara langsung kecuali Anda bersedia melakukan sejumlah pengorbanan. Berurusan dengan Ino.
Ignacio Vazquez-Abrams
1
Menemukan jawaban saya di sini , di komentar makefile terlampir.
hoosierEE

Jawaban:

1

Dengan gcc / g ++ saya pikir Anda merujuk khusus untuk avr-gcc / avr-g ++. Kode arduino Anda mungkin tidak akan dianggap sebagai kode C / C ++ yang valid karena gcc akan mencoba mengkompilasi dengan PC Anda sebagai sistem target. Banyak makro di "WProgram.h" akan merujuk pada memori yang tidak dapat diakses di sistem target Anda.

Jika Anda menyertakan file header "WProgram.h" dan Anda membuat kode dengan Arduino Makefile di atas (yang menggunakan avr-g ++ bukan g ++), file cpp Anda harus dikompilasi dan dihubungkan dengan benar. Demikian juga, Anda akan dapat membuka kode Arduino Anda dalam IDE dan Verifikasi kode Anda di sana. IDE menempatkan dalam file "WProgram.h" untuk Anda, jadi secara teknis itu akan dimasukkan dua kali. Namun, penjaga sertakan akan mencegah kompilasi kode duplikat.

Sean
sumber
1

Secara umum Anda harus menyatakan setup()dan loop()fungsinya, mereka hanya pembungkus IDE:

void setup() {}
void loop() {}

int main() {
  setup();
  while (1)
    loop();

  return 0; // never reached
}

Ini berfungsi baik di IDE dan di baris perintah. Saat Anda menentukan Board dan SerialPort di IDE, Anda juga perlu menentukan keduanya di Makefile. Jadi Anda akan berakhir dengan dua konfigurasi.

Banyak orang meninggalkan IDE karena mereka lebih suka menggunakan editor yang berbeda atau memiliki lebih banyak opsi konfigurasi dengan mengatur sakelar kompiler dan tautan.

Untuk membuatnya sangat mudah, Anda dapat menggunakan Arduino Makefile . Hari ini dibintangi dengan 347.

Berikut contoh Makefile:

# try: make help
#
include /usr/share/arduino/Arduino.mk
ARDUINO_DIR = /usr/share/arduino
# list boards with: make show_boards
BOARD_TAG = promicro16
ARDUINO_LIBS = EEPROM 
# MONITOR_CMD = picocom -b 9600
MONITOR_CMD = moni -config ACM0-9600.cfg
ARDUINO_PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Leonardo-if00
# ARDUINO_PORT = /dev/ttyACM0
# ARDUINO_PORT = /dev/ttyUSB0
OPTIMIZATION_FLAGS = -Os -fexpensive-optimizations -fstrength-reduce
#

File '* .ino' tidak perlu diubah dan Makefilefile tersebut harus ditempatkan di direktori yang sama.

Sementara itu saya lebih suka Makefilejalannya, tapi saya masih menggunakan IDE untuk proyek kecil.


sumber
1

Yang ingin saya ketahui adalah "bagaimana cara saya menulis sebuah program sehingga dianggap valid baik oleh IDE Arduino dan g ++.

Lihat: Cara menghindari kebiasaan pra-pemrosesan file sketsa IDE .

Mengabaikan saat apa Makefile akan terlihat seperti, jawaban sederhana untuk pertanyaan Anda, seperti yang dibahas dalam tautan di atas, adalah untuk meletakkan semuanya ke dalam tab .cpp dan .h di IDE, dan meninggalkan "sketsa" utama (.ino file) kosong. Itu masih akan dikompilasi di bawah IDE, dan karena itu juga akan menjadi C ++ normal.

Pastikan Anda memulai file .cpp Anda dengan:

#include <Arduino.h>

Jika Anda menggunakan pustaka (misalnya, SPI) Anda harus memasukkannya dalam file sketsa utama, yang memicu IDE untuk menyalinnya ke file build proyek sementara. Makefile tidak akan peduli tentang itu, karena Anda akan memastikan Makefile Anda menyertakan semua file library yang diperlukan.

Lihat juga jawaban saya di sini: Kelas dan objek: berapa banyak dan jenis file mana yang saya perlukan untuk menggunakannya?

Nick Gammon
sumber