C ++ กับภาษา Arduino?


81

อะไรคือข้อดีของแต่ละภาษาเมื่อใช้ Arduino?

ฉันคิดว่านี่เป็นคำถามทั่วไปที่ดี แต่ฉันจะเพิ่มอีกเล็กน้อยเกี่ยวกับสาเหตุที่ฉันถามว่ามีใครต้องการให้คำแนะนำแก่ฉันหรือไม่

ฉันมีประสบการณ์ในภาษาที่ได้รับการประมวลผลล่วงหน้าเช่น JavaScript, PHP และเล่นซอกับภาษาอย่าง Java และ Visual Basic กล่าวอีกนัยหนึ่งฉันรู้เทคนิคการเขียนโปรแกรมและการวางแนววัตถุคลาสสิกและต้นแบบ แต่ไม่มีอะไรเกี่ยวกับการสื่อสารโดยตรงกับฮาร์ดแวร์

ฉันทำอ็อคโทคอปเตอร์และฉันคิดว่าวิธีการเชิงวัตถุจะง่ายที่สุด (ซอฟต์แวร์จะมีคุณสมบัติมากมาย ... ) แต่ฉันไม่เคยเขียนใน C ++

เนื่องจากนี่เป็นเว็บไซต์ถามตอบที่ควรช่วยเหลือผู้อื่นคำถามทั่วไปที่นำเสนอในตอนแรกจึงมีความสำคัญมาก แต่ฉันขอขอบคุณสำหรับความคิดเห็นใด ๆ เกี่ยวกับสถานการณ์ของฉัน


16
หลีกเลี่ยง Arduino IDE เนื่องจากไม่สมควรใช้ชื่อ IDE มันเป็นตัวแก้ไขที่แย่มาก: มันอาจจะดีสำหรับผู้เริ่มต้นและร่างง่าย ๆ แต่ควรไปที่สิ่งที่ดีกว่าอย่างรวดเร็ว
jfpoilpret

4
นี่เป็นข้อสรุปที่ค่อนข้างชัดเจนของสิ่งที่มีความหมายโดย (และสิ่งที่อยู่ภายใต้การควบคุมของ) "ภาษาโปรแกรม Arduino"
AdjunctProfessorFalcon

10
C++ vs. The Arduino Language?- "Arduino Language" คือ C ++ มีบิตของการประมวลผลล่วงหน้าเพื่อช่วยให้คุณทำต้นแบบฟังก์ชั่น แต่แน่นอนที่สุดคือ C ++
Nick Gammon

2
ไม่มีสิ่งใดเป็นภาษาอาร์ดิโน มันเป็นเพียงห้องสมุด
Overdrivr

2
ไม่เกี่ยวข้องกับคำถามเกี่ยวกับความคิดเห็น: Atmel studio ไม่มีค่าใช้จ่ายและ IMHO จะดีกว่า visual studio สำหรับการเขียนโปรแกรม arduino รองรับปลั๊กอิน Visual Micro แม้ว่าจะไม่จำเป็นสำหรับการเขียนโปรแกรมและการดีบัก Arduino
cyberponk

คำตอบ:


55

ประสบการณ์ส่วนตัวของฉันในฐานะอาจารย์ (การเขียนโปรแกรมเมคคาทรอนิกส์) คือถ้าคุณมีประสบการณ์การเขียนโปรแกรมก่อนหน้านี้และคุณรู้ถึงแนวคิดของ OOP มันจะดีกว่าถ้าจะใช้ C / C ++ ภาษาอาร์ดิโนนั้นยอดเยี่ยมสำหรับผู้เริ่มต้น แต่มีข้อ จำกัด บางประการ (เช่นคุณต้องมีไฟล์ทั้งหมดในโฟลเดอร์เดียวกัน) และมันก็คือการทำให้ C / C ++ เป็นเรื่องง่าย (คุณสามารถคัดลอกและวางรหัส arduino ไปยังไฟล์ C / C ++ ได้และมันจะใช้ได้) นอกจากนี้ยังทำให้รู้สึกว่าคุณสามารถไปและใช้ IDE ที่รู้จักกันดีอย่างเต็มรูปแบบเป็น eclipse:

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

เริ่มแรกนั้นจำเป็นต้องมีการตั้งค่าและการกำหนดค่าสภาพแวดล้อมการพัฒนาของคุณอีกเล็กน้อย แต่ IMHO มันคุ้มค่าสำหรับโปรแกรมเมอร์ที่มีประสบการณ์ในภาษาอื่น ๆ

ไม่ว่าในกรณีใด ๆ มันจะไม่เป็นอันตรายต่อคุณในการเริ่มใช้ภาษา arduino และ arduino IDE สักสองสามวันเพื่อทำความคุ้นเคยกับฮาร์ดแวร์ arduino จากนั้นย้ายไปที่ C / C ++ ด้วย Eclipse เพื่อพัฒนาโครงการของคุณจริงๆ


ขอบคุณสำหรับความคิดของคุณ ฉันจะใช้ Arduino IDE เพื่อเรียนรู้วิธีควบคุมชิ้นส่วนฮาร์ดแวร์ต่าง ๆ เช่นเซ็นเซอร์และหน้าจอ LCD เป็นต้นจากนั้นฉันจะเลื่อนไปที่ C ++ เพื่อสร้างซอฟต์แวร์สำหรับ octocopter คุณรู้จักหนังสือเล่มสั้น ๆ ที่ดีสำหรับคนที่รู้จักภาษาอื่นหรือไม่? "ปัญหา" กับหนังสือหลายเล่มที่ฉันพบคือมันมีหลายอย่างที่ฉันไม่ต้องการเพราะฉันใช้ไมโครคอนโทรลเลอร์ Atmel ตัวเล็ก ๆ แทนที่จะเป็นคอมพิวเตอร์ UI
เพื่อนของ Kim

1
มีหนังสือดี "C Programming for Arduino" โดย Julien Bayle ซึ่งมีประโยชน์ เป็นภาษา C ไม่ใช่ภาษา C ++ แต่ควรช่วยให้คุณเข้าใจพื้นฐาน
fenix688

นั่นเป็นคำขอที่ดี: หนังสือเล่มสั้นและดีที่มีพื้นฐานของ C ++ สำหรับโปรแกรมเมอร์ของภาษาอื่น ๆ ขออภัยฉันไม่สามารถให้คำแนะนำใด ๆ ฉันไม่ได้ตระหนักถึงสิ่งที่ดี ในความเป็นจริงฉันเขียนหนังสือโดยให้ความสำคัญกับการใช้งานจริง (พัฒนาวิดีโอเกม) สำหรับนักเรียนของฉัน แต่มันเป็นภาษาสเปนเท่านั้น สำหรับหนังสือ C ++ ที่ดีและใช้งานได้จริงฉันขอแนะนำ Deitel & Deitel วิธีการเขียนโปรแกรม C ++ คุณสามารถข้ามหลาย ๆ บทขั้นสูงได้
drodri

1
C ++ รองรับคุณสมบัติ OO ภาษา C ไม่ได้
Chris O

1
@FriendofKim ไม่ใช่สิ่งที่ฉันหมายถึง (แม้ว่าคุณจะทำได้ในทางเทคนิคแต่ทว่ามันเร็วพอที่จะรองรับโซลูชันซอฟต์แวร์สำหรับการสื่อสารแบบอนุกรมที่ไม่ใช่เมกะบิตและมันมี ARU ทั้งหมด 5 U (S) ในขณะที่ห้องสมุด Arduino มีเพียง 4 แห่ง พวกเขา แต่ iirc คณะกรรมการกำหนดไม่ได้ให้พินสำหรับหนึ่งใน USARTs ต่อไป); ห้องสมุด Arduino กำหนดค่า USART ให้ใช้โหมดอะซิงโครนัส แต่ฉันต้องการซิงโครนัสที่สูงถึง 6Mbps (และฉันต้องใช้โหมด SPI เนื่องจากอินพุตต้องได้รับการปฏิบัติเหมือนเป็นบิตสตรีมดิบดังนั้นจึงไม่มีบิตหยุด / ฯลฯ ) การแก้ไขการกำหนดค่า PIO คอนโทรลเลอร์เริ่มต้น
JAB

48

ตามทฤษฎีแล้ว ...
ไม่มีภาษา Arduino เลยเช่นนี้ มันแค่ C ++ กับไลบรารี่เฉพาะโดเมน สิ่งเหล่านี้เพิ่มในคุณสมบัติต่าง ๆ เช่นฟังก์ชั่นที่คุณสามารถโทรเพื่อควบคุมฮาร์ดแวร์ หากคุณไม่มีฟังก์ชั่นเหล่านั้นคุณจะต้องทำเรื่องลับๆโดยตรงกับรีจิสเตอร์พิเศษเพื่อควบคุมทุกอย่าง นั่นคือวิธีการเขียนโปรแกรมแบบฝังที่มักจะทำ มันเร็ว แต่มันค่อนข้างยากที่จะเรียนรู้และเข้าใจ

นอกเหนือจากฟังก์ชั่นแล้วไลบรารียังเพิ่มชื่อทางเลือกสำหรับบางประเภท ตัวอย่างเช่นbooleanและbyteไม่อยู่ในมาตรฐาน C ++ แต่พวกเขาจะเทียบเท่าโดยตรงไปและboolunsigned char

ทุกสิ่งเหล่านี้หมายความว่าคุณสามารถโอนรหัสทั่วไป C ++ ไปยัง Arduino ได้โดยตรงโดยไม่ยาก อย่างไรก็ตามการกลับไปใช้วิธีอื่นอาจต้องมีการแก้ไขเล็กน้อย

ในทางปฏิบัติ ...
หลังจากที่กล่าวมาทั้งหมดการเขียนโปรแกรมสำหรับ Arduino ไม่เหมือนกับการเขียนโปรแกรม C ++ ทั่วไป มีความแตกต่างกันมากในการเขียนโปรแกรมแบบฝังตัวทั้งหมด (เช่นหน่วยความจำที่ จำกัด และกำลังการประมวลผล)

นอกจากนี้ยังเป็นที่น่าสังเกตว่าถ้าคุณใช้ Arduino IDE อย่างเป็นทางการมีข้อผิดพลาดและข้อ จำกัด ที่น่ารำคาญมากมายเกี่ยวกับวิธีการติดตั้งรหัสของคุณ มีวิธีแก้ปัญหาในทุกกรณี (เท่าที่ฉันทราบ) แต่บางครั้งก็ค่อนข้างน่าผิดหวัง

เพื่อความยืดหยุ่นเต็มที่ใช้ IDE บุคคลที่สาม (เช่น Eclipse) พร้อมกับปลั๊กอินเพื่อสนับสนุน Arduino นั่นควรให้ข้อดีทั้งหมดของ C ++ พร้อมกับไลบรารี Arduino


25

ข้อดีของ C ++ กับภาษา Arduino เมื่อใช้ Arduino คืออะไร ฉันมีประสบการณ์ในภาษาที่ได้รับการประมวลผลล่วงหน้าเช่น JavaScript, PHP และเล่นซอกับภาษาอย่าง Java และ Visual Basic

อันดับแรก Arduino คอมไพเลอร์ / IDE ยอมรับ C และ C ++ ตามที่เป็น ในความเป็นจริงห้องสมุดหลายแห่งเขียนด้วยภาษา C ++ ระบบพื้นฐานส่วนใหญ่ไม่ได้มุ่งเน้นวัตถุ แต่อาจเป็นไปได้

ดังนั้น "ภาษาอาร์ดิโน" คือ C ++ หรือ C

C ++ ไม่ใช่การรวบรวมขยะ มันจัดการตัวแปรในขอบเขต - ถ้าคุณเขียน:

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);
   }
}

จากนั้นคุณจะพบledและiไม่เติบโตหรือรั่วไหลไม่ว่าคุณจะโทรมากี่ครั้งblinkTimesก็ตาม

ถ้าiเป็นคลาสมันจะถูกกำจัดเช่นเดียวกันเมื่อฟังก์ชั่นสิ้นสุดลง ดังนั้นตราบใดที่คุณไม่ได้ใช้newหรือฟังก์ชั่นการจัดสรรหน่วยความจำที่คล้ายกันเพื่อสร้างวัตถุใหม่คุณก็ไม่ต้องกังวลกับรอยรั่ว

คุณอาจจะยังคงทำงานออกจากหน่วยความจำถ้าคุณสร้างชั้นเรียนขนาดใหญ่และใช้มากของพวกเขาในการทำงานที่ซ้อนกันอย่างลึกซึ้ง แต่โดยทั่วไปคุณจะไม่ได้ไปทำงานเป็นปัญหาจนกว่าคุณจะเริ่มจัดการกับnewและfreeฟังก์ชั่น

หากคุณใช้newงานอยู่คุณจะต้องโทรติดต่อdeleteในเวลาที่เหมาะสม C ++ และโดยส่วนขยาย Arduino ไม่มีการรวบรวมขยะอัตโนมัติคุณต้องจัดการหน่วยความจำของคุณเองอย่างชัดเจน


1
โอเคถ้าวัตถุอินสแตนซ์ (ใหม่) ไม่ได้เก็บขยะฉันจะต้องเรียนรู้เช่นกัน ฉันคิดว่าหนังสือเล่มใดก็ได้ใน C ++ จะกล่าวถึงสิ่งนั้น ขอบคุณสำหรับคำตอบที่ดี!
เพื่อนของ Kim

14

ภาษา Arduino คือ C ++ แต่มันแตกต่างจาก C ++ ส่วนใหญ่มาก ภาษา Arduino มีสิ่งที่เป็นนามธรรมมากมายในตัวโดยเฉพาะอย่างยิ่งในส่วนต่อประสานฮาร์ดแวร์ซึ่งทำให้ใช้งานได้ง่ายมาก หากคุณมีพื้นหลังใน Java, C และ C ++ ควรจะคล้ายกันมาก

ความแตกต่างที่สำคัญระหว่าง Arduino และ C ++ อยู่ในหน่วยความจำ โดยทั่วไปแล้วคอมพิวเตอร์สมัยใหม่จะมี RAM มากกว่า 2GB ในขณะที่ Arduino Uno มี 2kB (น้อยกว่า 1 ล้านเท่า) Arduino ยังใช้คำสั่ง 8 บิตแทน 32 บิตที่คอมพิวเตอร์ใช้ สิ่งนี้จะส่งผลต่อปริมาณข้อมูลที่คุณสามารถเก็บไว้ในตัวแปรได้

หากคุณยังใหม่กับโลกของ Arduino คุณควรค้นหาบทแนะนำเนื่องจากมีสิ่งดีๆมากมาย


คุณพูดถึงความทรงจำ ฉันมีกำหนดส่งซึ่งมี RAM 96KB แต่สิ่งสุดท้ายที่ฉันต้องการคือคอปเตอร์จะพังเพราะหน่วยความจำรั่ว (มีกล้องราคาแพงมากติดตั้งอยู่บนคอปเตอร์)
เพื่อนของ Kim

หน่วยความจำใน C ++ ถูกจัดการโดยอัตโนมัติ (เช่นตัวรวบรวมขยะใน Java) หากไม่ได้ระบุเป็นอย่างอื่นหรือไม่?
เพื่อนของ Kim

2
มาตรฐาน C ++ ไม่รับประกันเกี่ยวกับขนาดหน่วยความจำ - c ++ ทำงานบนฮาร์ดแวร์แบบฝังแล้วโดยไม่มีการดัดแปลง
Michael Thorpe

2
คุณกำลังอธิบายถึงความแตกต่างระหว่างแพลตฟอร์มฮาร์ดแวร์ไม่ใช่ C ++ ที่นั่น
Cybergibbons

5
@FriendofKim ใน C ++ มีสองวิธีที่แตกต่างกันในการสร้างอินสแตนซ์ตัวแปร / วัตถุ หากคุณยกตัวอย่างพวกมันในเครื่อง (เช่นint blah = 5;) พวกมันจะถูกทำลายโดยอัตโนมัติเมื่อพวกมันออกนอกขอบเขต (เช่นในตอนท้ายของลูปหรือฟังก์ชั่น) อย่างไรก็ตามหากคุณสร้างอินสแตนซ์เหล่านั้นบนฮีป (เช่นint *blah = new int(5);) คุณต้องปล่อยด้วยตัวคุณเอง ไม่ควรใช้ข้อมูลฮีปในการเขียนโปรแกรมแบบฝัง
Peter Bloomfield

14

--- อัปเดต 170412
ฉันเขียนคำตอบดั้งเดิมของฉันเมื่อสามปีก่อนจากมุมมองของ "Arduino C ++" ที่มีอยู่จริง ภาษาที่ใช้ใน IDE เป็นมาตรฐาน C ++ เนื่องจากมีการใช้งานโดยคอมไพเลอร์ GNU C ++ ความแตกต่าง "เด่นชัด" คืบคลานเข้ามาเพราะ IDE จะทำการประมวลผลล่วงหน้าเพื่อช่วยให้ผู้มาใหม่ในภาษาหลีกเลี่ยง 'gotcha's สองสามรายการโดยการเติม #includes, f / ex แต่คุณสามารถ - และฉันทำได้ - เขียน C ++ ที่ถูกต้องลงไปเพื่อรับสิ่งที่คุณคาดหวัง
--- การปรับปรุงสิ้นสุด

จำกัด การใช้งานคุณสมบัติภาษา C ++ ของคุณกับผู้ที่คุณเข้าใจการใช้งาน มีคุณสมบัติบางอย่างที่คอมไพล์ไปยังโค้ดที่ใช้ทรัพยากรมากเกินกว่าจะชัดเจนจากการอ่านซอร์สโค้ด รายชื่อ. ls (รวมแหล่งที่มาและแอสเซมบลี) ที่สร้างขึ้นสามารถให้ข้อมูลเชิงลึกที่ดีแก่คุณเกี่ยวกับสิ่งที่คอมไพเลอร์ C ++ ทำเมื่อคุณไม่ได้มอง

สำหรับคำถามของคุณเกี่ยวกับหน่วยความจำ: C ++ ไม่ได้เก็บขยะ ภาษาที่ใช้สแต็กเช่น C และ C ++ จะจัดสรรหน่วยเก็บชั่วคราวบนสแต็กสำหรับตัวแปรอัตโนมัติที่รายการฟังก์ชันซึ่งจะถูกปล่อยเมื่อฟังก์ชันส่งคืน แต่นี่ไม่ใช่การรวบรวมขยะจริง วัตถุที่สร้างในหน่วยความจำฮีปหรือโกลบอลจะอยู่จนกว่าคุณจะลบออกอย่างชัดเจน ตรวจสอบให้แน่ใจว่าคุณรู้ว่าจะสร้างวัตถุประเภทใดเวลาและระยะเวลา คุณไม่ต้องการให้โค้ดnewและdeleteวัตถุของคุณจำใจคุณมาก พวกเขาจะถูกสร้างขึ้นในหน่วยความจำกองแยกส่วนและทำให้มันเติบโตขึ้นมาในกอง นั่นคือเมื่อรหัสของคุณ - และเฮลิคอปเตอร์ดีของคุณ - จะผิดพลาด

C ไม่น้อยสำหรับคุณเพื่อให้มันสามารถทำน้อยเพื่อคุณ มันไม่ใช่ทางเลือกที่ไม่ดี C ที่มีคุณสมบัติบางอย่างของ C ++ อาจเป็นตัวเลือกที่ดียิ่งขึ้นเนื่องจากคุณเลือกคุณสมบัติพิเศษอย่างรอบคอบ C ++ หากเป็นสองตัวเลือกของคุณ:

[คำตอบดั้งเดิม] - C ++ เป็นภาษามาตรฐาน มันถูกนำไปใช้อย่างกว้างขวางในสภาพแวดล้อมหลายแห่งรวมถึงระบบฝังตัวและดังนั้นจึงมีการทดสอบอย่างละเอียดมากกว่าภาษาที่เหมือน C ++ นั่นคือ "Arduino" สิ่งนี้มีความสำคัญอย่างยิ่งสำหรับแอปพลิเคชั่นที่สำคัญต่อภารกิจ / ความปลอดภัยที่สำคัญเช่นคุณกำลังวางแผน รหัสที่ล้มเหลวหมายถึงคอปเตอร์ 'ที่ผิดพลาดและแม้ว่ามันจะไม่ทำร้ายใครสักคนมันก็จะทำลายเครื่องจักรราคาแพงของคุณ

  • เป็นมาตรฐาน C ++ เป็นแบบพกพา ต้องการอัพเกรดโปรเซสเซอร์ของคุณหรือไม่ ทุกอย่างยกเว้นรหัสเฉพาะซิลิคอนจะย้ายไปที่ใหม่ ต้องการเปลี่ยนชุดเครื่องมือระบบการพัฒนาโฮสต์ระบบปฏิบัติการของคุณหรือไม่ C ++ จะได้รับการสนับสนุนทุกที่ แม้ว่า Arduino IDE จะทำงานได้ทุกที่ที่ Java รองรับ แต่เป็นเครื่องมือเดียวที่ใช้ Arduino C ++ และเป็นเครื่องมือที่มีข้อ จำกัด มาก หากคุณต้องการใช้ Eclipse, เครื่องมือ AVR, ไปที่เท้าเปล่าบนบรรทัดคำสั่ง, พัฒนาภายใน Emacs, หรือสภาพแวดล้อมอื่น ๆ ที่คุณต้องการ, C ++ มาตรฐานจะได้รับการสนับสนุน

  • Arduino IDE ทำสิ่งต่าง ๆ ที่อยู่ด้านหลังของคุณ - โดยเฉพาะมันรวมถึงไฟล์. h เมื่อมันคิดว่าคุณต้องการ แม้ว่ามันจะถูกต้อง แต่คุณต้องการเขียนหรืออย่างน้อยก็เห็นและเข้าใจทุกอย่างที่คอมไพเลอร์จะเห็น ภาษาโปรแกรมไม่ได้ถูกสร้างขึ้นสำหรับคอมพิวเตอร์ (คอมพิวเตอร์กินบิตเป็นอาหารเช้า) พวกเขาถูกสร้างขึ้นมาเพื่อคนโดยเฉพาะคนที่ติดตามคุณในโครงการสิ่งที่สำคัญที่สุดของใครคือ ... คุณ! เมื่อ 6 เดือนหลังจากที่คุณเขียนโมดูลคุณจะต้องกลับมาปรับปรุงอีกครั้งหรือมากกว่านั้น น่าจะแก้ไขได้ คุณต้องการเห็นทุกสิ่งที่คอมไพเลอร์เห็น


2
นี่เป็นคำตอบที่ดีจริงๆ ดูเหมือนชัดเจนว่าคุณชอบ C ++ และฉันก็ควรจะชอบเช่นกัน! ... แต่อย่างจริงจังฉันจะกระโดดเข้าสู่ C ++ ทันทีที่ฉันเข้าใจว่า "การสื่อสาร" กับเซ็นเซอร์ต่าง ๆ ทำงานอย่างไร
เพื่อนของ Kim

คุณรู้จักหนังสือดีๆในเรื่องนี้บ้างไหม? (เหมาะสำหรับฉันที่ได้เขียนโปรแกรมมาหลายปีในภาษาอื่นและต้องการ "ส่วนที่ฝังไว้" ของ C ++ เท่านั้น)
เพื่อนของ Kim

คุณคิดว่าAccelerated C ++เป็นหนังสือที่ดีสำหรับเรื่องนี้หรือไม่?
เพื่อนของ Kim

2
ฉันหวังว่าฉันจะช่วยคุณในหนังสือ 'ที่ถูกต้อง' แต่ฉันมาที่ C ++ ด้วย C จำนวนมากที่อยู่ข้างหลังฉันและ Kernighan & Ritchie ของC Programming Language Languageยังเป็นหนังสือที่ใช้งานไม่ได้สำหรับสิ่งที่ไม่ชัดเจน C ++ , และ Ellis & Stroustrup ของคู่มืออ้างอิง C ++ ที่มีคำอธิบายประกอบสำหรับ C ++ แต่สำหรับการเขียนไปยังฮาร์ดแวร์คุณจะทำได้ดีในการดูบางส่วนของไลบรารีอุปกรณ์ที่ผู้ใช้ที่Arduino.ccใช้ เริ่มต้นปรับแต่งพอร์ต I / O ด้วยฟังก์ชั่น pinMode (), digitalWrite () และ digitalRead () จากนั้นจะใช้อะนาล็อก i / o อะนาล็อกและในที่สุด ...
JRobert

1
... วางแผนที่จะเขียนลงทะเบียน I / O โดยตรงเพื่อปรับปรุงความเร็วและพื้นที่หน่วยความจำ โปรแกรมอย่าง blinky.cpp และ hello.cpp เป็นสถานที่ที่ดีในการเริ่มเล่นกับฮาร์ดแวร์ เพิ่มมัลติมิเตอร์แบบธรรมดาและ LED บางตัวด้วยตัวต้านทาน จำกัด กระแสไฟที่ถูกต้องซึ่งถูกบัดกรีให้ขาเดียวอย่างถาวรและคุณควรจะเห็นจริงถ้าเป็นผลมาจากความพยายามของคุณ หลังจากนั้นอ่านแผ่นข้อมูลสำหรับฮาร์ดแวร์ใด ๆ ที่คุณสนใจเพื่อเรียนรู้สัญญาณที่คุณสามารถอ่าน / ต้องเขียนถึงพวกเขาเพื่อให้พวกเขาเล่น เซ็นเซอร์วัดอุณหภูมิใช้งานง่ายและทุกคนไม่จำเป็นต้องมีคนตัดไม้ตู้เย็น? มีความสุข!
JRobert

10

จากประสบการณ์ของฉันดีที่สุดคือหลีกเลี่ยงสิ่งใหม่และลบเมื่อใช้กับเครื่องที่มีหน่วยความจำ จำกัด

  • การจัดการหน่วยความจำตัวเองใช้โปรแกรมที่มีคุณค่าและพื้นที่แรม
  • ISR vector ถูกตั้งค่าไว้ที่คอมไพล์ tme มันเป็นเรื่องยาก (เป็นไปไม่ได้?) สำหรับอินสแตนซ์ของคลาสที่จะเรียกร้อง ISR ในเวลาทำงาน
  • โดยทั่วไปคุณจะรู้ในเวลารวบรวมว่าอินสแตนซ์ของคลาสใดที่คุณต้องการ - เช่นตัวถอดรหัสปุ่ม 3 ตัว, ไดรเวอร์การแสดงผลและไดรเวอร์การแสดงผล 2 บรรทัด
  • การจัดการหน่วยความจำจะทำให้เกิดความล่าช้าที่ไม่รู้จักเมื่อคุณใช้ใหม่หรือลบ

อาจมีบางกรณีที่มีความชอบธรรมที่จะใช้การสร้างและการทำลายอินสแตนซ์แบบไดนามิก แต่ฉันสงสัยว่ามันหายาก


เป็นสิ่งใหม่สำหรับ C ++ โดยสมบูรณ์ฉันมีคำถามติดตามเกี่ยวกับ STD ควรใช้หน่วยความจำที่ไม่ดีหรือไม่? หากไม่สามารถเพิ่มได้อย่างไร (Eclipse) ฉันได้ตั้งค่าคอมไพเลอร์ AVR และมันทำงานได้ดี
เพื่อนของ Kim

1
ทุกสิ่งที่คุณพูดถูกต้อง แต่ฉันไม่เห็นว่านี่เป็นคำตอบสำหรับคำถาม OP newและdeleteมีอยู่ใน Arduino IDE ด้วย
jfpoilpret

มันไม่ใช่คำตอบ แต่เป็นข้อมูลที่มีประโยชน์มากที่ฉันชื่นชม
เพื่อนของ Kim

8

ดังที่ได้กล่าวไว้ในคำตอบหลายข้อหากคุณกำลังวางโปรแกรมระบบฝังตัวโดยทั่วไปคุณควรหลีกเลี่ยงสิ่งใหม่เว้นแต่ว่าคุณกำลังจัดการฮีปหน่วยความจำของคุณเองและคุณรู้ว่าวงจรชีวิตวัตถุของคุณคืออะไร การจัดสรรแบบคงที่หรือตัวแปรสแต็กนั้นปลอดภัยกว่ามาก ที่กล่าวว่าเคล็ดลับหนึ่งที่พบบ่อยในการจัดการสิ่งที่ต้องการบัฟเฟอร์ยาวตัวแปรจัดสรรสำหรับระยะเวลาของฟังก์ชั่นที่จะมีตัวแปรอัตโนมัติ (ในกอง) ที่เป็นวัตถุที่เรียกใหม่ในตัวสร้างของมันแล้วใส่ลบในเตาเผา ดังนั้นเมื่อวัตถุออกนอกขอบเขตบัฟเฟอร์จะถูกปล่อยกลับไปที่ฮีป อีกครั้งนี้มักจะถูก จำกัด การใช้งานในไมโครเล็ก ๆ น้อย ๆ แต่มันเป็นรูปแบบที่ดีที่จะจำ


6

นอกจากความคิดเห็นข้างต้นแล้วฉันขอเน้นย้ำปัญหาที่เกิดขึ้นกับ RAM ทำงานที่คุณมีบนบอร์ด Arduino โดยเฉพาะกับ Uno (และอื่น ๆ ที่ใช้ไมโครคอนโทรลเลอร์เดียวกัน) ฉันเพิ่งเขียนเกม Space Invaders ง่ายๆที่ทำงานบนเมทริกซ์ LED ขนาด 32x32 และพบปัญหาที่เกิดจากหน่วยความจำเหลือน้อย

Uno มี RAM 2048 ไบต์เท่านั้น ห้องสมุดสำหรับเมทริกซ์ของฉันใช้เวลา 3/4 ของที่ทิ้งฉันไว้ที่ประมาณ 400 ไบต์สำหรับเกม เนื่องจากฉันตั้งใจที่จะ "อัปเกรด" โครงการในบางจุดเพื่อให้ทำงานหลาย ๆ เกมด้วยโปรแกรมเดียวกันบนพื้นฐานอันทรงพลังยิ่งขึ้นฉันออกแบบรหัสด้วยหลักการ OO และการสืบทอดชั้นเรียนจำนวนมาก (คลาสของเกมได้รับการสืบทอดด้วยการอัพเดตเสมือนและการโทรออก

ฉันแทบหมดหน่วยความจำแค่เพิ่มผู้บุกรุก ฉันพยายามที่จะบันทึกความทรงจำโดย bit-fielding ตัวแปรสมาชิกของพวกเขา แต่วิ่งออกไปอีกครั้งเมื่อเพิ่มวัตถุโล่ หลังจากขูดเพิ่มอีกนิดฉันก็วิ่งออกไปเพิ่มลูกระเบิด / กระสุน ณ จุดนี้ฉัน scoured รหัสและลบแท็ก "เสมือน" ทั้งหมด (ต้นแบบคลาสของฉันทั้งหมดถูกสร้างขึ้นจากข้อมูลโค้ด Visual Assist และ destructors เป็นเสมือนทั้งหมดโดยอัตโนมัติ) ทำให้การใช้งานหน่วยความจำของฉันลดลงครึ่งหนึ่งในทันทีทำให้มีรหัสเพียงพอ

เรื่องสั้นสั้น ๆ ผลลัพธ์ที่ได้คือรหัส C ++ ที่ไม่ได้ใช้คุณสมบัติ C ++ ใด ๆ คุณอาจติดกับ C และระวังการใช้หน่วยความจำของคุณ คุณไม่ได้รับความช่วยเหลือหากคุณเกิน 2KB - โดยเฉพาะถ้าคุณใช้การจัดสรรแบบไดนามิกรหัสจะหยุดทำงานและคุณจะเกาหัวในขณะที่จนกว่าคุณจะพิจารณาความเป็นไปได้ของหน่วยความจำล้น

PS - ตัวแปรฟีลดิงบิตไม่ดี ที่เลวร้ายมาก. นอกเหนือจากการเพิ่มค่าใช้จ่ายในการประมวลผลแล้วฉันยังไม่ได้ติดตามจำนวนครั้งที่ฉันเพิ่มสถานะใหม่ให้กับเกม แต่รหัสจะไม่ทำงานและฉันไม่เข้าใจว่าทำไม ตัวแปรสถานะของฉันไม่กว้างพอที่จะเก็บค่าสถานะใหม่ดังนั้นฉันจึงได้รับสถานะที่ไม่คาดคิด


4

ภาษา Arduino คือ C ++ (แม้ว่าโดยทั่วไปแล้วจะนำมาใช้ในรูปแบบอื่น ๆ เช่น "C กับคลาส" ซึ่งจริงๆแล้วเป็นเรื่องธรรมดาในโลกไมโครคอนโทรลเลอร์ระบบฝังตัว) ตอนจบของเรื่อง. พอมีคนคิดว่ามันเป็นภาษาอื่นแล้ว! มันใช้คอมไพเลอร์ g ++

พิสูจน์:

เปิดใช้งานเอาต์พุต verbose ระหว่างการคอมไพล์ในค่ากำหนดและอัปโหลดและคุณจะได้เรียนรู้มากมายเพียงแค่อ่านบรรทัดเหล่านั้น

นี่คือข้อมูลเชิงลึกเพิ่มเติม:

คำพูดของฉัน:

รหัส Arduino คือ C ++ ฟังก์ชั่นหลักของ Arduino เป็นเพียงชุดของคลาส C ++ และไลบรารีที่คุณสามารถใช้ได้ มันถูกสร้างขึ้นและเรียบเรียงโดยใช้gcc GNU / g ++ คอมไพเลอร์ ฟังก์ชั่นการตั้งค่า () และลูป () ของคุณนั้นง่ายต่อการใส่ลงในฟังก์ชั่นบังคับหลัก () ที่นี่ (จริง ๆ แล้ว -อย่าสังเกตว่าไฟล์คือ "main.cpp" ซึ่งเป็นไฟล์ต้นฉบับ C ++) โดยอัตโนมัติสำหรับคุณ การดำเนินการล่วงหน้าเพื่อให้แน่ใจว่าเป็นโปรแกรม C ++ ที่ถูกต้อง (เช่นการสแกนหาฟังก์ชั่นต้นแบบทั้งหมด [aka: declarations] สำหรับคุณเพื่อให้คุณสามารถใช้ฟังก์ชันได้แม้ว่าต้นแบบจะมาในภายหลังในไฟล์. io ของคุณ) Arduino ส่วนใหญ่เขียนด้วย "C style" อย่างไรก็ตามดังนั้นจึงจำเป็นต้องใช้เครื่องมือ# extern "C" {}จัดฟันเพื่อป้องกัน C ++"name-mangling" (หรือเรียกอีกอย่างว่า"ชื่อการตกแต่ง / การตกแต่งชื่อ" ) เรียกใช้ฟังก์ชัน C ที่นำมาใช้โดยAVR-libcซึ่งเป็นการใช้งาน C สำหรับ ATmega328 และไมโครคอนโทรลเลอร์สถาปัตยกรรม AVRอื่น ๆ

คำพูดของ Arduino:

" ฉันสามารถเขียนโปรแกรมบอร์ด Arduino เป็นภาษา C ได้หรือไม่
ในความเป็นจริงแล้วภาษา Arduino เป็นเพียงชุดของฟังก์ชั่น C / C ++ ที่สามารถเรียกใช้จากรหัสของคุณได้ร่างของคุณผ่านการเปลี่ยนแปลงเล็กน้อย (เช่นการสร้างต้นแบบอัตโนมัติ จากนั้นจะถูกส่งโดยตรงไปยังคอมไพเลอร์ C / C ++ (avr-g ++) โครงสร้าง C และ C ++ มาตรฐานทั้งหมดที่สนับสนุนโดย avr-g ++ควรทำงานใน Arduino สำหรับรายละเอียดเพิ่มเติมดูหน้ากระบวนการสร้าง Arduino "

ที่มา: https://www.arduino.cc/en/Main/FAQ#toc13

เมื่อใดที่จะใช้ห้องสมุด Arduinoกับ pure C หรือ C ++

ดังนั้นใช้ภาษา Arduino เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้นและเขียนฟังก์ชั่นของคุณเองที่คุณต้องการความเชี่ยวชาญมากขึ้น ฉันแนะนำให้หลีกเลี่ยง IDE อย่างรวดเร็วแม้ว่าจะเป็นการเขียนโค้ด - เพียงแค่ใช้เพื่อการคอมไพล์ ตั้งค่าการกำหนดลักษณะ IDE เพื่อใช้ "ตัวแก้ไขภายนอก" จากนั้นใช้เครื่องมือแก้ไขซอร์สโค้ดมืออาชีพ / IDE เช่นSublime Text 3 , Atom , Visual Studio CodeหรือEclipse CDTเพื่อเขียนโค้ดของคุณ จากนั้นคุณสามารถคลิกกลับไปที่ Arduino IDE เพื่อรวบรวมและอัพโหลด หากคุณไปกับ Eclipse มีวิธีการทำเช่นนั้นใน Eclipse (ดูคำตอบอื่น ๆ ที่นี่และดูบทความ Arduino playground Eclipseที่นี่ด้วย) ดังนั้นให้พิจารณาใช้เทคนิคเหล่านั้นด้วย

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