Tại sao C chiếm ưu thế trong thị trường phần mềm nhúng? [đóng cửa]


14

Hầu như mọi người bây giờ sẽ nói lời chúc phúc:

hiệu suất !

Được rồi, C không cho phép viết mã thể thao. Nhưng có những ngôn ngữ khác có thể làm như vậy, sau tất cả! Và sức mạnh tối ưu hóa của trình biên dịch hiện đại là tuyệt vời. Liệu C có một số lợi thế mà không có ngôn ngữ khác có? Hoặc đơn giản là không cần các công cụ linh hoạt hơn trong miền?


1
FWIW, Arduino có thể được điều khiển bằng C #: arduino.cc/playground/Interfaces/Csharp
FrustratedWithFormsDesigner

@Frustrated: Có, nhưng đó là một ví dụ và hầu hết mọi người xây dựng thiết bị đều sử dụng Arduino.
Ed S.



1
@ dan04, trong phần lớn các trường hợp, đó thực sự không phải là vấn đề. Một nhóm mô phỏng 6DOF tại Tập đoàn Điện tử và Hệ thống Quốc phòng Texas đã thực hiện một thí nghiệm nhỏ vào khoảng năm 1988. Cho đến lúc đó, họ đã thực hiện tất cả các mô phỏng của mình trong FORTRAN. Họ đã thử viết một bài trong PASCAL, để xem nó sẽ tệ đến mức nào. Họ phát hiện ra rằng PASCAL mang lại cho họ một hiệu suất nhỏ, nhưng sự gia tăng độ tin cậy và dễ dàng gỡ lỗi THÊM hơn là bù đắp cho nó. Nói một cách thẳng thắn, họ thấy rằng việc kiểm tra loại mạnh của PASCAL là một điều TỐT. (Và vâng, họ đang thực hiện các mảng.)
John R. Strohm 18/07/14

Câu trả lời:


41

Hầu như mọi người bây giờ sẽ nói lời chúc phúc:

hiệu suất!

Đó là một phần của nó; sử dụng tài nguyên xác định là quan trọng trên các thiết bị có nguồn lực hạn chế để bắt đầu, nhưng có những lý do khác.

  1. Truy cập trực tiếp vào API phần cứng cấp thấp.
  2. Bạn có thể tìm thấy trình biên dịch C cho phần lớn các thiết bị này. Điều này không đúng với bất kỳ ngôn ngữ cấp cao nào theo kinh nghiệm của tôi.
  3. C (thời gian chạy và thực thi được tạo của bạn) là "nhỏ". Bạn không phải tải một loạt các công cụ vào hệ thống để chạy mã.
  4. API / trình điều khiển phần cứng có thể sẽ được viết bằng C hoặc C ++.

14
+1 Tính khả dụng của trình biên dịch. Quay lại khi chúng tôi đang viết mọi thứ trong hội đồng, trình biên dịch gen đầu tiên là một sự gửi gắm.
Christopher Bibbs

8
+1, tôi nghĩ rằng việc sử dụng tài nguyên xác định là một trong những lý do quan trọng nhất. Bạn không có nhiều bộ nhớ để thực hiện tất cả các loại bộ sưu tập rác ưa thích trong máy rửa chén.
user281377

4
+1 cũng cho "sử dụng tài nguyên xác định". Trên nhiều hệ thống nhúng, yêu cầu này thậm chí không cho phép sử dụng cấp phát bộ nhớ động. Nhiều ngôn ngữ khác phụ thuộc rất nhiều vào phân bổ bộ nhớ động (thậm chí nhiều khía cạnh có lợi của C ++ cần bộ nhớ động).
Michael Burr

2
Tôi muốn thêm một điểm nhấn, hóa ra là xã hội hơn là lý do kỹ thuật - Tôi nghĩ rằng các nhà phát triển phần mềm nhúng có xu hướng bảo thủ và chống lại sự thay đổi hơn nhiều so với các nhà phát triển khác. Tùy thuộc vào quan điểm của bạn, điều này có thể là một điều tốt hoặc xấu.
Michael Burr

1
Nói như một anh chàng hệ thống, tôi không bằng lòng với sự trừu tượng lớn. Chúng rất tuyệt, cho đến khi chúng ngừng hoạt động hoặc làm điều gì đó buồn cười, trong trường hợp đó có thể là một vấn đề đau đầu rất lớn để gỡ lỗi. Đó không phải là thứ tôi muốn trong một hệ thống cấp thấp.
Ed S.

18

C được thiết kế để mô hình hóa CPU, bởi vì C được tạo ra để làm cho Unix di động trên các nền tảng thay vì chỉ viết ngôn ngữ lắp ráp.

Điều này có nghĩa là các chương trình C hoạt động tốt như một ngôn ngữ lập trình cho các chương trình cần có mức độ trừu tượng rất gần với CPU thực tế, đó là trường hợp của phần cứng nhúng.

Lưu ý: C được thiết kế vào khoảng năm 1970 và CPU thì đơn giản hơn.


3
+1: Đây chắc chắn lý do. Có thể mọi người đã cố gắng thiết kế các ngôn ngữ cấp cao mới hơn để nắm bắt các tính năng của bộ xử lý hiện đại, nhưng không ai thiết kế ngôn ngữ cho ngôn ngữ đó.
Ken Bloom

2
@vines, C là một ngôn ngữ nhỏ với thư viện thời gian chạy lớn. Tất cả điều này có thể được thực hiện trong thư viện thời gian chạy. Nó sẽ không tự động di chuyển vào thư viện C tiêu chuẩn, vì vậy nó là nền tảng cụ thể.

3
+1. C được tạo cho và ban đầu được sử dụng trên PDP-7, có tối đa 64kilowords của các từ 18 bit. Nhiều ngôn ngữ "hiện đại" hơn gặp nhiều khó khăn hơn trong không gian đó. Đặc biệt là để viết một hệ điều hành như Unix.
greyfade

2
@greyfade: không phải vậy. UNIX có nguồn gốc trên PDP-7, nhưng C thì không. Để trích dẫn từ lời nói đầu cho Ngôn ngữ lập trình C : "C ban đầu được thiết kế và triển khai trên hệ điều hành UNIX trên DEC PDP-11, bởi Dennis Ritchie."
Jerry Coffin

1
@vines: trong khi nó chắc chắn hợp lý để chiêm ngưỡng hỗ trợ trực tiếp cho luồng bằng ngôn ngữ (cf, đồng thời C), phần lớn các điểm của một bộ nhớ cache là nó làm cho mọi thứ nhanh hơn mà không cần bất kỳ sự can thiệp từ phía các lập trình viên hoặc ngôn ngữ.
Jerry Coffin

11

Một lý do cho sự thống trị là nó có loại công cụ phù hợp cho nhiệm vụ. Sau khi đã phát triển trong các nền tảng nhúng trong cả Java và C / C ++, tôi có thể nói với bạn rằng cách tiếp cận từ trần đến xương của C ++ hoàn toàn tự nhiên hơn. Cứu nhà phát triển khỏi cảm giác rằng anh ta hoặc cô ta đang nhảy qua vòng vì ngôn ngữ quá cao là một điều khá khó chịu. Một ví dụ điển hình là sự vắng mặt của các biến không dấu trong Java.

Và các tính năng tiện dụng của VM / ngôn ngữ thông dịch thường không khả thi và bị loại khỏi triển khai, ví dụ: Bộ sưu tập rác.


3
"Cả Java và C / C ++" - Tôi hy vọng bạn có nghĩa là "cả ba: Java C và C ++", vì C và C ++ là các ngôn ngữ khác nhau.
Bовић

1
@ BЈовић: Trả lời nhiều năm sau để xác nhận rằng có, ý tôi là cả ba. Tôi đã sử dụng cả hai theo định nghĩa này: "được sử dụng như một từ chức năng để chỉ và nhấn mạnh sự bao gồm của hai hoặc nhiều điều" (hai hoặc nhiều điều) :-)
celebdor

10

C yêu cầu rất ít hỗ trợ thời gian chạy trong chính nó, vì vậy chi phí thấp hơn nhiều. Bạn không dành bộ nhớ hoặc lưu trữ cho hỗ trợ thời gian chạy, dành thời gian / nỗ lực để giảm thiểu hỗ trợ đó hoặc phải cho phép nó trong thiết kế dự án của bạn.


1
Có thực sự không bao giờ xảy ra rằng bạn cần chức năng đó và tự sáng tạo lại nó? Ví dụ, các máy trạng thái lớn được xây dựng bằng switches rất kinh khủng và các máy tương tự được xây dựng với hệ thống phân cấp lớp là tốt và có thể bảo trì.
dây leo

1
@vines - thông thường bạn có một bộ đầu vào xác định, các máy trạng thái được xây dựng trên công tắc / nếu thang rõ ràng hơn và có nhiều tài liệu hơn một phép thuật gia truyền 'đằng sau các cuộc gọi đa hình của hậu trường.
Martin Beckett

2
@Martin: với một người có ít kinh nghiệm về phát triển OO, các cuộc gọi đa hình không phải là "ma thuật" hay "đằng sau hậu trường", và khái niệm rằng chuyển đổi lớn / nếu các tuyên bố rõ ràng hơn và có nhiều tài liệu hơn có vẻ kỳ quái.
Michael Borgwardt

3
Tìm những gì xảy ra khi pin27 lên cao. Tùy chọn 1, tìm kiếm "trường hợp PIN27:" Tùy chọn 2 theo dõi một trình vòng lặp trên bản đồ của functor để khám phá cái nào sẽ được gọi cho một đối tượng PIN được gán cho pin 27 khi chạy. Vấn đề với rất nhiều mã OO là cách duy nhất để đọc nó là về cơ bản là chạy nó. Trên một nền tảng không có thời gian chạy gỡ lỗi hoặc thậm chí một bàn điều khiển có nghĩa là truy tìm mã trên giấy hoặc trong đầu của bạn.
Martin Beckett

2
Tiếp tục thảo luận về cuộc thảo luận này, có một lý do bậc thang logic (một phiên bản thậm chí còn nguyên thủy hơn switch, bạn có thể nói) vẫn được sử dụng trong nhiều ứng dụng nhúng. Dễ gỡ lỗi hơn, dễ xác minh hơn.
geekizard

9

Như đã đề cập trong các câu trả lời khác, C được phát triển vào đầu những năm 1970 để thay thế ngôn ngữ lắp ráp trên kiến ​​trúc máy tính mini. Trước đó, các máy tính này thường có giá hàng chục nghìn đô la, bao gồm bộ nhớ và thiết bị ngoại vi.

Ngày nay, bạn có thể có được sức mạnh máy tính tương đương hoặc lớn hơn với bộ vi điều khiển nhúng 16 bit có giá bốn đô la trở xuống với số lượng duy nhất - bao gồm bộ điều khiển RAM và I / O tích hợp. Một bộ vi điều khiển 32 bit có giá một hoặc hai đô la trở lên.

Khi tôi lập trình cho những anh chàng nhỏ bé này, đó là điều tôi làm 90% thời gian khi tôi không thiết kế bảng họ ngồi, tôi muốn hình dung những gì bộ xử lý sẽ làm. Nếu tôi có thể lập trình đủ nhanh trong trình biên dịch chương trình, tôi sẽ làm như vậy.

Tôi không muốn tất cả các loại trừu tượng. Tôi thường gỡ lỗi bằng cách bước qua một danh sách người phát tán trên màn hình. Làm điều đó dễ dàng hơn nhiều khi bạn viết chương trình bằng C để bắt đầu.


1
Đối với một số ứng dụng nhúng, "đô la hoặc hai hoặc nhiều hơn" là rất đáng kể. Không ai sẽ nhận thấy tác động giá cả trên chiếc xe của họ, nhưng họ sẽ trên bộ điều chỉnh nhiệt hoặc đầu CD.
David Thornley

3
@David Thornley, vâng, hoàn toàn đồng ý, đó là lý do tại sao tôi hiện đang có các dự án đi cùng với các micrô 8, 16 và 32 bit cùng một lúc cho các khách hàng khác nhau. (Tiêu thụ điện năng là một lý do khác để đi với các thiết bị nhỏ hơn.)
tcrosley

1
Giá được xác định ít hơn bởi chi phí bộ xử lý so với số lượng pin. Bảng đắt hơn rất nhiều so với chip.
Yttrill

7

Nó không hoàn toàn thống trị khi C ++ ngày càng được sử dụng nhiều hơn khi trình biên dịch được cải thiện và hiệu suất phần cứng tăng lên. Tuy nhiên C vẫn rất phổ biến vì một vài lý do;

  1. Hỗ trợ rộng rãi. Khá nhiều nhà cung cấp chip cung cấp trình biên dịch ac và bất kỳ mã ví dụ và trình điều khiển nào có thể sẽ được viết bằng c. Trình biên dịch C ++ ngày càng phổ biến, nhưng không phải là chứng chỉ chết cho một con chip nhất định và chúng thường là buggier. Bạn cũng biết rằng bất kỳ kỹ sư nhúng nào cũng sẽ có thể làm việc trong c. Đó là ngôn ngữ chung của ngành công nghiệp.

  2. Hiệu suất. Yup, bạn đã nói nó. Hiệu suất vẫn là vua và trong một môi trường mà các thói quen cốt lõi vẫn thường được viết bằng trình biên dịch, hoặc ít nhất là được tối ưu hóa bằng c có liên quan đến đầu ra lắp ráp, không bao giờ đánh giá thấp tầm quan trọng của việc này. Thông thường các mục tiêu nhúng sẽ có chi phí rất thấp và có những ký ức rất nhỏ và vài mips.

  3. Kích thước. C ++ có xu hướng lớn hơn. Chắc chắn bất cứ điều gì sử dụng STL sẽ lớn hơn. Nói chung cả về kích thước chương trình và dấu chân bộ nhớ.

  4. Bảo thủ. Đó là một ngành rất bảo thủ. Một phần vì chi phí thất bại thường cao hơn và việc sửa lỗi thường khó tiếp cận hơn, một phần vì không cần thiết phải thay đổi. Đối với một dự án nhúng nhỏ c làm công việc tốt.


11
Hãy xem, đây là số 3 dường như là một trong những huyền thoại phổ biến nhất về C ++. Viết một thùng chứa loại an toàn cho 5 loại khác nhau trong C và bạn sẽ gây ra ít nhất là "phình to" như sử dụng một thùng chứa STL trên 5 loại khác nhau. Các lập trình viên C khắc phục điều này bằng cách viết các thùng chứa trên các loại mờ (void *). So sánh THAT với mẫu STL là một lỗi thể loại. Phải thừa nhận mặc dù đó thực sự là một trong những "lý do" phổ biến nhất để thích C.
Edward Strange

Tôi hoàn toàn đồng ý rằng để sao chép toàn bộ chức năng trong c, bạn sẽ có cùng dấu chân với c ++. 'Ưu điểm' của c là nó cho phép bạn chọn lọc. Trong bất kỳ dự án quan trọng nào, tôi muốn sử dụng c ++, nhưng đôi khi phần cứng mục tiêu bị hạn chế đến mức không thực tế. Phải nói rằng # 1 thực sự là lý do chính trong kinh nghiệm của tôi.
Luke Graham

6

Đối với các hệ thống nhúng, điều quan trọng là hiệu suất . Nhưng như bạn đã nói, tại sao C mà không phải một số ngôn ngữ biểu diễn khác?

Nhiều người cho đến nay đã đề cập đến sự sẵn có của trình biên dịch , nhưng không ai đề cập đến sự sẵn có của các nhà phát triển . Rất nhiều nhà phát triển đã biết C hơn, nói, OCaml.

Đó là ba ông lớn.


6

Phần mềm nhúng rất khác nhau.

Trên một ứng dụng máy tính để bàn, trừu tượng và thư viện giúp bạn tiết kiệm rất nhiều thời gian phát triển. Bạn có thể sử dụng một vài megabyte hoặc gigabyte RAM hoặc một số lõi CPU 64-bit 2 + GHz, và một người khác (người dùng) đang trả tiền cho phần cứng đó. Bạn có thể không biết ứng dụng sẽ chạy trên hệ thống nào.

Trong một dự án nhúng, tài nguyên thường rất hạn chế. Trong một dự án tôi đã làm việc trên (bộ xử lý sê-ri PIC 17X), phần cứng có 2Kwords bộ nhớ chương trình, 8 cấp độ ngăn xếp (trong phần cứng) và 192 byte (<0,2kB) RAM. Các chân I / O khác nhau có các khả năng khác nhau và bạn đã cấu hình phần cứng khi cần bằng cách ghi vào các thanh ghi phần cứng. Gỡ lỗi liên quan đến một máy hiện sóng và phân tích logic.

Trong nhúng, các khái niệm trừu tượng thường cản trở và sẽ quản lý (và chi phí) tài nguyên mà bạn không có. Ví dụ, hầu hết các hệ thống nhúng không có hệ thống tập tin. Lò vi sóng là hệ thống nhúng. Bộ điều khiển động cơ xe. Một số bàn chải đánh răng điện. Một số tai nghe chống ồn.

Một yếu tố rất quan trọng đối với tôi trong việc phát triển các hệ thống nhúng là biết và kiểm soát những gì mã dịch theo hướng dẫn, tài nguyên, bộ nhớ và thời gian thực hiện. Thông thường trình tự chính xác của các điều khiển hướng dẫn, ví dụ thời gian cho dạng sóng giao diện phần cứng.

Trừu tượng và 'ma thuật' đằng sau hậu trường (ví dụ: công cụ thu gom rác) rất phù hợp cho các ứng dụng trên máy tính để bàn. Công cụ thu gom rác giúp bạn tiết kiệm rất nhiều thời gian để tránh rò rỉ bộ nhớ, khi bộ nhớ được / có thể được phân bổ động.

Tuy nhiên, trong thế giới nhúng thời gian thực, chúng ta cần biết và kiểm soát mọi thứ mất bao lâu, đôi khi xuống đến nano giây và không thể ném thêm vài meg RAM hoặc CPU nhanh hơn vào một vấn đề. Một ví dụ đơn giản: khi thực hiện phần mềm làm mờ đèn LED bằng cách điều khiển chu kỳ nhiệm vụ (CPU chỉ có điều khiển bật / tắt đèn LED), bộ xử lý không tắt và thực hiện việc thu gom rác trong 100ms vì màn hình hiển thị rõ ràng đèn flash sáng hoặc đi ra ngoài.

Một ví dụ giả thuyết hơn là bộ điều khiển động cơ bắn trực tiếp bugi. Nếu CPU đó tắt và thu gom rác trong 50ms, động cơ sẽ bị cắt trong giây lát hoặc bắn vào vị trí trục khuỷu sai, có khả năng làm cho động cơ bị đình trệ (trong khi vượt qua?) Hoặc làm hỏng cơ học. Bạn có thể khiến ai đó bị giết.


Điều đó đúng như nó không liên quan đến C - vấn đề bạn đề cập đến chỉ là hành vi của GC ... C ++ không có bất kỳ GC nào, và biết gì không? Cá nhân tôi sử dụng nó vì các dòng bình luận và loại an toàn chặt chẽ hơn =)
dây leo
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.