วิธีการเขียนภาพร่างที่เข้ากันได้กับ makefile?


9

ฉันต้องการเขียนภาพร่างของฉันเพื่อให้ฉันสามารถสร้าง / อัปโหลดโดยใช้ Arduino IDE หรือเลือกที่จะใช้ GCC และ makefile ก็ได้

ฉันรู้เกี่ยวกับการรวมฟังก์ชั่นการประกาศที่ด้านบน แต่มีอะไรอีกที่ต้องทำเพื่อให้ร่างของฉันได้รับการพิจารณา C ++ ที่ถูกต้องโดยคอมไพเลอร์ของฉัน

อัปเดต 1

การทำความเข้าใจกับสิ่งที่ Arduino IDE ทำกับไฟล์. iino และ. pde นั้นใช้ได้ แต่ไม่เกี่ยวข้องกับคำถามของฉันดังนั้นนี่จึงไม่ใช่สิ่งที่ซ้ำกัน สิ่งที่ฉันต้องการรู้คือ "ฉันจะเขียนโปรแกรมอย่างไรเพื่อให้ถือว่าถูกต้องทั้งโดย Arduino IDE และ g ++

makefile อย่างเป็นทางการ (?) มีอยู่ที่นี่อธิบายว่าต้องทำอย่างไรถ้าใช้ makefile แทน 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);

... แต่นี่ไม่ได้อธิบายว่าจะใช้ทั้ง IDE และ makefile อย่างไร

อัปเดต 2

ฉันเพิ่งพบ PlatformIO ที่ไม่ตอบคำถามนี้โดยตรง แต่ทำกระบวนการโดยอัตโนมัติ (สร้างไฟล์ Scons ให้คุณ) และจนถึงตอนนี้ฉันชอบเวิร์กโฟลว์มากกว่าทั้ง IDE IDE และแนวทาง + source file makefile การสนับสนุนที่ดีจากผู้เขียนเช่นกัน


ดังนั้นคำถามเป็นวิธีที่เกินกว่าความรู้ของฉัน แต่บางสิ่งที่คุณต้องพิจารณาคือการรวมของไฟล์ Arduino.h การรวม bootloader; และสิ่งอื่นใด ผมจะต่อไปนี้คำถามนี้ :)
Madivad

ฉันขอแนะนำให้คุณดูที่ Arduino-CMake ( github.com/queezythegreat/arduino-cmake )
jfpoilpret


1
คุณไม่สามารถเขียน "โปรแกรม" ที่ถือว่าใช้ได้ทั้ง IDE และ G ++ โดยตรงเว้นแต่คุณจะเต็มใจเสียสละจำนวนมาก จัดการกับ Ino
Ignacio Vazquez-Abrams

1
พบคำตอบของฉันที่นี่ในความคิดเห็นของ makefile ที่แนบมา
hoosierEE

คำตอบ:


1

โดย gcc / g ++ ฉันคิดว่าคุณพูดถึง avr-gcc / avr-g ++ โดยเฉพาะ รหัสอาร์ดิโนของคุณอาจจะไม่ถือว่าเป็นรหัส C / C ++ ที่ถูกต้องเพราะ gcc จะพยายามคอมไพล์กับพีซีของคุณเป็นระบบเป้าหมาย มาโครจำนวนมากใน "WProgram.h" จะอ้างถึงหน่วยความจำที่เข้าถึงไม่ได้ในระบบเป้าหมายของคุณ

ให้คุณรวมไฟล์ส่วนหัว "WProgram.h" และคุณสร้างรหัสด้วย Arduino Makefile ด้านบน (ซึ่งใช้ avr-g ++ ไม่ใช่ g ++) ไฟล์ cpp ของคุณควรรวบรวมและเชื่อมโยงอย่างถูกต้อง ในทำนองเดียวกันคุณจะสามารถเปิดรหัส Arduino ภายใน IDE และยืนยันรหัสของคุณที่นั่น IDE ใส่ไว้ในไฟล์ "WProgram.h" สำหรับคุณดังนั้นในทางเทคนิคแล้วมันจะรวมสองครั้ง อย่างไรก็ตามยามรวมจะป้องกันไม่ให้มีการรวบรวมรหัสที่ซ้ำกัน


1

โดยทั่วไปคุณจะต้องระบุsetup()และloop()ฟังก์ชั่นมันเป็นเพียงแค่ wraps ของ IDE:

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

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

  return 0; // never reached
}

สิ่งนี้ใช้ได้ทั้งใน IDE และบนบรรทัดคำสั่ง เมื่อคุณระบุ Board และ SerialPort ใน IDE คุณจะต้องระบุทั้งใน Makefile ดังนั้นคุณจะจบลงด้วยการกำหนดค่าสองแบบ

หลายคนออกจาก IDE เพราะต้องการใช้ตัวแก้ไขที่แตกต่างกันหรือมีตัวเลือกการกำหนดค่าเพิ่มเติมโดยการตั้งค่าคอมไพเลอร์และสวิตช์ลิงก์

ที่จะทำให้มันง่ายมากที่คุณสามารถใช้Arduino Makefile วันนี้ติดดาวกับ 347

นี่คือตัวอย่าง 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
#

ไม่จำเป็นต้องเปลี่ยนMakefileไฟล์'* .ino' และวางไฟล์ไว้ในไดเรกทอรีเดียวกัน

ในขณะที่ฉันชอบMakefileวิธีนี้ แต่ฉันยังคงใช้ IDE สำหรับโครงการขนาดเล็ก


1

สิ่งที่ฉันอยากรู้คือ "ฉันจะเขียนโปรแกรมอย่างไรเพื่อให้ถือว่าถูกต้องทั้งโดย Arduino IDE และ g ++

ดู: วิธีการหลีกเลี่ยงนิสัยใจคอของ IDE ร่างไฟล์ก่อนการ

การไม่คำนึงถึงช่วงเวลาที่ Makefile ดูเหมือนว่าคำตอบง่ายๆสำหรับคำถามของคุณดังที่กล่าวไว้ในลิงก์ด้านบนคือการใส่ทุกอย่างลงในแท็บ. cpp และ. h ใน IDE และปล่อยให้ "ร่าง" หลัก (.ino ไฟล์) ว่างเปล่า ที่จะยังคงรวบรวมภายใต้ IDE และจึงจะเป็น C ++ ปกติ

ตรวจสอบให้แน่ใจว่าคุณเริ่มไฟล์. cpp ด้วย:

#include <Arduino.h>

หากคุณใช้ไลบรารี (เช่น SPI) คุณต้องรวมไว้ในไฟล์ร่างหลักซึ่งเป็นสาเหตุให้ IDE ทำการคัดลอกไปยังไฟล์สร้างโครงการชั่วคราว Makefile จะไม่สนใจสิ่งนั้นเนื่องจากคุณจะต้องแน่ใจว่า Makefile ของคุณมีไฟล์ไลบรารีที่จำเป็นทั้งหมด

ดูคำตอบของฉันได้ที่นี่: คลาสและวัตถุ: ฉันต้องใช้ไฟล์ประเภทใดมากและเท่าไหร่?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.