เป็นไปได้ไหมที่จะเขียนโค้ดใน C ++ สำหรับไมโครคอนโทรลเลอร์ PIC ในอนาคต?


8

เป็นไปได้ไหมที่จะใช้ C ++ สำหรับการเข้ารหัส PICs? มีข้อ จำกัด ด้านฮาร์ดแวร์ใด ๆ ที่ทำให้เราไม่สามารถใช้ C ++ ได้หรือไม่? ขนาดของไฟล์. hex ที่สร้างขึ้นและเวลาในการทำงานของโปรแกรมเพิ่มขึ้นเท่าใดเมื่อเราใช้ C ++ แทน C? เป็นไปได้หรือไม่ที่จะใช้ C ++ สำหรับ PIC ปัจจุบัน มีแผนในอนาคตหรือการพัฒนาอย่างต่อเนื่องในเรื่องนี้หรือไม่?


ฉันคิดว่ามันเป็นไปได้และจะยังคงเป็นไปได้ แต่ AFAIK ไม่แนะนำเนื่องจากใช้โครงสร้างและฟังก์ชั่นระดับสูงที่ไม่เหมาะสำหรับการเขียนโปรแกรมที่เกี่ยวข้องกับฮาร์ดแวร์อย่างยิ่ง
clabacchio

3
สำหรับการอภิปรายความเหมาะสม - electronics.stackexchange.com/questions/3027/…
Toby Jaffey

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

2
@clabacchio: ไม่จำเป็นต้องเป็นจริง ใน C ++ คุณจ่ายเฉพาะสิ่งที่คุณใช้ ดูคำตอบของฉันได้ที่: electronics.stackexchange.com/questions/3027/…
Rocketmagnet

"PICs" เป็นลักษณะทั่วไปที่ไร้ประโยชน์ สำหรับ PIC ต่ำสุด (คิดว่า 10F200) C แทบจะเป็นไปไม่ได้ที่จะใช้ ในบาง PICs ระดับสูง (ซีรีย์ 32MX) C ++ ได้ถูกนำมาใช้ในตอนนี้และแน่นอนว่าไม่มีเหตุผลทางเทคนิคใด ๆ ที่ทำให้มันใช้งานไม่ได้ ดังนั้นการมุ่งเน้นที่ดีขึ้นบางคนอาจให้คำตอบที่เป็นประโยชน์มากขึ้นตอนนี้ทุกคนมีผลตอบคำถามต่าง ๆ
Wouter van Ooijen

คำตอบ:


17

เป็นไปได้ไหมที่จะใช้ C ++ สำหรับการเข้ารหัส PICs?

ใช่มันเป็นไปได้แล้ว สำหรับ dsPIC มีคอมไพเลอร์ IAR Systems C ++ (แม้ว่าจะเก่ามากและไม่รองรับ)

อีกตัวเลือกหนึ่งคือใช้ตัวแปลง C ++ เป็น C ใช้ขั้นตอนที่สร้างไว้ล่วงหน้าแปลง C ++ เป็น C จากนั้นให้ C ที่น่ารังเกียจแก่คอมไพเลอร์ C ของคุณ ดูLLVMหรือคอมไพเลอร์ C ++ ของ Comeauซึ่งทั้งคู่ทำเช่นนั้น Comeau's มีราคาเพียง $ 50 แต่อาจต้องใช้ความพยายามเพื่อให้ toolchain ทั้งหมดและไลบรารีทำงานอย่างถูกต้อง

มีข้อ จำกัด ด้านฮาร์ดแวร์ใด ๆ ที่ทำให้เราไม่สามารถใช้ C ++ ได้หรือไม่?

คำตอบสั้น ๆ ไม่มีข้อ จำกัด ของฮาร์ดแวร์ คำตอบยาว ๆ C ++ สนับสนุนให้ใช้ฮีปและ / หรือสแต็คอย่างแน่นอนซึ่ง MCUs ขนาดเล็กที่มี RAM จำกัด จะต่อสู้กับ

ทำไมพวกเขาถึงต่อสู้กับกอง / กอง? ด้วยเหตุผลสองประการ: ก) MCU จำนวนมากมี RAM จำกัด ไม่เพียงพอสำหรับฮีปอย่างแน่นอนและแทบจะไม่เพียงพอสำหรับสแต็ก B) MCUs จำนวนมากไม่จัดการพอยน์เตอร์ได้ดีดังนั้นการใช้ตัวแปรบนสแต็คจะฆ่าประสิทธิภาพ

เมื่อมีคนถามเกี่ยวกับการใช้ C ++ ใน MCU ฉันคิดว่ามันเป็นสิ่งที่สร้างสรรค์เพื่อเปรียบเทียบ C ++ กับ C คำถามที่เหมือนกันคือถาม (และยังคง) ถามเกี่ยวกับ C ใน MCU ผู้คนเคยหยุดชะงักความคิด ภาษาระดับสูงบน 256 RAM RAM ไบต์? เป็นไปไม่ได้ แต่ตอนนี้เราทุกคนรู้ว่ามันเป็นไปได้ ฉันเขียน C สำหรับ PIC12 ไม่มีปัญหา. เป็นไปได้เพราะก) นักพัฒนาซอฟต์แวร์รู้ว่าพวกเขาจะต้องระมัดระวังนิดหน่อย: อย่าใช้ malloc () ฯลฯ และ B) คอมไพเลอร์ถูกเขียนโดยเฉพาะสำหรับ MCU คอมไพเลอร์จะต้องระมัดระวังเป็นพิเศษกับการจัดสรรหน่วยความจำมันจะไม่พยายามสร้างฮีปและอาจไม่สร้างสแต็ก คอมไพเลอร์ C บางตัวจะไม่ยอมให้คุณเขียนรหัสผู้เรียกซ้ำ (recursive) ซึ่งต้องการสแต็กอย่างแน่นอน

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

ตอนนี้ PIC32s สามารถรับมือกับ C ++ ได้อย่างแน่นอน พวกเขามี RAM สูงสุด 64kB และขึ้นอยู่กับ MIPS core ซึ่งเป็นโปรเซสเซอร์ 32 บิตที่โตขึ้นอย่างเหมาะสม มันสามารถจัดการกับพอยน์เตอร์และสแต็กเช่นเดียวกับพีซี อันที่จริงมีพีซีที่ใช้ MIPS (หรืออย่างน้อยก็เคยมี)

น่าเศร้าที่มีภาษาซีพลัสพลัสอยู่รอบตัว แม้แต่ผู้เขียนโค้ดที่มีประสบการณ์มากก็ยังไม่รู้ว่าภาษาทำงานอย่างไร ดูคำตอบของฉันว่าทำไม C ++ จึงเหมาะสมกับซีพียูในตัว

ขนาดของไฟล์. hex ที่สร้างขึ้นและเวลาในการทำงานของโปรแกรมเพิ่มขึ้นเท่าใดเมื่อเราใช้ C ++ แทน C?

อย่างที่ฉันบอกไปแล้วอาจจะไม่มีความแตกต่าง Bjarne Stroustrup ทำการเปรียบเทียบคอมไพเลอร์ C / C ++ จำนวนมากเพื่อเปรียบเทียบเวลาและประสิทธิภาพของพื้นที่สำหรับการปฏิบัติงานจำนวนมาก ผลลัพธ์ที่แตกต่างกันอย่างกว้างขวาง ในบางกรณี C ++ ออกมาช้าลงและใหญ่ขึ้นบางกรณีช้าลงและเล็กลงหรือเร็วขึ้นและใหญ่ขึ้นและเร็วขึ้นและเล็กลง! ดังนั้นคำตอบสำหรับคำถามของคุณคือมันขึ้นอยู่กับคอมไพเลอร์เป็นหลัก แต่โดยทั่วไปแล้วมันไม่จำเป็นต้องสร้างความแตกต่างเลย สำหรับรายละเอียดเพิ่มเติมดูรายงานทางเทคนิคเกี่ยวกับประสิทธิภาพของ C ++

มีแผนในอนาคตหรือการพัฒนาอย่างต่อเนื่องในเรื่องนี้หรือไม่?

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


UPDATE

ขณะนี้ Microchip มีคอมไพเลอร์ C ++สำหรับ PIC32 ที่ฝังอยู่



จากหน้าเว็บ IAR: "ผลิตภัณฑ์รุ่นเก่า: IAR Embedded Workbench สำหรับ dsPIC เป็นผลิตภัณฑ์รุ่นเก่าระบบ IAR ไม่อัปเดตและไม่สามารถซื้อข้อตกลงการสนับสนุนและอัปเดตได้"
Jason S

ฉันรู้ว่าผลิตภัณฑ์ IAR นั้นยอดเยี่ยม แต่น่าเสียดายที่ราคาแพงมากและดูเหมือนว่า 'เก่า' ฉันรู้ว่า C ++ เป็นไปได้ในทุกแพลตฟอร์มตราบใดที่คุณไม่ได้ใช้คุณสมบัติทั้งหมด อย่างไรก็ตามมันเพิ่มความเป็นไปได้สำหรับเลเยอร์สิ่งที่เป็นนามธรรมด้วยคลาส ฉันไม่ได้ใช้เทมเพลตบ่อยครั้งฉันไม่ได้ใช้การจัดสรรหน่วยความจำแบบไดนามิกเลย ไม่มีใครรู้ว่าคู่แข่งคนอื่น ๆ สำหรับ C ++ ใน PIC24 / PIC32 หรือไม่?
ฮันส์

ใช่ขอโทษมันไม่ใช่การค้นหาที่ยอดเยี่ยมจริงๆ ให้ฉันเพิ่มสิ่งเพิ่มเติมลงในคำตอบของฉัน
Rocketmagnet

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

1
มีใครถามว่า: "คุณลักษณะใดของ C ที่ต้องมีที่ไม่สามารถยุ่งเหยิงใน ASM ได้" ตอบว่า "ไม่มีอะไร" ประโยชน์คือความสามารถที่เพิ่มขึ้นสำหรับนักออกแบบเพื่อระบุการออกแบบและให้คอมไพเลอร์ตรวจสอบการใช้งานที่ถูกต้อง ดูคำตอบของฉันelectronics.stackexchange.com/questions/3027/…สำหรับรายการผลประโยชน์ที่แท้จริงและทันทีของ C ++ ในเรื่องนี้
Rocketmagnet

5

ขนาดของไฟล์. hex ที่สร้างขึ้นและเวลาในการทำงานของโปรแกรมเพิ่มขึ้นเท่าใดเมื่อเราใช้ C ++ แทน C?

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

หากคุณคลั่งไคล้อย่างเต็มที่และดึงสิ่งต่าง ๆ เช่นไลบรารีเทมเพลตมาตรฐานและใช้การจัดสรรหน่วยความจำแบบไดนามิกและข้อยกเว้นคุณก็น่าจะพบกับการขยายตัวของโค้ด


เพียงแค่คำเตือนสำหรับ OP ให้ระมัดระวังอย่างมากเกี่ยวกับการจัดสรรหน่วยความจำบนสถาปัตยกรรมหน่วยความจำขนาดเล็กและฝังตัวอยู่เสมอเรียกใช้ระบบ
เคนนี

เอ่อ "-1" ได้โปรดคอมเม้นว่าทำไมเขา / เธอไม่เห็นด้วย?
Jason S

ฉันไม่ใช่ -1er แต่เทมเพลตเป็นคุณสมบัติที่ต้องใช้ด้วยความระมัดระวังเพื่อหลีกเลี่ยงการขยายตัวของโค้ด คุณสามารถจบลงด้วยชุดของอัลกอริทึมจำนวนมากเมื่อหนึ่งพอเพียง
Peter Green

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


1

สำหรับคำถามทั่วไปของคุณมีโปรเซสเซอร์ ARM ที่สร้างขึ้นสำหรับตลาดแบบฝังที่มี MMU (หน่วยจัดการหน่วยความจำ) ขนาดหน่วยความจำและการจัดสรรทำให้ภาษาเช่น java และ c ++ ตัวเลือกการฝังตัวไม่ดี ในขณะที่ตัวประมวลผลแบบฝังตัวยังคงทำงานได้เร็วขึ้นและมีประสิทธิภาพยิ่งขึ้นและเมื่อหน่วยความจำมีความหนาแน่นและราคาถูกลงตัวเลือกภาษาที่มีให้สำหรับวิศวกรแบบฝังจะเปลี่ยนไปอย่างมาก โปรเซสเซอร์ ARM 32- บิต 600MHz พร้อม MMU และการ์ดแฟลช 64G เป็นตัวเลือกที่ยอดเยี่ยมสำหรับแอปพลิเคชัน c ++ ไม่ว่าจะเหมาะกับนิยามของหน่วยประมวลผลกลางแบบฝังตัวที่เป็นปัญหาอื่น


0

อาจเป็นไปได้ .. แต่คุณไม่ควรทำเช่นนั้น ... C เป็นภาษาที่ฝังและไม่มีข้อได้เปรียบของการใช้ C ++ หรือมากกว่าข้อดีของ C นั้นมีมากกว่าข้อดีของ C ++ สำหรับการฝังตัว อย่าเสียเวลา

  • ถ้าคุณรู้วิธีใช้พอยน์เตอร์ของฟังก์ชั่นเป็นต้นคุณสามารถเขียนโค้ดเช่น C ++ ได้ไม่มีปัญหา

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

1
Classes = structs (โดยไม่มีวิธีการในตัว แต่ถ้าคุณชอบคุณสามารถจัดเก็บตัวชี้ฟังก์ชันในโครงสร้างและเรียกสิ่งนั้น) เทมเพลต = คุณใช้ ??? ผู้ประกอบการมากไป = = ฉันต้องการเช่นกัน การอ้างอิง = ตัวชี้, ไม่? ด้วย C อย่างน้อยคุณจะได้ใช้ 'ฟีเจอร์' ของ C ++ ที่คุณต้องการโดยไม่ต้องกังวลเกี่ยวกับการสร้างโค้ดที่มากเกินไปหรือต้องรวมไลบรารี่ขนาดใหญ่แบบสุ่มเพื่อให้คอมไพล์รวบรวม
AngryEE

1
ฉันขอแตกต่างกันไป
Rocketmagnet

3
ใช่แม่แบบเป็นวิธีที่ทรงพลังอย่างยิ่งในการสร้างรหัสที่เชื่อถือได้และมีประสิทธิภาพสูง การอ้างอิงเป็นตัวชี้ที่เชื่อถือได้มากขึ้น ด้วย C ++ คุณจะจ่ายเฉพาะฟีเจอร์ที่คุณใช้ ฉันคิดว่าคุณต้องเข้าใจ C ++ มากขึ้น
Rocketmagnet

3
ฉันไม่ทราบว่าคุณหมายถึงอะไรโดย "C เป็นภาษาที่ฝัง" แน่นอนว่ามันเป็นที่นิยมมาก คุณกำลังพูดว่ามันเป็นภาษาที่ดีที่สุดหรือไม่? ไม่แน่นอน
Rocketmagnet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.