C ++ so với ngôn ngữ Arduino?


81

Ưu điểm của từng ngôn ngữ khi sử dụng Arduino là gì?

Tôi nghĩ rằng đây là một câu hỏi chung tốt, nhưng tôi sẽ thêm một chút về lý do tại sao tôi hỏi nếu có ai muốn cho tôi một lời khuyên.

Tôi có kinh nghiệm trong các ngôn ngữ được xử lý trước như JavaScript, PHP và đã gặp khó khăn với các ngôn ngữ như Java và Visual Basic. Nói cách khác, tôi biết các kỹ thuật lập trình và cả định hướng đối tượng cổ điển và nguyên mẫu, nhưng không có gì về giao tiếp trực tiếp với phần cứng.

Tôi đang thực hiện một octocopter, và tôi nghĩ rằng một cách tiếp cận hướng đối tượng sẽ là dễ nhất. (Phần mềm sẽ có rất nhiều tính năng ...) Tuy nhiên tôi chưa bao giờ viết bằng C ++.

Vì đây là trang web Hỏi & Đáp được cho là giúp đỡ người khác, nên chỉ có câu hỏi chung được trình bày ở phần đầu là rất quan trọng, nhưng tôi đánh giá cao bất kỳ nhận xét nào về tình huống của tôi.


16
Tránh Arduino IDE vì nó không xứng đáng với tên IDE của nó, nó thậm chí còn là một trình soạn thảo rất kém: nó có thể tốt cho người mới bắt đầu và các bản phác thảo đơn giản nhưng người ta nên nhanh chóng đi đến một cái gì đó tốt hơn.
jfpoilpret

4
Đây là một phân tích khá ngắn gọn về ý nghĩa của (và những gì thực sự nằm dưới) "Ngôn ngữ lập trình Arduino".
AdjunctProfessorFalcon

10
C++ vs. The Arduino Language?- "Ngôn ngữ Arduino" C ++. Có một chút tiền xử lý để giúp bạn tiết kiệm thực hiện các nguyên mẫu chức năng, nhưng chắc chắn nhất là C ++.
Nick Gammon

2
Không có thứ gọi là ngôn ngữ arduino. Nó chỉ đơn giản là một thư viện.
Overdrivr

2
Không liên quan đến câu hỏi như các bình luận: Atmel studio là miễn phí và IMHO nó tốt hơn so với studio trực quan để lập trình arduino. Cũng hỗ trợ plugin Visual Micro, mặc dù hoàn toàn không cần thiết cho việc lập trình và gỡ lỗi arduinos.
cyberponk

Câu trả lời:


55

Kinh nghiệm cá nhân của tôi với tư cách là giáo sư (lập trình, cơ điện tử) là nếu bạn có kinh nghiệm lập trình trước đó và bạn nhận thức được các khái niệm là OOP, tốt hơn là nên đi C / C ++. Ngôn ngữ arduino thực sự tuyệt vời cho người mới bắt đầu, nhưng có một số hạn chế (ví dụ: bạn phải có tất cả các tệp của mình trong cùng một thư mục). Và về cơ bản, nó đơn giản hóa C / C ++ (thực tế bạn có thể sao chép và dán mã arduino vào tệp C / C ++, và nó sẽ hoạt động). Ngoài ra, điều hợp lý là bạn có thể đi và sử dụng một IDE nổi tiếng đầy đủ như nhật thực:

http://playground.arduino.cc/Code/Eclipse

Ban đầu, nó đòi hỏi một chút thiết lập và cấu hình của môi trường dev của bạn, nhưng IMHO nó đáng giá cho các lập trình viên có kinh nghiệm trong bất kỳ ngôn ngữ nào khác.

Trong mọi trường hợp, điều đó sẽ không gây hại cho bạn khi bắt đầu sử dụng ngôn ngữ arduino và IDE arduino trong vài ngày để làm quen với phần cứng arduino và sau đó chuyển sang C / C ++ với Eclipse để thực sự phát triển dự án của bạn.


Cảm ơn bạn đã suy nghĩ của bạn. Tôi sẽ sử dụng Arduino IDE để tìm hiểu cách điều khiển tất cả các phần cứng khác nhau như cảm biến và màn hình LCD, vv Sau đó, tôi sẽ chuyển lên C ++ để tạo phần mềm cho octocopter. Bạn có biết một cuốn sách hay và ngắn cho những người biết các ngôn ngữ khác không? "Vấn đề" với nhiều cuốn sách tôi đã tìm thấy là chúng bao gồm rất nhiều thứ tôi không cần bởi vì tôi đang sử dụng một vi điều khiển nhỏ của Atmel chứ không phải là một máy tính UI.
Bạn của Kim

1
Có một cuốn sách hay "Lập trình C cho Arduino" của Julien Bayle rất hữu ích. Đó là ngôn ngữ C không phải C ++ nhưng sẽ giúp bạn hiểu cơ sở.
fenix688

Đó là một yêu cầu tốt: một cuốn sách ngắn và hay với những điều cơ bản về C ++ cho các lập trình viên của các ngôn ngữ khác. Xin lỗi tôi không thể đưa ra bất kỳ khuyến nghị, tôi không biết bất kỳ khuyến nghị tốt. Trên thực tế, tôi đã viết một cuốn sách, với trọng tâm thực tế (phát triển một trò chơi điện tử) cho các học sinh của mình, nhưng nó chỉ bằng tiếng Tây Ban Nha. Để có một cuốn sách C ++ hay và thực tế, tôi muốn giới thiệu Delist & Delist Cách lập trình C ++, bạn có thể bỏ qua nhiều chương nâng cao.
drodri

1
C ++ hỗ trợ các tính năng OO, ngôn ngữ C thì không.
Chris O

1
@FriendofKim Không chính xác như tôi muốn nói (mặc dù về mặt kỹ thuật bạn có thể, Do đủ nhanh để hỗ trợ giải pháp phần mềm cho giao tiếp nối tiếp không phải megabit và nó có tổng cộng 5 U (S) ARTS trong khi các thư viện Arduino chỉ cung cấp 4 chúng nhưng bao quanh bảng do không cung cấp chân cho một trong các USARTs); các thư viện Arduino định cấu hình USART để sử dụng chế độ không đồng bộ, nhưng tôi cần đồng bộ lên đến 6Mb / giây (và tôi phải sử dụng chế độ SPI vì đầu vào phải được xử lý như một dòng bit thô để không có bit dừng / v.v.), cũng liên quan Sửa đổi cấu hình bộ điều khiển PIO mặc định.
JAB

48

Về lý thuyết ...
thực sự không có ngôn ngữ Arduino như vậy. Nó thực sự chỉ là C ++ với một số thư viện dành riêng cho tên miền. Chúng thêm vào các tính năng khác nhau, chẳng hạn như các chức năng bạn có thể gọi để kiểm soát phần cứng. Nếu bạn không có các chức năng đó, bạn cần phải trực tiếp sử dụng các thanh ghi đặc biệt để kiểm soát mọi thứ. Đó là cách lập trình nhúng thường được thực hiện. Nó nhanh, nhưng có thể khá khó để học và hiểu.

Ngoài các chức năng, các thư viện thêm tên thay thế cho một số loại. Ví dụ, booleanbytekhông có trong tiêu chuẩn C ++. Tuy nhiên, chúng tương đương trực tiếp với boolunsigned char.

Tất cả những điều này có nghĩa là bạn có thể chuyển mã C ++ chung trực tiếp sang Arduino mà không gặp khó khăn gì. Tuy nhiên, quay trở lại theo cách khác có thể yêu cầu một số chỉnh sửa nhỏ.

Trong thực tế ...
Đã nói tất cả về điều đó, lập trình cho Arduino không hoàn toàn giống với lập trình C ++ nói chung. Mặc dù vậy, có rất nhiều sự khác biệt chung cho tất cả các chương trình nhúng (như bộ nhớ và khả năng xử lý hạn chế).

Cũng đáng lưu ý rằng nếu bạn đang sử dụng Arduino IDE chính thức thì có tất cả các loại hạn chế và hạn chế gây phiền nhiễu về cách bạn thiết lập mã của mình. Có cách giải quyết trong tất cả các trường hợp (theo như tôi biết), nhưng đôi khi chúng khá bực bội.

Để hoàn toàn linh hoạt, hãy sử dụng IDE của bên thứ ba (như Eclipse) với một trình cắm thêm để hỗ trợ Arduino. Điều đó sẽ cung cấp cho bạn tất cả các lợi thế của C ++, cùng với các thư viện Arduino.


25

Ưu điểm của C ++ so với ngôn ngữ Arduino khi sử dụng Arduino là gì? Tôi có kinh nghiệm trong các ngôn ngữ được xử lý trước như JavaScript, PHP và đã gặp khó khăn với các ngôn ngữ như Java và Visual Basic.

Đầu tiên, trình biên dịch Arduino / IDE chấp nhận nguyên trạng C và C ++. Trong thực tế, nhiều thư viện được viết bằng C ++. Phần lớn hệ thống cơ bản không hướng đối tượng, nhưng nó có thể.

Do đó, "Ngôn ngữ arduino" là C ++ hoặc C.

C ++ không phải là rác được thu thập. Nó không quản lý các biến trong phạm vi - nếu bạn viết:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

Sau đó, bạn sẽ thấy điều đó ledikhông phát triển hoặc rò rỉ, bất kể bạn gọi bao nhiêu lần blinkTimes.

Nếu ilà một lớp, nó sẽ bị loại bỏ tương tự khi hàm kết thúc. Vì vậy, miễn là bạn không sử dụng newhoặc các chức năng cấp phát bộ nhớ tương tự để tạo các đối tượng mới, thì bạn sẽ không phải lo lắng về rò rỉ.

Bạn vẫn có thể hết bộ nhớ, nếu bạn tạo các lớp lớn và sử dụng rất nhiều trong số chúng trong các hàm được lồng sâu, nhưng nói chung bạn sẽ không gặp rắc rối cho đến khi bạn bắt đầu xử lý newvà các freehàm.

Nếu bạn đang sử dụng new, thì bạn sẽ phải gọi deletevào những thời điểm thích hợp. C ++ và bằng cách mở rộng Arduino, không có bộ sưu tập rác tự động, bạn phải quản lý rõ ràng bộ nhớ của riêng mình.


1
Được rồi, nếu các đối tượng được khởi tạo (với mới) không được thu gom rác, tôi cũng sẽ phải học điều đó. Tôi cho rằng bất kỳ cuốn sách nào về C ++ sẽ đề cập đến điều đó. Cảm ơn bạn đã trả lời tốt!
Bạn của Kim

14

Ngôn ngữ Arduino C ++, nhưng nó rất khác so với hầu hết các giống C ++. Ngôn ngữ Arduino có rất nhiều tính trừu tượng được tích hợp, đặc biệt là trong các giao diện phần cứng, giúp sử dụng rất đơn giản. Nếu bạn có một nền tảng về Java, C và C ++ sẽ rất giống nhau.

Sự khác biệt chính giữa Arduino và C ++ là trong bộ nhớ lưu trữ. Thông thường một máy tính hiện đại có hơn 2GB RAM, trong khi Arduino Uno có 2kB (ít hơn 1 triệu lần). Arduino cũng sử dụng các hướng dẫn 8 bit thay cho 32 bit mà máy tính sử dụng. Điều này chủ yếu sẽ ảnh hưởng đến lượng thông tin bạn có thể lưu trữ trong một biến.

Nếu bạn rất mới với thế giới Arduino, bạn nên tìm một hướng dẫn, vì có rất nhiều cái tốt ngoài kia.


Bạn đề cập đến bộ nhớ. Tôi có Do có RAM 96KB. Nhưng điều cuối cùng tôi muốn là cho máy photocopy bị sập vì rò rỉ bộ nhớ (có một máy ảnh rất đắt tiền được gắn trên máy photocopy).
Bạn của Kim

Bộ nhớ trong C ++ có được xử lý tự động (như trình thu gom rác trong Java) nếu không được chỉ định khác không?
Bạn của Kim

2
Chuẩn C ++ không đảm bảo về kích thước bộ nhớ - c ++ đã chạy trên phần cứng nhúng mà không cần sửa đổi.
Michael Thorpe

2
Bạn đang mô tả sự khác biệt giữa các nền tảng phần cứng, không phải C ++ ở đó.
Cyberg Ribbon

5
@FriendofKim Trong C ++, có hai cách khác nhau để khởi tạo các biến / đối tượng. Nếu bạn khởi tạo chúng cục bộ (ví dụ int blah = 5;) thì chúng sẽ tự động bị hủy khi chúng đi ra khỏi phạm vi (tức là ở cuối vòng lặp hoặc hàm). Tuy nhiên, nếu bạn khởi tạo chúng trên heap (ví dụ int *blah = new int(5);) thì bạn cần phải tự giải phóng chúng. Mặc dù vậy, thông thường không nên sử dụng dữ liệu heap trong lập trình nhúng.
Peter Bloomfield

14

--- Cập nhật 170412
Tôi đã viết câu trả lời ban đầu của mình ba năm trước từ góc độ hiện có một "Arduino C ++" riêng biệt. Ngôn ngữ được sử dụng trong IDE C ++ tiêu chuẩn, vì nó được trình biên dịch GNU C ++ triển khai. Sự khác biệt "Rõ ràng" xuất hiện vì IDE sẽ thực hiện một số xử lý trước để giúp những người mới sử dụng ngôn ngữ tránh một vài 'gotcha', bằng cách điền vào một số #includes, f / ex. Nhưng bạn có thể - và tôi làm - viết C ++ chính xác cho nó và nhận được những gì bạn mong muốn nhận được.
--- cập nhật kết thúc

Đừng giới hạn việc sử dụng các tính năng ngôn ngữ C ++ của bạn cho những người thực hiện mà bạn hoàn toàn hiểu rõ. Có một số tính năng biên dịch thành mã chuyên sâu hơn tài nguyên so với việc đọc mã nguồn. Danh sách .lss (nguồn hợp nhất và lắp ráp) được tạo tùy chọn có thể cung cấp cho bạn một cái nhìn sâu sắc về những gì trình biên dịch C ++ đã làm khi bạn không tìm kiếm.

Đối với câu hỏi của bạn về bộ nhớ: C ++ không thu gom rác. Các ngôn ngữ dựa trên ngăn xếp như C và C ++ phân bổ lưu trữ tạm thời trên ngăn xếp cho các biến tự động khi nhập hàm, sau đó sẽ được giải phóng khi hàm trả về, nhưng đây không phải là bộ sưu tập rác thực sự. Các đối tượng được tạo trong bộ nhớ heap- hoặc toàn cầu tồn tại cho đến khi bạn xóa chúng một cách rõ ràng. Hãy chắc chắn rằng bạn biết nơi nào, khi nào và trong bao lâu các loại đối tượng khác nhau sẽ được tạo ra. Bạn thực sự không muốn các đối tượng mã newdelete-ing của bạn willy-nilly. Chúng sẽ được xây dựng trong bộ nhớ heap, phân mảnh nó và khiến nó lớn lên thành chồng. Đó là khi mã của bạn - và 'máy photocopy' đẹp của bạn - sẽ bị sập.

C làm ít hơn cho bạn để nó có thể làm ít hơn cho bạn. Đó là một lựa chọn không tồi. C với một vài tính năng của C ++ có thể là một lựa chọn thậm chí tốt hơn, nếu bạn chọn các tính năng bổ sung một cách thận trọng. ++, nếu đó là hai lựa chọn của bạn:

[Câu trả lời gốc] - C ++ là ngôn ngữ được tiêu chuẩn hóa. Nó được triển khai rộng rãi trong nhiều môi trường bao gồm các hệ thống nhúng và do đó được kiểm tra kỹ lưỡng hơn so với ngôn ngữ rất giống C ++ là "Arduino". Điều này đặc biệt quan trọng đối với các ứng dụng quan trọng / an toàn quan trọng như bạn đang lên kế hoạch. Mã bị hỏng có nghĩa là máy photocopy bị hỏng và ngay cả khi nó không làm tổn thương ai đó, nó sẽ phá vỡ máy đắt tiền của bạn.

  • Là tiêu chuẩn, C ++ là xách tay. Cần nâng cấp bộ xử lý của bạn? Tất cả mọi thứ trừ mã dành riêng cho silicon sẽ chuyển sang mã mới. Cần thay đổi bộ công cụ, hệ thống phát triển, hệ điều hành máy chủ của bạn? C ++ sẽ được hỗ trợ ở mọi nơi. Mặc dù Arduino IDE sẽ chạy bất cứ nơi nào Java được hỗ trợ, nó là công cụ duy nhất sử dụng Arduino C ++ và nó là một công cụ rất hạn chế. Nếu bạn muốn sử dụng Eclipse, các công cụ AVR, đi chân trần trên dòng lệnh, phát triển trong Emacs hoặc bất kỳ môi trường nào khác bạn thích, C ++ tiêu chuẩn sẽ được hỗ trợ.

  • Arduino IDE thực hiện những việc sau lưng bạn - cụ thể, nó bao gồm các tệp .h khi nó nghĩ rằng bạn cần chúng. Ngay cả khi nó là chính xác, bạn thực sự muốn viết, hoặc ít nhất là nhìn và hiểu, tất cả mọi thứ trình biên dịch sẽ thấy. Ngôn ngữ lập trình không được tạo cho máy tính (máy tính ăn bit cho bữa sáng); chúng được tạo ra cho mọi người, cụ thể là những người theo dõi bạn trong dự án, người quan trọng nhất có thể là ... bạn!, khi 6 tháng sau khi bạn viết một mô-đun, bạn phải quay lại để cải thiện nó, hoặc hơn thế nữa có khả năng, sửa nó Bạn thực sự muốn có thể nhìn thấy mọi thứ mà trình biên dịch nhìn thấy.


2
Đây là một câu trả lời thực sự tốt. Có vẻ như rõ ràng rằng bạn thích C ++ và tôi cũng nên thích nó! ... Nhưng nghiêm túc, tôi sẽ nhảy ngay vào C ++ ngay khi tôi hiểu cách "giao tiếp" với các cảm biến khác nhau, v.v.
Bạn của Kim

Bạn có biết cuốn sách nào hay về chủ đề này không? (Phù hợp với tôi, người đã lập trình nhiều năm bằng các ngôn ngữ khác và chỉ cần "phần nhúng" của C ++.)
Người bạn của Kim

Bạn có nghĩ rằng Accelerated C ++ là một cuốn sách tốt cho việc này không?
Bạn của Kim

2
Tôi ước tôi có thể giúp bạn với cuốn sách 'đúng', nhưng tôi đã đến C ++ với rất nhiều C đằng sau tôi và Kernighan & Ritchie Ngôn ngữ lập trình C vẫn là cuốn sách tiếp theo của tôi (chơi chữ xấu) cho bất cứ điều gì không rõ ràng C ++ và Hướng dẫn tham khảo C ++ được chú thích cho C ++ của Ellis & Stroustrup . Nhưng để ghi vào phần cứng, bạn sẽ làm tốt việc xem xét một số thư viện thiết bị được đóng góp bởi người dùng tại Arduino.cc . Bắt đầu điều chỉnh các cổng I / O với các hàm pinMode (), digitalWrite () và digitalRead (), sau đó là các đối tác i / o tương tự của chúng, và cuối cùng, ...
JRobert

1
... có kế hoạch ghi trực tiếp vào các thanh ghi I / O để cải thiện tốc độ và không gian bộ nhớ. Các chương trình như blinky.cpp và hello.cpp là nơi tốt để bắt đầu loay hoay với phần cứng. Thêm một vạn năng đơn giản, và một vài đèn LED với các điện trở giới hạn dòng điện phù hợp được hàn vĩnh viễn vào một chân và bạn sẽ có thể nhìn thấy kết quả thực, nếu đơn giản, từ những nỗ lực của bạn. Sau đó, đọc các bảng dữ liệu cho bất kỳ phần cứng nào mà bạn quan tâm để tìm hiểu những tín hiệu bạn có thể đọc / phải ghi cho chúng để làm cho chúng phát. Cảm biến nhiệt độ rất dễ sử dụng và không phải ai cũng cần một bộ ghi chép tủ lạnh? Chúc vui vẻ!
JRobert

10

Theo kinh nghiệm của tôi, tốt nhất là tránh mớixóa khi chạy trên các máy có bộ nhớ hạn chế.

  • Bản thân việc quản lý bộ nhớ sử dụng không gian RAM và chương trình có giá trị
  • Các vectơ ISR được đặt tại biên dịch tme. Một trường hợp lớp rất khó để yêu cầu ISR trong thời gian chạy
  • Nói chung, bạn sẽ biết vào thời gian biên dịch những trường hợp lớp nào bạn cần - ví dụ: trình gỡ lỗi 3 nút, trình điều khiển hiển thị và trình điều khiển hiển thị 2 dòng
  • Quản lý bộ nhớ giới thiệu độ trễ không xác định khi bạn sử dụng mới hoặc xóa.

Có thể có trường hợp được sử dụng để xây dựng và phá hủy cá thể động, nhưng tôi nghi ngờ chúng rất hiếm.


Hoàn toàn mới đối với C ++, tôi có một câu hỏi tiếp theo liên quan đến STD. Có phải là một bộ nhớ ý tưởng xấu khôn ngoan để sử dụng nó? Nếu không, làm thế nào nó có thể được thêm vào (Eclipse)? Tôi đã thiết lập trình biên dịch AVR và nó hoạt động tốt.
Bạn của Kim

1
Tất cả những gì bạn nói là chính xác nhưng tôi không thấy đây là câu trả lời cho câu hỏi của OP. newdeletecó sẵn trong Arduino IDE.
jfpoilpret

Đó không phải là một câu trả lời, nhưng thông tin rất hữu ích mà tôi thực sự đánh giá cao.
Bạn của Kim

8

Như đã đề cập trong một số câu trả lời, nếu bạn đang lập trình một hệ thống nhúng nói chung, bạn nên tránh mới trừ khi bạn đang quản lý đống bộ nhớ của riêng mình và bạn thực sự biết vòng đời đối tượng của mình sẽ là gì. Phân bổ tĩnh hoặc biến stack là an toàn hơn nhiều. Điều đó nói rằng, một mẹo phổ biến để quản lý những thứ như bộ đệm có độ dài thay đổi được phân bổ cho thời lượng của hàm là có một biến tự động (trên ngăn xếp) là một đối tượng gọi mới trong hàm tạo của nó, sau đó đặt xóa trong hàm hủy vì vậy khi đối tượng đi ra khỏi phạm vi, bộ đệm được giải phóng trở lại heap. Một lần nữa, điều này thường được sử dụng hạn chế trong một ít micros nhưng nó là một mô hình đẹp để nhớ.


6

Ngoài các ý kiến ​​trên, tôi muốn nhấn mạnh thêm các vấn đề với RAM hoạt động mà bạn có trên bo mạch Arduino, đặc biệt là với Uno (và các thiết bị khác có chung vi điều khiển). Gần đây tôi đã viết một trò chơi Space Invaders đơn giản chạy trên ma trận LED 32x32 và liên tục gặp vấn đề do bộ nhớ thấp.

Uno chỉ có 2048 byte RAM. Thư viện cho ma trận của tôi chiếm hơn 3/4 số đó để lại cho tôi khoảng 400 byte cho trò chơi. Vì tôi có ý định "nâng cấp" dự án vào một lúc nào đó để chạy nhiều trò chơi với cùng một chương trình dựa trên cơ sở mạnh hơn, tôi đã thiết kế mã với hiệu trưởng OO và rất nhiều kế thừa lớp. (Lớp trò chơi được kế thừa với cập nhật ảo và thực hiện các cuộc gọi, các thực thể trò chơi đều được kế thừa).

Tôi gần như đã hết bộ nhớ chỉ cần thêm những kẻ xâm lược. Tôi đã cố gắng tiết kiệm bộ nhớ bằng cách bảo vệ các biến thành viên của chúng nhưng lại hết khi thêm các đối tượng khiên. Sau khi cào thêm một chút, tôi chạy ra thêm bom / đạn. Tại thời điểm này, tôi đã quét mã và xóa tất cả các thẻ "ảo" (tất cả các nguyên mẫu lớp của tôi được xây dựng từ đoạn mã Visual Assistant và các hàm hủy đều tự động ảo). Điều này giảm một nửa mức sử dụng bộ nhớ của tôi ngay lập tức, giải phóng đủ để có thể hoàn thành mã.

Tóm lại, kết quả cuối cùng là mã C ++ không thực sự sử dụng bất kỳ tính năng C ++ nào. Bạn cũng có thể chỉ cần gắn bó với C và rất ý thức về việc sử dụng bộ nhớ của bạn. Bạn sẽ không nhận được trợ giúp nếu vượt quá 2KB - đặc biệt nếu bạn đang sử dụng bất kỳ phân bổ động nào, mã chỉ dừng hoạt động và bạn sẽ gãi đầu trong một lúc cho đến khi bạn xem xét khả năng tràn bộ nhớ.

PS - Biến bảo vệ bit là xấu. Rất tệ. Ngoài việc thêm chi phí xử lý, tôi đã mất theo dõi số lần tôi thêm trạng thái mới vào trò chơi nhưng mã sẽ không chạy và tôi không thể hiểu tại sao. Biến trạng thái của tôi không đủ rộng để giữ giá trị trạng thái mới vì vậy tôi nhận được một số trạng thái bất ngờ.


4

Ngôn ngữ Arduino C ++ (mặc dù thường được triển khai theo kiểu giống như "C với các lớp", điều này thực sự khá phổ biến trong thế giới vi điều khiển hệ thống nhúng). Kết thúc câu chuyện. Đủ mọi người nghĩ rằng đó là một ngôn ngữ khác nhau! Nó sử dụng trình biên dịch g ++.

Bằng chứng:

Cho phép đầu ra dài dòng trong quá trình biên dịch trong Tùy chọn và tải lên và bạn sẽ học được rất nhiều chỉ bằng cách đọc những dòng đó.

Dưới đây là một số hiểu biết bổ sung:

Lời của tôi:

Mã Arduino C ++. Các chức năng cốt lõi của Arduino chỉ đơn giản là một tập hợp các lớp và thư viện C ++ mà bạn có thể sử dụng. Nó được xây dựng và biên dịch bằng trình biên dịch GNU gcc / g ++ . Các hàm setup () và loop () của bạn chỉ đơn giản được đặt vào hàm main () bắt buộc ( ngay tại đây thực sự - chú ý tệp là "main.cpp", là tệp nguồn C ++) tự động cho bạn và có thêm một số tiền xử lý được thực hiện để đảm bảo đó là chương trình C ++ hợp lệ (ví dụ: quét tất cả các nguyên mẫu hàm [aka: khai báo] cho bạn để bạn có thể sử dụng một hàm ngay cả khi nguyên mẫu của nó xuất hiện sau trong tệp .ino của bạn). Tuy nhiên, phần lớn Arduino được viết theo kiểu "C" và do đó yêu cầu các # extern "C" {}dấu ngoặc xung quanh nó để ngăn C ++ khỏiHàm "xáo trộn tên" (còn được gọi là "trang trí tên / trang trí tên" ) gọi các hàm C được thực hiện bởi AVR-libc , đây là triển khai C cho ATmega328 và các bộ vi điều khiển kiến trúc AVR khác .

Lời của Arduino:

" Tôi có thể lập trình bảng Arduino trong C không?
Thực tế, bạn đã có, ngôn ngữ Arduino chỉ là một tập hợp các hàm C / C ++ có thể được gọi từ mã của bạn. Bản phác thảo của bạn trải qua các thay đổi nhỏ (ví dụ: tạo nguyên mẫu hàm tự động) và sau đó được chuyển trực tiếp đến trình biên dịch C / C ++ (avr-g ++). Tất cả các cấu trúc C và C ++ tiêu chuẩn được avr-g ++ hỗ trợ sẽ hoạt động trong Arduino. Để biết thêm chi tiết, hãy xem trang về quy trình xây dựng Arduino . "

Nguồn: https://www.arduino.cc/en/Main/FAQ#toc13

Khi nào nên sử dụng thư viện Arduino so với C hoặc C ++ thuần túy?

Vì vậy, sử dụng ngôn ngữ Arduino nơi nó đơn giản hóa mọi thứ và viết các chức năng của riêng bạn, nơi bạn cần chuyên môn hóa nhiều hơn. Tôi khuyên bạn nên nhanh chóng thoát khỏi IDE để viết mã - chỉ cần sử dụng nó để biên dịch. Đặt tùy chọn IDE để sử dụng "Trình chỉnh sửa bên ngoài." Sau đó, sử dụng trình soạn thảo / IDE mã nguồn chuyên nghiệp như Sublime Text 3 , Atom , Visual Studio Code hoặc Eclipse CDT để viết mã của bạn. Sau đó, bạn có thể nhấp lại vào Arduino IDE để biên dịch và tải lên. Nếu bạn đi với Eclipse, có nhiều cách để làm điều đó trong Eclipse (xem các câu trả lời khác ở đây và cũng xem bài viết về sân chơi Arduino ở đây), vì vậy hãy xem xét sử dụng các kỹ thuật đó.

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.