2009-05-19 36 views
6

Hôm nay tôi đã tham gia một cuộc trò chuyện rất thú vị với một đồng nghiệp, trong đó một chủ đề khiến tôi suy nghĩ và googling tối nay. Sử dụng C++ (trái với C) trong môi trường nhúng. Nhìn xung quanh, có vẻ như một số tốt đẹp trades cho và chống lại các tính năng C++ cung cấp, nhưng những người khác Meyers hỗ trợ rõ ràng nó. Vì vậy, tôi đã tự hỏi ai sẽ có thể đưa ra một số ánh sáng về chủ đề này và sự đồng thuận chung của cộng đồng là gì.Sử dụng C++ trong môi trường nhúng

+0

Tôi nên thêm rằng cuộc thảo luận này được dựa một phần khi các nhà quản lý của chúng tôi miễn cưỡng áp dụng C++ trong hầu hết các thư viện của chúng tôi. Chúng tôi làm "nhúng" làm việc, chỉ có nó sống trên một robot hầu hết thời gian. 99% thời gian, chúng tôi không sử dụng RTOS hoặc bất kỳ hệ thống nào có bộ nhớ rất hạn chế. – jdt141

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/812717/ –

+0

Xem thêm http://stackoverflow.com/questions/649789/why-artificially-limit-your-code-to-c – Suma

Trả lời

5

Loại tùy thuộc vào tính chất cụ thể của hệ thống nhúng của bạn và các tính năng của C++ bạn sử dụng. Bản thân ngôn ngữ không nhất thiết tạo ra mã số lớn hơn C.

Ví dụ, nếu bộ nhớ là ràng buộc chặt chẽ nhất, bạn có thể sử dụng C++ như "C với các lớp" - nghĩa là chỉ sử dụng các hàm thành viên trực tiếp, vô hiệu hóa RTTI và không có bất kỳ chức năng hoặc mẫu ảo nào. Điều đó sẽ phù hợp với khá nhiều không gian giống như mã C tương đương, vì bạn không có thông tin loại, vtables hoặc các chức năng dự phòng để làm lộn xộn mọi thứ.

Tôi nhận thấy rằng các mẫu là điều lớn nhất cần tránh khi bộ nhớ thực sự chặt chẽ, vì bạn nhận được một bản sao của từng chức năng mẫu cho từng loại nó chuyên biệt và có thể nhanh chóng tạo ra đoạn mã.

Trong ngành công nghiệp trò chơi điện tử trên bàn điều khiển (là loại kết thúc mạnh mẽ của thế giới được nhúng) C++ là vua. Hạn chế của chúng tôi là giới hạn cứng trên bộ nhớ (512MB trên thế hệ hiện tại) và hiệu suất thời gian thực. Nói chung các chức năng và mẫu ảo được sử dụng, nhưng không phải ngoại lệ, vì chúng làm nổi bật ngăn xếp và quá tốn kém. Trong thực tế, một trình biên dịch của nhà sản xuất chính thậm chí không hỗ trợ ngoại lệ.

1

Tôi không biết về "sự đồng thuận chung", chỉ công ty tôi làm việc (có nhiều phát triển cho điện thoại di động, hệ thống định vị xe hơi, DPF, v.v.). Hạn chế chính mà tôi đã gặp phải khi sử dụng C++ trên nền tảng nhúng thay vì C là nó không phải là di động - có nhiều trường hợp trình biên dịch không tuân theo tiêu chuẩn có thể gây ra vấn đề nếu bạn cần xây dựng mã của mình với hơn 1 trình biên dịch hoặc hoàn toàn có lỗi trong quá trình triển khai. Sau đó, có những môi trường mà mã C++ đơn giản sẽ không chạy - các vấn đề của BREW với mã relocatable và "native OOP" của nó không chơi tốt như vậy với các lớp C++ và thừa kế "thông thường".

Cuối cùng, nếu bạn chỉ nhắm mục tiêu 1 nền tảng, tôi muốn sử dụng bất kỳ điều gì bạn cho là "tốt hơn" (nhanh hơn, ít lỗi hơn, thiết kế tốt hơn) cho sự phát triển của bạn - trong hầu hết các trường hợp được làm việc xung quanh khá dễ dàng.

1

Phụ thuộc vào loại phát triển nhúng bạn đang làm. Tôi đã thực hiện phát triển nhúng với cả C++, C và Assembly trên nhiều nền tảng khác nhau, thậm chí bạn có thể sử dụng Java để viết các ứng dụng trên điện thoại thông minh.

Ví dụ trên điện thoại thông minh như thiết bị đang chạy Windows CE 5, gần như tất cả mã là C++, kể cả trong hệ điều hành. Chỉ các bit nhỏ được viết bằng C hoặc assembly.

Mặt khác, tôi đã viết mã cho một vi điều khiển MSP430, trong C, và tôi có lẽ đã làm điều đó trong C++ có trình biên dịch được tin cậy hơn và tuân thủ các tiêu chuẩn.

Ngoài ra tôi dường như nhớ lại một giảng viên đại học của tôi nói về viết mã nhúng trong Forth hoặc một cái gì đó. Vì vậy, thực sự bất kỳ ngôn ngữ có thể làm.

6

Sự sợ hãi của C++ giữa các nhà phát triển được nhúng phần lớn là một điều trong quá khứ, khi trình biên dịch C++ không tốt bằng trình biên dịch C (tối ưu hóa và chất lượng mã khôn ngoan).

Điều này áp dụng đặc biệt cho nền tảng hiện đại với kiến ​​trúc 32 bit. Nhưng, C chắc chắn vẫn là sự lựa chọn ưa thích cho các môi trường hạn chế hơn (như là lắp ráp cho 8 bit hoặc 4 bit mục tiêu). Vì vậy, nó thực sự thích hợp với các tài nguyên mà nền tảng đích của bạn cung cấp, và bao nhiêu tài nguyên mà bạn có khả năng thực sự yêu cầu, nghĩa là nếu bạn có thể đủ khả năng phát triển nhúng trong C++ (hoặc thậm chí là Java). cho rằng vấn đề), bởi vì bạn biết rằng bạn sẽ khó có bất kỳ vấn đề liên quan đến bộ nhớ hoặc CPU khó khăn. Ngày nay, nhiều nền tảng nhúng hiện đại (nghĩ game console, điện thoại di động, PDA, vv), đã thực sự trở thành mục tiêu rất có khả năng, với kiến ​​trúc RISC, vài MB RAM và tăng tốc phần cứng 3D. Nó sẽ là một quyết định tồi tệ, để lập trình nền tảng như vậy bằng cách sử dụng chỉ C hoặc thậm chí lắp ráp các cân nhắc về hiệu năng không được cải thiện, mặt khác lập trình PIC 16 bit trong C++ cũng có thể là một quyết định gây tranh cãi. Vì vậy, nó thực sự là vấn đề tự hỏi mình có bao nhiêu quyền lực, bạn sẽ thực sự cần và bao nhiêu bạn có thể đủ khả năng để hy sinh, để cải thiện kinh nghiệm phát triển (ngôn ngữ cấp cao, phát triển nhanh hơn, ít tẻ nhạt/nhiệm vụ dự phòng).

2

Trong công ty trước đây, tất cả mã nhúng của tôi được viết bằng một tập nhỏ mã C do bảo mật (SIL-2) và lý do bộ nhớ. Bằng cách giới thiệu một ngôn ngữ phong phú hơn như C++ trong kịch bản cụ thể đó sẽ có thể gây ra nhiều rắc rối hơn lợi ích.

Trong tất cả sự tôn trọng C++ (ngôn ngữ tôi thực sự yêu thích) nhưng tôi nghĩ C - trong trường hợp cụ thể của chúng tôi - là lựa chọn tốt hơn.

Tôi đặt cược trong một số trường hợp C++ là tốt để sử dụng cho các ứng dụng nhúng nhưng nó thực sự phụ thuộc vào ứng dụng - có sự khác biệt nếu chương trình của bạn đang kiểm soát một nhà máy hạt nhân hoặc quản trị sổ địa chỉ trên điện thoại di động của bạn.

1

Bây giờ, một ngày, tất cả sẽ hỗ trợ thời gian chạy C++ của nền tảng. Bạn có thể tìm cách biên dịch mã C++ xuống hầu như mọi nền tảng nhúng với GCC, nhưng nếu bạn không thể tìm thấy thời gian chạy C++ phù hợp cho nền tảng, nỗ lực của bạn sẽ vô ích, trừ khi bạn viết thời gian chạy C++ của riêng bạn.

5

C++ cho nền tảng nhúng hoàn toàn ổn - miễn là bạn coi nó là tốt hơn C. Tôi thích thực tế là ngôn ngữ được cấu trúc một chút. Bạn vẫn có thể làm tất cả những điều mà bạn muốn làm với C. Chỉ cần nhớ để dính vào một thư viện C nhúng như Newlib hoặc uClibc.

Tôi đặc biệt thích sự trừu tượng mà chúng tôi có thể xây dựng bằng cách sử dụng C++, đặc biệt cho các thiết bị I/O. Vì vậy, chúng tôi có thể có một lớp học cho UART và một lớp học cho GPIO và những gì nots. Nó sạch hơn là có một loạt các chức năng (IMHO).

0

Một trong số ít những điều tôi có xu hướng đồng ý với Linus là ý kiến ​​của mình về C++ http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918

Bên cạnh đó, nếu bạn thực sự thực sự muốn sử dụng C++ bạn có thể muốn có một cái nhìn tại http://www.caravan.net/ec2plus/ trong đó mô tả Embedded C++, hoặc tốt hơn để nói rằng bạn không nên sử dụng trong C++ cho các hệ thống nhúng.

0

Điều quan trọng giúp chúng tôi sử dụng C++ trong một thời gian dài là hỗ trợ VxWorks cho nó, điều này thực sự bị hút. Đó là supposidly đã nhận được tốt hơn trên VxWorks 6 (có, nó được ra một lúc ... tốt 'ole nhà cung cấp khóa và thiếu tầm nhìn của công ty đã giữ cho chúng tôi bị mắc kẹt trên VxWorks 5.5).

Vì vậy, đối với chúng tôi, đó chủ yếu là câu hỏi về môi trường. Sau đó, C++ rõ ràng có thể tốt bằng C ... đó là vấn đề mọi người hiểu công cụ của họ làm gì và cách sử dụng nó. C++ có thể làm cho việc viết mã không hiệu quả cực kỳ dễ dàng hơn, nhưng điều đó không có nghĩa là chúng ta phải thành công với nó.

0

Tôi hiện đang chống lại sự cố với các ngoại lệ trong ứng dụng Linux được nhúng. Chúng tôi đang cố gắng chuyển phần mềm được viết cho một nền tảng khác có vẻ như hỗ trợ ngoại lệ tốt, nhưng các công cụ trình biên dịch mới (cổng gcc) báo cáo lỗi khi tạo eh_frame. Tôi đã chống lại việc sử dụng các ngoại lệ cho công cụ này, nhưng nhà phát triển đã trấn an tôi rằng các trình biên dịch hiện đại sẽ hỗ trợ nó tốt.

Ý kiến ​​của tôi là có một số lợi thế đối với C++, nhưng tôi sẽ tránh xa các ngoại lệ và thư viện mẫu chuẩn. Chúng tôi chưa gặp sự cố khi sử dụng các chức năng ảo.

0

C++ phù hợp cho vi điều khiển và thiết bị không có hệ điều hành. Bạn chỉ cần biết kiến ​​trúc của hệ thống và ý thức về các ràng buộc về thời gian và không gian, đặc biệt khi thực hiện lập trình quan trọng.

Với C++, bạn có thể làm trừu tượng thường dẫn đến tăng dấu chân trong mã. Bạn không muốn điều này khi lập trình cho một máy hạn chế tài nguyên như MCU 8 bit.

Nói chung, tránh:

  • cấp phát bộ nhớ động bởi vì nó đại diện cho sự không chắc chắn trong thời gian
  • quá tải
  • RTTI vì chi phí bộ nhớ lớn
  • Exceptions vì tốc độ thi công hạ

Hãy thận trọng với các chức năng ảo vì chúng có chi phí tài nguyên của vtable mỗi lớp và một con trỏ đến vtable cho mỗi đối tượng. Ngoài ra, hãy sử dụng const thay cho #define.

Khi bạn di chuyển lên đến 16 và 32-bit MCU, với 10 hoặc 100 MB RAM, các tính năng nặng hơn như được đề cập ở trên có thể được sử dụng.

Vì vậy, để làm tròn, C++ rất hữu ích cho các hệ thống nhúng. Một lợi ích chính là OOP có thể hữu ích khi bạn muốn trừu tượng các khía cạnh của vi điều khiển, ví dụ UART hoặc các máy trạng thái. Nhưng bạn có thể muốn tránh một số tính năng nhất định mọi lúc và một số tính năng trong một khoảng thời gian, tùy thuộc vào mục tiêu bạn đang lập trình.

Các vấn đề liên quan