Làm thế nào để viết phác thảo tương thích makefile?


9

Tôi muốn viết các bản phác thảo của mình để tôi có thể xây dựng / tải chúng lên bằng Arduino IDE hoặc tùy ý sử dụng GCC và tệp tạo tệp.

Tôi biết về việc bao gồm các khai báo hàm ở trên cùng, nhưng có bất cứ điều gì khác phải làm để bản phác thảo của tôi được coi là C ++ hợp lệ bởi trình biên dịch của tôi không?

Cập nhật 1

Hiểu những gì Arduino IDE làm với các tệp .ino và .pde là tốt, nhưng không liên quan đến câu hỏi của tôi, vì vậy đây không phải là một bản sao. Điều tôi muốn biết là "làm thế nào để tôi viết một chương trình sao cho nó được coi là hợp lệ bởi cả Arduino IDE g ++.

Makefile chính thức (?) Có sẵn ở đây giải thích những việc cần làm nếu sử dụng makefile thay vì 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);

... nhưng điều này không giải thích cách sử dụng cả IDE và makefile.

Cập nhật 2

Gần đây tôi đã tìm thấy PlatformIO không trả lời trực tiếp câu hỏi này, nhưng tự động hóa rất nhiều quy trình (tạo tệp Scons cho bạn) và cho đến nay tôi thích quy trình làm việc hơn cả Arduino IDE và cách tiếp cận nguồn + makefile. Hỗ trợ tốt từ các tác giả là tốt.


Do đó, câu hỏi vượt quá tầm hiểu biết của tôi, nhưng một số điều bạn phải xem xét là bao gồm tệp Arduino.h. Kết hợp bộ nạp khởi động; và bất cứ điều gì khác. Tôi sẽ theo dõi câu hỏi này :)
Madivad

Tôi khuyên bạn nên xem Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret


1
Bạn không thể viết một "chương trình" được coi là hợp lệ bởi cả IDE và G ++ trực tiếp trừ khi bạn sẵn sàng thực hiện một số hy sinh. Đối phó với Ino.
Ignacio Vazquez-Abrams

1
Tìm thấy câu trả lời của tôi ở đây , trong các ý kiến ​​của makefile đính kèm.
hoosierEE

Câu trả lời:


1

Bởi gcc / g ++ Tôi nghĩ rằng bạn đang đề cập cụ thể đến avr-gcc / avr-g ++. Mã arduino của bạn có thể sẽ không được coi là mã C / C ++ hợp lệ vì gcc sẽ cố gắng biên dịch với PC của bạn làm hệ thống đích. Nhiều Macro trong "WProgram.h" sẽ đề cập đến bộ nhớ không thể truy cập trên hệ thống đích của bạn.

Cung cấp cho bạn bao gồm tệp tiêu đề "WProgram.h" và bạn xây dựng mã của mình với Arduino Makefile ở trên (sử dụng avr-g ++ chứ không phải g ++), các tệp cpp của bạn sẽ biên dịch và liên kết chính xác. Tương tự như vậy, bạn sẽ có thể mở mã Arduino của mình trong IDE và Xác minh mã của bạn ở đó. IDE đặt tệp "WProgram.h" cho bạn, vì vậy về mặt kỹ thuật, nó sẽ được bao gồm hai lần. Tuy nhiên, các bộ bảo vệ bao gồm sẽ ngăn không cho bất kỳ mã trùng lặp nào được biên dịch.


1

Nói chung, bạn sẽ cần nêu các chức năng setup()loop()chức năng, chúng chỉ là các hàm bao của IDE:

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

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

  return 0; // never reached
}

Điều này hoạt động cả trong IDE và trên dòng lệnh. Khi bạn chỉ định Board và SerialPort trong IDE, bạn cũng sẽ cần chỉ định cả hai trong Makefile. Vì vậy, bạn sẽ kết thúc với hai cấu hình.

Nhiều người rời khỏi IDE vì họ thích sử dụng các trình soạn thảo khác nhau hoặc có nhiều tùy chọn cấu hình hơn bằng cách đặt trình chuyển đổi trình biên dịch và trình liên kết.

Để làm cho nó thực sự dễ dàng, bạn có thể sử dụng Arduino Makefile . Hôm nay đóng vai chính với 347.

Dưới đây là một ví dụ 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
#

Các tập tin '* .ino' không cần phải thay đổi và Makefiletập tin sẽ được đặt trong cùng một thư mục.

Trong khi đó tôi thích Makefilecách này, nhưng tôi vẫn sử dụng IDE cho các dự án nhỏ.


1

Điều tôi muốn biết là "làm thế nào để tôi viết một chương trình sao cho nó được coi là hợp lệ bởi cả Arduino IDE và g ++.

Xem: Làm thế nào để tránh các quirks của tiền xử lý tệp phác thảo IDE .

Không quan tâm đến thời điểm Makefile sẽ trông như thế nào, câu trả lời đơn giản cho câu hỏi của bạn, như được thảo luận trong liên kết ở trên, là đặt mọi thứ vào các tab .cpp và .h trong IDE và để lại "bản phác thảo" (.ino tập tin) để trống. Điều đó vẫn sẽ biên dịch theo IDE, và do đó cũng sẽ là C ++ bình thường.

Đảm bảo bạn bắt đầu các tệp .cpp của mình bằng:

#include <Arduino.h>

Nếu bạn sử dụng các thư viện (ví dụ: SPI), bạn phải đưa chúng vào tệp phác thảo chính, điều này kích hoạt IDE để sao chép chúng vào tệp xây dựng dự án tạm thời. Makefile sẽ không quan tâm đến điều đó, vì bạn sẽ đảm bảo Makefile của bạn bao gồm tất cả các tệp thư viện cần thiết.

Cũng xem câu trả lời của tôi ở đây: Các lớp và đối tượng: tôi thực sự cần bao nhiêu và loại tệp nào để sử dụng chúng?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.