เหตุใดฝังตัว C / C ++ อย่างเคร่งครัด [ปิด]


15

ฉันไม่ชอบคำถามนี้เพราะไม่สามารถตอบได้อย่างง่ายดาย แต่บางทีฉันสามารถใช้ถ้อยคำใหม่: "อะไรที่ทำให้ Embedded ฝังตัวจากการเปลี่ยนภาษา?"

ตัวอย่างเช่นเราเห็น C / C ++ สำหรับฝัง (ฉันคิดว่าฉันเคยได้ยินเอดีเอที่กล่าวถึงมาก่อนหรือไม่แก้ไขให้ฉันถ้าฉันผิด)

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

สิ่งนี้ทำให้ฉันงุนงงอยู่เสมอไม่ใช่ว่าฉันบ่น เนื่องจากการใช้ภาษาเพียงไม่กี่ภาษาทำให้สิ่งต่าง ๆ เป็นมาตรฐาน แต่คำถามก็ยังคงอยู่

ฉันรู้ว่านี่เป็นคำถามเชิงอัตวิสัยอย่างไรก็ตามคำถามหลักของฉันคือ "ทำไม" และไม่ใช่ "IF / WHEN"


2
มีภาษาระดับสูงกว่าที่คุณต้องการเห็นในระบบฝังตัวหรือไม่ แก้ไข: หรือมากกว่าสิ่งที่คุณสมบัติของภาษาที่คุณสนใจใน C ที่ไม่ได้ให้?
Jon L

1
@JonL - มีคุณสมบัติระดับต่ำมากมายที่ฉันต้องการให้ C มี การจัดการบิตที่ดีกว่า / nibble / byte / word ภายใน ints ขนาดใหญ่ สนับสนุนความปลอดภัยที่ดีขึ้น EG ประเภทของคุณสมบัติที่ Ada มี
Rocketmagnet

3
สมองกลฝังตัวไม่เคร่งครัด C. นี่เป็นภาษาระดับสูงสำหรับระบบฝังตัว: electronics.stackexchange.com/questions/3423/…
Kellenjb

1
"สมองกลฝังตัว" มีความหมายต่างกัน ไมโครคอนโทรลเลอร์ 4 บิตที่รันเครื่องปิ้งขนมปังนั้นแตกต่างจากกล่อง ECU หรือกล่องรับสัญญาณ สเปกตรัมนี้ทำให้คำถามของคุณตอบยาก
Toby Jaffey

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

คำตอบ:


18

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

  • การยอมรับภาษาใหม่นั้นยากและหายาก มันต้องมีการฝึกอบรมใหม่เครื่องมือใหม่และการหาวิธีที่ดีในการทำงานกับภาษาใหม่ นี่คือค่าใช้จ่ายสูงโดยเฉพาะอย่างยิ่งสำหรับผู้ใช้งานในช่วงต้น นอกจากนี้ยังเป็นปัญหาไก่และไข่: หากไม่มีฐานผู้ใช้ขนาดใหญ่จะไม่มีเครื่องมือและ libararies คุณภาพดี แต่หากไม่มีฐานผู้ใช้ขนาดใหญ่จะไม่มีฐานผู้ใช้ขนาดใหญ่ ดังนั้นภาษาใหม่จะต้องมีความได้เปรียบอย่างมากจากภาษาที่มีอยู่ไม่เช่นนั้นจะไม่มีโอกาส

  • การพัฒนาใหม่ล่าสุด "ส่วนใหญ่" ในภาษาได้เติมช่องว่างระหว่างพลัง CPU ที่มีอยู่และสิ่งที่ผู้ใช้ต้องการ กล่าวอีกนัยหนึ่ง: พวกมันไม่มีประสิทธิภาพในด้านความเร็ว แต่ชดเชยด้วยความง่ายกว่าของโปรแกรมเมอร์ ลองนึกถึงภาษาที่เพิ่มขึ้นเช่น Java, Python, Perl, Tcl ที่ใช้งานโดยล่าม (อาจจะเป็นหลังการคอมไพล์) และใช้การจัดการหน่วยความจำแบบไดนามิกอย่างหนัก แต่สิ่งนี้ไม่ตรงกับโลกที่มีการ จำกัด ทรัพยากรซึ่งเราต้องการได้รับ a) ทรัพยากรที่มีอยู่ให้มากที่สุดแม้จะต้องใช้ความพยายามในการเขียนโปรแกรมมากขึ้นและ b) การใช้ทรัพยากรที่คาดการณ์ได้

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


+1 - คำตอบที่ดี ดูเหมือนว่า Ada เป็นภาษาที่น่าสนใจมีคอมไพเลอร์ของ Ada สำหรับไมโครเล็ก ๆ ไหม?
Oli Glaser

มี GNAT ซึ่งเป็นคอมไพเลอร์ GCC Ada แต่ AFAIK นั้นไม่ได้ใช้กับไมโครสค์มากนักดังนั้นคุณจะพบกับบางสิ่งที่อ่านได้ยาก
Wouter van Ooijen

ใช่ฉันเห็น GNAT พูดถึงในหน้าวิกิ ไม่ถูกต้องสำหรับ micros ขนาดเล็ก แต่ดูเหมือนว่าจะมีการสนับสนุนที่พอสมควร (ตามที่คุณคาดหวัง) สำหรับภารกิจที่สำคัญใน 68k, x86, MIPS, ฯลฯ (เช่นDDCI )
Oli Glaser

ฉันเห็นว่ามี SPARK Ada ด้วยเช่นกันโดย Deek ด้านล่าง ฉันจะต้องตรวจสอบออกเมื่อฉันมีสิ่งที่เข้าใจยากบางอย่างที่พวกเขาเรียกเวลา ...
Oli Glaser

2
Ada ในรูปแบบของ Gnat ใช้งานได้ดีกับไมโครโปรเซสเซอร์ AVR ดังที่เห็นใน Arduino Gnat ที่เล็กที่สุดที่ฉันสามารถสร้างได้คือ 65 ไบต์ สิ่งที่เป็นที่ยอมรับก็คือการกะพริบไฟ LED แม้ว่าภาพร่าง Arduino เทียบเท่ากว่า 1K ตามเวลาที่ปฏิบัติการของฉันถึง 600 ไบต์มันก็ขับมอเตอร์สเต็ป 2 ตัวเป็นอิสระ ... คุณไม่จำเป็นต้องมี SPARK - ยกเว้นว่าคุณต้องการพิสูจน์ว่าไฟกระพริบ LED ของคุณถูกต้องอย่างเป็นทางการ!
Brian Drummond

9

ด้วยระบบฝังตัวที่ใช้ไมโครคอนโทรลเลอร์ขนาด 8 และ 16 บิตจึงทำให้การพัฒนาซอฟต์แวร์ง่ายขึ้นซึ่งสามารถพอดีกับทรัพยากรที่มี จำกัด ของข้อ จำกัด ในการเก็บข้อมูลขนาดเล็กเหล่านี้ (อาจจะน้อย 100 ไบต์ RAMสำหรับไมโครคอนโทรลเลอร์ 8 บิตต่ำ ด้วย ROM ขนาด 2-8 KiB หรือ EPROM / Flash สำหรับการจัดเก็บรหัส)

ในกรณีดังกล่าวภาษาขนาดเล็กเช่น C หรือแอสเซมบลีมักจะเป็นภาษาที่ใช้กันมากที่สุด เป็นการเปรียบเทียบแบบคร่าวๆอย่างมากแอสเซมเบลอร์ที่สมบูรณ์และ C99 คอมไพเลอร์สามารถใส่ลงในฟล็อปปี้ดิสก์เดียวในขณะที่คุณต้องการMiBหลายตัวสำหรับระบบการพัฒนา C ++ สมัยใหม่ (พร้อม STL และอื่น ๆ )

เมื่อคุณมองหาไมโครไซต์ระดับสูง (ระดับไฮเอนด์ 16 บิตและส่วนใหญ่ 32 บิตมี 64 บิตที่ค่อนข้างหายาก) และDSPในสภาพแวดล้อมแบบฝังตัวข้อ จำกัด ที่อ่อนแอลงและการพัฒนาซอฟต์แวร์อาจทำให้เกิดการพัฒนาเป็นจำนวนมาก ดังนั้นจึงเหมาะสมที่จะใช้เครื่องมือการพัฒนาที่มีประสิทธิผลมากที่สุดรวมถึงภาษาขั้นสูงเพิ่มเติมด้วยคุณสมบัติเช่นภาษา Object-Oriented Programming (OOP) เช่น C ++ และภาษาที่ใหม่กว่า (Java, Perl, Ruby, Python)

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

ภาษาที่ใช้เครื่องเสมือนที่ใช้รหัสไบต์ (Java, Perl, Python) มีความเป็นผู้ใหญ่น้อยกว่าในประสบการณ์ของนักพัฒนาที่ฝังตัวและเนื่องจากภาษาเหล่านี้ได้รับการออกแบบมาเพื่อป้องกันโปรแกรมเมอร์จากฮาร์ดแวร์เฉพาะมันยังทำให้ยากขึ้นด้วย ข้อ จำกัด และข้อ จำกัด ของระบบฮาร์ดแวร์ฝังตัวดังกล่าว นี่เป็นปัญหาที่เกิดขึ้นกับโปรเซสเซอร์ 32 บิตที่รวดเร็ว (เช่น ARMv7) กับ MiB หากไม่ใช่ GiB ของ RAM

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

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


5

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

มันไม่ได้ว่า "C เป็นทางเลือกที่ดีหรือล้าสมัย แต่เรายังคงใช้มันออกมาจากนิสัย" (เหมือนแป้นพิมพ์แบบ QWERTY)

C เป็นตัวเลือกที่ดีมากสำหรับการพัฒนาแบบฝังตัวโดยเฉพาะในแอปพลิเคชันที่มีความสำคัญต่อเวลา ทำไม?

  • อยู่ในระดับต่ำพอที่จะใช้งานได้ง่ายในการใช้งานโปรแกรมตามเวลาจริง หากคุณจำเป็นต้องวัดเวลาในนาโนวินาทีที่มีการจับขัดจังหวะทุก 5 ไมโครหรือต้องใช้ตรง 64 ไบต์ของแรมรวมแล้วด้วยภาษาระดับสูงมากมันส่วนใหญ่มักจะเป็นอย่างใดอย่างหนึ่งไปไม่ได้หรือยากมากที่จะแก้ปัญหาได้ . C ช่วยให้คุณควบคุมฮาร์ดแวร์ได้ดีกว่าภาษาระดับสูงกว่ามากนี่เป็นหนึ่งในความแตกต่างที่สำคัญที่สุดระหว่างการพัฒนาสำหรับสมองกลฝังตัวและพีซี

  • มันอยู่ในระดับสูงพอที่จะรวดเร็วและง่ายต่อการรหัสเมื่อเทียบกับแอสเซมบลี

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


1
ฉันคิดว่าแง่มุมที่สำคัญในความโปรดปรานของ C คือช่วยให้โค้ดเพิ่มประสิทธิภาพสำหรับแพลตฟอร์มเฉพาะในขณะที่อนุญาตให้โค้ดดังกล่าวทำงานได้ ในบางสิ่งบางอย่างเช่น PIC คำสั่ง C จำนวนมากจะแปลเป็นคำสั่งของเครื่อง การวนซ้ำunsigned char i=63,j=128; do {something;} while(--j); while(--i);จะไม่สามารถอ่านได้เหมือนunsigned int i=16000; do {something;} while(--i);แต่จะทำงานได้เร็วขึ้นและมีประสิทธิภาพมากขึ้นใน PIC หากรหัสถูกย้ายไปที่ ARM วิธีที่สองจะมีประสิทธิภาพมากกว่า แต่วิธีแรกยังคงใช้ได้
supercat

4

เป็นเหตุผลเดียวกันที่ว่าทำไมในการเขียนโปรแกรมปกติภาษาที่ใช้มากที่สุดจะไม่เปลี่ยนแปลง (จริงๆ):

  1. โค้ดที่มีอยู่จำนวนมาก (ไลบรารี / การนำไปใช้งานที่มีอยู่)
  2. ชุดเครื่องมือขนาดใหญ่ที่สามารถทำงานกับภาษาเหล่านี้ (IDEs, simulators, ... )

4

ในโลกที่ฝังตัวอาจเป็นเรื่องยาก (หรือเป็นไปไม่ได้) ในการจัดหาการอัปเดตซอฟต์แวร์ดังนั้นจึงเป็นเรื่องสำคัญยิ่งที่จะรับประกันความถูกต้อง Sadly C ให้ความช่วยเหลือเพียงเล็กน้อยในเรื่องนี้และทำให้โปรแกรมเมอร์สามารถเล่นได้อย่างรวดเร็วและหลวม

มันทำให้ฉันลำบากใจที่จะใช้ C สำหรับระบบฝังตัวและหวังว่าอย่างน้อยฉันก็สามารถเลื่อนได้ถึง C ++ เพื่อประโยชน์มากมายที่มีให้ในรูปแบบของข้อ จำกัด เช่น const การอ้างอิงการพิมพ์ stringer เป็นต้น

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

ฉันเดาว่าทำไมคนยังคงใช้ PHP

PHP กรงเล็บค้อนคู่


หากคุณต้องการที่จะหารือเกี่ยวกับคำถามใช้ความคิดเห็นหรือเมตาถ้าคุณต้องการที่จะตบผู้ใช้ที่ด้านหลังสำหรับคำถามที่ดีขึ้นโหวตหรือแสดงความคิดเห็น
Kortuk

คุณสามารถใช้ Pascal ได้ตลอดเวลา - ดูเหมือนว่าจะมีข้อ จำกัด เพิ่มเติมที่คุณต้องการ :-) หรือบางรูปแบบของ Super-Lint
รัสเซลแม็คมาฮอน

2
สาเหตุหนึ่งที่สำคัญมากสำหรับ C คือการเขียนคอมไพเลอร์ C ขั้นพื้นฐานง่ายกว่า C ++ ฉันทำงานหนึ่งครั้งก่อนที่งานสำคัญจะดึงฉันออกไป สิ่งที่สนุก! กำลังเขียนคอมไพเลอร์ C ++? ฮึ. ฉันชอบ C ++ ในฐานะผู้ใช้มากกว่า
darron

1
@RussellMcMahon - ฉันไม่สามารถใช้ Pascal ได้เนื่องจากไม่มี Pascal คอมไพเลอร์สำหรับ MCU ที่ฉันใช้อยู่
Rocketmagnet

@darron - เป็นจุดที่ดีมาก อย่างไรก็ตามมีคอมไพเลอร์โอเพนซอร์ส C ++ ที่ดีมากเช่น gpp พวกเขาเพียงแค่ต้องเขียนส่วนหลังให้
Rocketmagnet

4

ไม่มีใครได้ยิน SPARK Ada ที่นี่หรือ

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

การศึกษาแสดงให้เห็นว่าความเร็วในการประมวลผลลดลง 5-10% เมื่อเทียบกับ C / C ++ กับการเข้ารหัส SPARK ที่เชื่อถือได้มากขึ้น

ฉันคิดว่าการแพร่กระจายของ C ในระบบฝังตัวเป็นเพราะเหตุผลทางเศรษฐกิจ:

  • มีอยู่แล้วและมักจะสามารถใช้งานได้กับแอปพลิเคชันส่วนใหญ่และแอปพลิเคชั่นส่วนใหญ่ในปริมาณที่ไม่สำคัญไม่มีใครจะตายถ้าเครื่องซักผ้าทำงานหนักเกินไป - ทำไมจึงเปลี่ยน

  • ชุดเครื่องมือ SPARK จะเป็นค่าใช้จ่ายเพิ่มเติมในตัวเองและสำหรับพนักงานฝึกอบรมเพื่อใช้งาน

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

  • บริษัท AdaCore ระวังที่จะไม่เข้าไปลึกเข้าไปในแอพพลิเคชั่นในตลาดมวลชนเพราะสิ่งเหล่านี้จะทำให้พนักงานฝ่ายสนับสนุนด้านเทคนิคเพิ่มขึ้นอย่างมากเพื่อจัดการกับปัญหาที่ไม่ใช่ธุรกิจหลัก AdaCore เป็น บริษัท ที่มีความเชี่ยวชาญระดับสูงภาคภูมิใจในตัวเองและนำเสนอผลิตภัณฑ์และบริการที่ บริษัท เทคโนโลยีชั้นสูง มันเป็นเรื่องแปลกสำหรับภาษาที่จะเจาะตลาดใหม่เว้นแต่ผู้มีส่วนได้ส่วนเสียหลักต้องการ

ดังนั้น @ Wouter คุณไม่ต้องกังวลกับการตายในท้องฟ้าเพราะต้องการโค้ดที่ฝังตัวของ Ada!

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

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


น่าสนใจขอบคุณ - ฉันไม่ได้ยิน SPARK จะตรวจสอบออก
Oli Glaser

บางการศึกษาแสดงความเร็วที่สัมพันธ์กับแอปพลิเคชันที่มีอยู่ใน C - ดูเซิร์ฟเวอร์ DNS "Ironsides" ...
Brian Drummond

3

ฉันเดาว่าสาเหตุหลักของความนิยมของ C คืออันดับแรก: C เป็นที่นิยมและหลายคนรู้จักและที่สอง: ไม่มีภาษายอดนิยมใหม่ ๆ เช่น Java, C # และแม้แต่ C ++ หลายแง่มุมเหมาะสำหรับงานฝังตัว โดยพื้นฐานแล้วภาษาอื่น ๆ อีก 3 ภาษาที่ฉันกล่าวถึงนั้นใช้หน่วยความจำแบบไดนามิกจำนวนมากซึ่งทำให้การทำงานของโปรแกรมไม่เป็นไปตามวัตถุที่นำหน่วยความจำแบบไดนามิกมาใช้กับพวกเขาความต้องการหน่วยความจำขนาดใหญ่ จำนวนคลาสที่ใหญ่ขึ้น) ความนิยมที่เพิ่มขึ้นของการรวบรวมทันเวลา (และแพลตฟอร์มที่ฝังตัวจำนวนมากไม่สามารถรวบรวมรหัส C ของตัวเองได้เลย ... )

นอกจากนี้ยังมีความจริงที่ว่าไลบรารีจำนวนมากที่มาพร้อมกับการบอกว่า Java หรือ C # ไร้ประโยชน์สำหรับโครงการฝังตัวจำนวนมาก

ในทางกลับกันเรามีภาษาที่เก่ากว่าเช่น Pascal หรือ Basic จากมุมมองของฉันพวกเขาไม่เป็นที่นิยมเพราะ C ทำให้ตัวเองเป็น "มาตรฐานอุตสาหกรรม" ภาษาและโปรแกรมเมอร์และวิศวกรจำนวนมากเรียนรู้ C วันนี้ ในบางโรงเรียนปาสคาลหรือขั้นพื้นฐานยังไม่ได้เรียนรู้ นอกจากนี้ยังมีความจริงที่ว่าภาษาที่เป็นที่นิยมในปัจจุบันมีไวยากรณ์คล้าย C และการใช้ Pascal จะรู้สึกแปลก ๆ กับโปรแกรมเมอร์ C

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

โปรดทราบว่าในคำตอบนี้ฉันมุ่งเน้นไปที่ระบบขนาดเล็กเป็นส่วนใหญ่ นอกจากนี้ยังมีอุปกรณ์ฝังตัวหลายตัวที่ใช้ระบบปฏิบัติการที่ซับซ้อนมากขึ้นเช่น GNU / Linux หรืออนุพันธ์ Unix อื่น ๆ และสำหรับการตั้งโปรแกรมพวกเขาสามารถใช้ภาษา popualr มากหรือน้อยก็ได้


1
C เป็นที่นิยมเพราะ C เป็นที่นิยม? :-)
stevenvh

2
@stevenvh ใช่มันเป็นเรื่องจริง มันเป็นวงตอบรับเชิงบวก ยิ่งได้รับความนิยมมากเท่าไหร่ก็ยิ่งได้รับความนิยมมากเท่านั้น
AndrejaKo

3

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

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

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

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


3

เหตุผลบางอย่างที่คนอื่นไม่ได้พูดถึง:

  • พื้นที่ปัญหา: C เหมาะสำหรับระบบขนาดเล็กและเรียบง่าย หากสิ่งที่คุณทำคือตอบสนองต่อสัญญาณภายนอกและกดตัวเลขสองสามรอบแล้ว C ทำงานได้ค่อนข้างดี (ไม่มีโครงสร้างข้อมูลที่ซับซ้อนไม่มี malloc ไม่มีการจัดการข้อผิดพลาดที่ซับซ้อน)

  • ปริมาณการผลิต: หากคุณมีการผลิตจำนวนมากคุณควรประหยัดในแต่ละหน่วยฮาร์ดแวร์และใช้จ่ายกับโปรแกรมเมอร์มากขึ้นเนื่องจากการเขียนโปรแกรมเป็นต้นทุนเพียงครั้งเดียว



1

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

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

ในขณะที่ระบบฝังตัวขนาดกลางและขนาดใหญ่ (โดยที่ฉันหมายถึงหน่วยความจำและนาฬิกามากขึ้นขนาดคำใหญ่) ฉันจะไม่พูดว่า C (หรือ C ++) เป็นที่แพร่หลายมาก ฉันเคยเห็นระบบที่รองรับ Python, Forth ... แม้แต่ Java

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


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

3
ฉันเห็นด้วยกับ Kortuk อย่างเต็มที่ บางส่วนของ C ++ ต้องการการสนับสนุนแบบรันไทม์ แต่ส่วนที่ยังไม่ดีกว่า C (และ OO ทั้งหมด) ข้อ จำกัด ของชุดย่อยนี้มีการบังคับใช้อย่างง่ายดายโดยสวิตช์คอมไพเลอร์และตัวเชื่อมโยงบางตัว ในบางส่วน (เช่น printf ที่หวั่น) C ++ มีศักยภาพทางภาษาที่ต้องการการสนับสนุนรันไทม์น้อยกว่า (ถ้า std :: cout เท่านั้นที่ถูกนำไปใช้กับระบบขนาดเล็กในใจ ... )
Wouter van Ooijen

1
@Kortuk ขออภัยที่ไม่ชัดเจน แต่เมื่อฉันพูดว่า "C เป็นภาษาเดียวที่ ... " ไม่ได้หมายความว่า C ++ ไม่มีทั้งสองอย่างฉันหมายความว่า C มีทั้งสองอย่างรวมกัน และ C ++ มีหนึ่งในนั้น ความสำคัญของฉันคือในส่วนรันไทม์ ฉันยังไม่ได้บอกว่ามันเป็นไปไม่ได้เลยที่จะใช้ C ++ โดยไม่มีรันไทม์ แต่มันค่อนข้างผิดปกติ ฉันไม่เห็นว่าคุณจะมีสิ่งต่าง ๆ เช่นการจัดการข้อยกเว้นและ RTTI ได้อย่างไรโดยไม่มีการใช้งานจริงและนี่เป็นคุณสมบัติที่สำคัญมาก แต่ฉันต้องขออภัยถ้าวิธีที่ฉันแสดงนี้นำไปสู่ความเข้าใจผิดที่เป็นไปได้
fceconel

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