IDE tổ chức mọi thứ như thế nào
Điều đầu tiên, đây là cách IDE tổ chức "bản phác thảo" của bạn:
- Tệp chính
.ino
là một trong cùng tên với thư mục mà nó nằm trong. Vì vậy, foobar.ino
trong foobar
thư mục - tệp chính là foobar.ino.
- Bất kỳ
.ino
tệp nào khác trong thư mục đó được nối với nhau, theo thứ tự chữ cái, ở cuối tệp chính (bất kể tệp chính nằm ở đâu, theo thứ tự bảng chữ cái).
- Tệp được nối này trở thành một
.cpp
tệp (ví dụ. foobar.cpp
) - nó được đặt trong thư mục biên dịch tạm thời.
- Bộ tiền xử lý "hữu ích" tạo các nguyên mẫu hàm cho các hàm mà nó tìm thấy trong tệp đó.
- Các tập tin chính được quét cho các
#include <libraryname>
chỉ thị. Điều này kích hoạt IDE cũng sao chép tất cả các tệp có liên quan từ mỗi thư viện (được đề cập) vào thư mục tạm thời và tạo hướng dẫn để biên dịch chúng.
- Bất kỳ
.c
, .cpp
hoặc .asm
các tệp trong thư mục phác thảo đều được thêm vào quy trình xây dựng dưới dạng các đơn vị biên dịch riêng biệt (nghĩa là chúng được biên dịch theo cách thông thường dưới dạng các tệp riêng biệt)
- Bất kỳ
.h
tệp nào cũng được sao chép vào thư mục biên dịch tạm thời, do đó chúng có thể được gọi bằng các tệp .c hoặc .cpp của bạn.
- Trình biên dịch thêm vào các tệp tiêu chuẩn quy trình xây dựng (như
main.cpp
)
- Quá trình xây dựng sau đó biên dịch tất cả các tệp trên thành tệp đối tượng.
- Nếu giai đoạn biên dịch thành công, chúng được liên kết với nhau cùng với các thư viện chuẩn AVR (ví dụ: cung cấp cho bạn,
strcpy
v.v.)
Một tác dụng phụ của tất cả những điều này là bạn có thể coi bản phác thảo chính (các tệp .ino) là C ++ cho tất cả các ý định và mục đích. Tuy nhiên, việc tạo nguyên mẫu hàm có thể dẫn đến các thông báo lỗi tối nghĩa nếu bạn không cẩn thận.
Tránh các quirks tiền xử lý
Cách đơn giản nhất để tránh những điều bình dị này là để trống bản phác thảo chính của bạn (và không sử dụng bất kỳ .ino
tệp nào khác ). Sau đó tạo một tab khác (một .cpp
tệp) và đặt nội dung của bạn vào đó như thế này:
#include <Arduino.h>
// put your sketch here ...
void setup ()
{
} // end of setup
void loop ()
{
} // end of loop
Lưu ý rằng bạn cần bao gồm Arduino.h
. IDE thực hiện điều đó tự động cho bản phác thảo chính, nhưng đối với các đơn vị biên dịch khác, bạn phải thực hiện nó. Mặt khác, nó sẽ không biết về những thứ như String, các thanh ghi phần cứng, v.v.
Tránh các thiết lập / mô hình chính
Bạn không phải chạy với khái niệm thiết lập / vòng lặp. Ví dụ: tệp .cpp của bạn có thể là:
#include <Arduino.h>
int main ()
{
init (); // initialize timers
Serial.begin (115200);
Serial.println ("Hello, world");
Serial.flush (); // let serial printing finish
} // end of main
Buộc thư viện bao gồm
Nếu bạn chạy với khái niệm "phác thảo trống", bạn vẫn cần bao gồm các thư viện được sử dụng ở nơi khác trong dự án, ví dụ như trong .ino
tệp chính của bạn :
#include <Wire.h>
#include <SPI.h>
#include <EEPROM.h>
Điều này là do IDE chỉ quét tệp chính để sử dụng thư viện. Thực tế, bạn có thể coi tệp chính là tệp "dự án" chỉ định thư viện bên ngoài nào đang được sử dụng.
Vấn đề đặt tên
Đừng đặt tên cho bản phác thảo chính của bạn là "main.cpp" - IDE bao gồm main.cpp của chính nó để bạn có một bản sao nếu bạn làm điều đó.
Không đặt tên tệp .cpp của bạn có cùng tên với tệp .ino chính của bạn. Vì tệp .ino thực sự trở thành tệp .cpp, điều này cũng sẽ cung cấp cho bạn một xung đột tên.
Khai báo một lớp kiểu C ++ trong cùng một tệp .ino duy nhất (đã nghe nói, nhưng chưa bao giờ thấy hoạt động - điều đó thậm chí có thể không?);
Vâng, điều này biên dịch OK:
class foo {
public:
};
foo bar;
void setup () { }
void loop () { }
Tuy nhiên, bạn có lẽ tốt nhất nên tuân theo thông lệ thông thường: Đặt các khai báo của bạn trong .h
các tệp và định nghĩa (triển khai) của bạn trong .cpp
(hoặc .c
) tệp.
Tại sao "có thể"?
Như ví dụ của tôi cho thấy bạn có thể đặt mọi thứ lại với nhau trong một tệp. Đối với các dự án lớn hơn là tốt hơn để được tổ chức nhiều hơn. Cuối cùng, bạn lên sân khấu trong một dự án có quy mô vừa và lớn, nơi bạn muốn tách những thứ thành "hộp đen" - nghĩa là, một lớp làm một việc, làm tốt, được kiểm tra và khép kín ( càng xa càng tốt).
Nếu lớp này sau đó được sử dụng trong nhiều tệp khác trong dự án của bạn thì đây là nơi riêng biệt .h
và .cpp
các tệp phát huy tác dụng.
Các .h
tập tin tuyên bố lớp - có nghĩa là, nó cung cấp đủ chi tiết cho các tập tin khác để biết những gì nó làm, những gì các chức năng nó có, và cách chúng được gọi.
Các .cpp
tập tin định nghĩa (dụng cụ) lớp - có nghĩa là, nó thực sự cung cấp các chức năng, và các thành viên lớp tĩnh, mà làm cho lớp làm điều này. Vì bạn chỉ muốn thực hiện nó một lần, đây là một tệp riêng biệt.
Các .h
tập tin là những gì được bao gồm trong các tập tin khác. Các .cpp
tập tin được biên dịch một lúc bằng cách IDE để thực hiện các chức năng lớp.
Thư viện
Nếu bạn theo mô hình này, thì bạn đã sẵn sàng để chuyển toàn bộ lớp ( tệp .h
và .cpp
tệp) vào một thư viện rất dễ dàng. Sau đó, nó có thể được chia sẻ giữa nhiều dự án. Tất cả những gì được yêu cầu là để tạo ra một thư mục (ví dụ. myLibrary
) Và đặt .h
và .cpp
các file trong nó (ví dụ. myLibrary.h
Và myLibrary.cpp
) và sau đó đặt thư mục này bên trong của bạn libraries
thư mục trong thư mục mà phác thảo của bạn được lưu giữ (thư mục quyển phác thảo).
Khởi động lại IDE và bây giờ nó biết về thư viện này. Điều này thực sự đơn giản và bây giờ bạn có thể chia sẻ thư viện này qua nhiều dự án. Tôi làm điều này rất nhiều.
Một chút chi tiết ở đây .