Saya ingin membuat makefile untuk mengkompilasi program c untuk Arduino. Saya agak terbiasa dengan make tetapi belum pernah menggunakannya dengan avr-gcc. Apa cara paling sederhana saya bisa meletakkan perintah di bawah ini di makefile?
$ avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
$ avr-gcc -mmcu=atmega328p led.o -o led
$ avr-objcopy -O ihex -R .eeprom led led.hex
$ avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard
dan dihubungkan secara politislibcore.a
. :-)Jawaban:
Tidak ada bedanya dengan bekerja dengan Make dan segala bentuk GCC lainnya. Cukup atur variabel CC dan variabel CFLAGS Anda sesuai dan berfungsi seperti biasa.
Misalnya, saya baru saja mengetuk yang ini:
Itu mengatakan bahwa setiap kompilasi C otomatis akan dilakukan dengan avr-gcc dan flag yang ditentukan dalam CFLAGS. Ini secara default akan membuat file hex menggunakan OBJCOPY, yang diatur ke avr, yang bergantung pada file led.elf - jadi untuk mendapatkan file itu ia menjalankan target led.elf, yang menghubungkan file objek led.o dengan pustaka default menggunakan apa pun yang diatur dalam CC. Untuk melakukan itu perlu led.o, dan itu membuatnya secara otomatis menggunakan program yang ditentukan dalam CC dan bendera di CFLAGS. Anda kemudian dapat secara opsional
make install
yang akan menjalankanavrdude
untuk menginstal file hex ke dalam chip.Anda dapat membuatnya lebih generik sehingga Anda dapat menyalinnya ke proyek lain dan membuat perubahan minimum yang diperlukan:
Itu menggunakan "variabel otomatis" dan penggantian nama sederhana.
BIN
berisi "basis" file biner Anda,OBJS
berisi daftar file objek. $ @ adalah nama target saat ini, $ <adalah nama prasyarat pertama, dan $ ^ adalah daftar semua prasyarat. Cukup gantiBIN
danOBJS
sesuaikan. Sebagai bonus saya telah dilemparkanmake clean
untuk menghapus file yang dikompilasi dan hanya meninggalkan Anda dengan sumbernya.sumber
install
atau file bernamaclean
(skrip shell, mungkin?), Makamake
mungkin berpikir bahwa merekaUp to date
dan tidak melakukan apa pun.clean.sh
daninstall.sh
jika Anda harus memilikinya.Jawaban yang diterima sangat bagus karena telah memberi saya pelajaran berharga dalam semua jenis alat debugging (avr-objdump -D telah menjadi teman dekat). Yaitu, garis:
${OBJCOPY} -O ihex -R .eeprom $< $@
hilang bendera arsitektur dan harus dibaca
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R. Tetap dari $ <$ @
Tanpa flag arsitektur -mmcu, avr-gcc menebak kami mengkompilasi untuk arsitektur 8515 (pasti tidak) dan ia menghasilkan file .elf tanpa instruksi awal untuk inisialisasi, yaitu tanpa instruksi untuk memanggil fungsi "utama" dll.
Ini menghasilkan perilaku membingungkan karena program sederhana apa pun (mis. Blink) dengan hanya fungsi "utama" berfungsi dengan baik, tetapi jika Anda mendefinisikan fungsi lain sebelum atau setelah "main", ia menjalankan fungsi itu dan tidak pernah memanggil "main" atau restart sepanjang waktu dll.
Saya juga bukan penggemar tertentu menghindari verifikasi jenis MCU yang benar dan program yang diunggah, jadi saya akan menganjurkan untuk tidak menggunakan -F dan -V dan menggunakan -v sebagai gantinya.
Jadi, jawaban yang ditingkatkan dapat:
sumber