Có thể viết mã bằng C ++ cho vi điều khiển PIC trong tương lai không?


8

Có bao giờ sẽ có thể sử dụng C ++ để mã hóa PIC không? Có giới hạn phần cứng nào ngăn chúng ta sử dụng C ++ không? Kích thước của tệp .hex được tạo và thời gian chạy của chương trình tăng bao nhiêu khi chúng tôi sử dụng C ++ thay vì C? Có thực tế có thể sử dụng C ++ cho PIC hiện tại không? Có bất kỳ kế hoạch trong tương lai hoặc phát triển liên tục về điều này?


Tôi nghĩ điều đó là có thể và sẽ vẫn có thể, nhưng AFAIK không được khuyến khích vì nó thực hiện các cấu trúc và chức năng cấp cao không phù hợp với lập trình liên quan đến phần cứng mạnh mẽ
clabacchio

3
Đối với cuộc tranh luận về sự phù hợp - Electronics.stackexchange.com/questions/3027/iêu
Toby Jaffey

2
Vì câu trả lời là "Có, đã có trình biên dịch C ++", tôi sẽ để điều này tồn tại, nhưng trong tương lai bạn nên biết rằng các câu hỏi của Stack Exchange phải là về các sự kiện có thể kiểm chứng, không phải là giả định về tương lai.
Kevin Vermeer

2
@clabacchio: Không nhất thiết phải đúng. Trong C ++, bạn chỉ trả tiền cho những gì bạn sử dụng. Xem câu trả lời của tôi tại: Electronics.stackexchange.com/questions/3027/ từ
Rocketmagnet

"PIC" là một khái quát vô dụng. Trên một số PIC cấp thấp (nghĩ 10F200) C gần như không thể sử dụng. Trên một số PIC cao cấp (sê-ri 32MX) C ++ được đồn đại sẽ được sử dụng ngay bây giờ và chắc chắn không có lý do kỹ thuật nào khiến nó không thể. Vì vậy, một số tập trung tốt hơn có thể cho câu trả lời dễ sử dụng hơn, ngay bây giờ mọi người đang có hiệu lực trả lời một câu hỏi khác nhau.
Wouter van Ooijen

Câu trả lời:


17

Có bao giờ sẽ có thể sử dụng C ++ để mã hóa PIC không?

Vâng, bây giờ có thể. Đối với DSPIC, có Trình biên dịch IAR Systems C ++ (mặc dù nó rất cũ và không được hỗ trợ).

Một lựa chọn khác là sử dụng bộ chuyển đổi C ++ sang C. Sử dụng bước xây dựng trước, chuyển đổi C ++ thành C, sau đó cung cấp C (tìm kiếm khó chịu) cho trình biên dịch C bình thường của bạn. Hãy xem trình biên dịch C ++ của LLVM hoặc Comeau , cả hai đều làm được điều đó. Comeau's chỉ có 50 đô la, nhưng có lẽ sẽ mất một số nỗ lực để làm cho toàn bộ chuỗi công cụ và thư viện hoạt động tốt.

Có giới hạn phần cứng nào ngăn chúng ta sử dụng C ++ không?

Câu trả lời ngắn, không, không có giới hạn phần cứng. Câu trả lời dài, C ++ chắc chắn khuyến khích việc sử dụng một đống và / hoặc ngăn xếp, mà các MCU nhỏ hơn với RAM hạn chế sẽ phải vật lộn với.

Tại sao họ phải vật lộn với một đống / đống? Vì hai lý do: A) nhiều MCU có RAM hạn chế, không đủ cho một đống chắc chắn và chỉ đủ cho một ngăn xếp. B) nhiều MCU không xử lý tốt con trỏ, vì vậy sử dụng các biến trên ngăn xếp thực sự giết chết hiệu suất.

Khi mọi người hỏi về việc sử dụng C ++ trên MCU, tôi thấy việc xây dựng C ++ để so sánh với C. Các câu hỏi tương tự chính xác là (và vẫn còn) được hỏi về C trên MCU. Mọi người thường chùn bước trước ý tưởng. Một ngôn ngữ cấp cao, trên MCU RAM 256 byte ?? Không thể nào. Nhưng bây giờ chúng ta đều biết điều đó là có thể. Tôi đã viết C cho PIC12. Không vấn đề gì. Có thể vì A) các nhà phát triển phần mềm biết rằng họ phải cẩn thận một chút: không sử dụng malloc (), v.v. và B) trình biên dịch đã được viết riêng cho MCU. Trình biên dịch cũng sẽ hết sức cẩn thận với việc cấp phát bộ nhớ, nó sẽ không cố tạo ra một đống và có thể không tạo ra một ngăn xếp. Một số trình biên dịch C đơn giản sẽ không cho phép bạn viết mã đăng ký lại (đệ quy) mà hoàn toàn yêu cầu một ngăn xếp.

Biết rằng có thể viết C cho MCU, các câu trả lời tương tự cũng áp dụng cho câu hỏi viết C ++ trên MCU. Miễn là trình biên dịch hiểu được các giới hạn của thiết bị đích và người dùng cũng hiểu ngôn ngữ, thực sự không có vấn đề gì. Trong C ++, bạn chỉ trả tiền cho những gì bạn sử dụng. Hoàn toàn có thể viết C ++ (với các đối tượng và mọi thứ) tạo ra đầu ra asm chính xác mà bạn sẽ có nếu bạn sử dụng C.

Bây giờ, PIC32 chắc chắn có thể đối phó với C ++. Chúng có RAM lên tới 64kB và dựa trên lõi MIPS, đây là bộ xử lý 32 bit được phát triển đúng cách. Nó có thể đối phó với con trỏ và ngăn xếp cũng như PC. Thật vậy, có những PC dựa trên MIPS (hoặc ít nhất, đã từng có).

Đáng buồn thay, có rất nhiều hiểu lầm xung quanh C ++. Ngay cả các lập trình viên rất có kinh nghiệm dường như không biết làm thế nào ngôn ngữ hoạt động. Xem câu trả lời của tôi về lý do tại sao C ++ phù hợp trên các CPU nhúng.

Kích thước của tệp .hex được tạo và thời gian chạy của chương trình tăng bao nhiêu khi chúng tôi sử dụng C ++ thay vì C?

Như tôi đã nói, có thể không có sự khác biệt. Bjarne Stroustrup đã so sánh một loạt các trình biên dịch C / C ++ để so sánh hiệu suất thời gian và không gian cho một số hoạt động. Kết quả rất đa dạng. Trong một số trường hợp, C ++ ra đời chậm hơn và lớn hơn, một số trường hợp chậm hơn và nhỏ hơn, hoặc nhanh hơn và lớn hơn, và thậm chí nhanh hơn và nhỏ hơn! Vì vậy, câu trả lời cho câu hỏi của bạn là nó phụ thuộc rất nhiều vào trình biên dịch, nhưng nói chung, nó không cần tạo ra sự khác biệt nào cả. Để biết thêm chi tiết, xem Báo cáo kỹ thuật về hiệu suất C ++

Có bất kỳ kế hoạch trong tương lai hoặc phát triển liên tục về điều này?

Điều đó tôi không biết. Tôi biết rằng trình biên dịch Microchip C32 được mở nguồn và bạn có thể tải xuống nguồn. Tôi cũng biết rằng ai đó mà tôi đã làm việc thực sự đã tìm thấy một số hướng dẫn trực tuyến và quản lý để có được trình biên dịch để biên dịch mã C ++. Nhưng anh ấy đã rời công ty trước khi anh ấy có thể thiết lập cho tôi một chuỗi công cụ thích hợp.


CẬP NHẬT

Microchip hiện có trình biên dịch C ++ cho các MCU nhúng PIC32.



từ trang web của IAR: "Sản phẩm kế thừa: Bàn làm việc nhúng IAR cho DSPIC là một sản phẩm kế thừa. IAR Systems không cập nhật nó và không thể mua Thỏa thuận hỗ trợ và cập nhật cho nó."
Jason S

Tôi biết các sản phẩm IAR rất tuyệt, nhưng tiếc là rất đắt và có vẻ như 'cũ'. Tôi biết C ++ khả thi trên mọi nền tảng miễn là bạn không sử dụng tất cả các tính năng. Tuy nhiên, nó không thêm khả năng cho một lớp trừu tượng thêm với các lớp. Tôi không sử dụng các mẫu thường xuyên, tôi cũng không sử dụng phân bổ bộ nhớ động. Có ai tình cờ biết bất kỳ đối thủ cạnh tranh nào khác cho C ++ trên PIC24 / PIC32 không?
Hans

Vâng, xin lỗi, nó không thực sự là một phát hiện tuyệt vời. Hãy để tôi thêm một số điều nữa vào câu trả lời của tôi.
Rocketmagnet

1
Tôi sẽ coi C là đối thủ cạnh tranh của C ++ trên vi điều khiển. Tôi không thể nghĩ ra bất cứ điều gì tôi muốn làm trong C ++ mà tôi không thể làm trong C và có ít lệnh gọi hàm vô hình hơn (hàm tạo, hàm hủy, v.v.). Làm cho mã xác định hơn và rõ ràng hơn. Những tính năng nào của C ++ là thứ bắt buộc không thể nhầm lẫn với C?
AngryEE

1
Người ta có thể hỏi: "Những tính năng nào của C là phải có mà không thể bị nhầm lẫn trong ASM?" Trả lời, "Không có gì". Lợi ích là tăng khả năng cho người thiết kế chỉ định thiết kế và yêu cầu trình biên dịch kiểm tra việc thực hiện là chính xác. Xem câu trả lời của tôi Electronics.stackexchange.com/questions/3027/ cho một danh sách các lợi ích thực sự và ngay lập tức của C ++ về vấn đề này.
Rocketmagnet

5

Kích thước của tệp .hex được tạo và thời gian chạy của chương trình tăng bao nhiêu khi chúng tôi sử dụng C ++ thay vì C?

Phụ thuộc vào những tính năng bạn sử dụng. Nếu bạn sử dụng các tính năng hướng đối tượng cốt lõi (lớp + phương thức), có thể có rất ít hiệu ứng (tên biến / hàm hàm được kéo dài hơn để bảng biểu tượng có thể sẽ tăng lên phần nào). Các mẫu không nên thêm nhiều với một trình biên dịch tốt.

Nếu bạn phát điên và tìm ra những thứ như Thư viện mẫu tiêu chuẩn và sử dụng phân bổ và ngoại lệ bộ nhớ động, thì có khả năng bạn sẽ gặp phải tình trạng phình to mã.


Chỉ cần cảnh báo cho OP, rất cẩn thận về việc cấp phát bộ nhớ cho các kiến ​​trúc bộ nhớ nhỏ và các hệ thống nhúng luôn chạy.
kenny

"-1" er có thể vui lòng nhận xét tại sao anh ấy / cô ấy không đồng ý không?
Jason S

Tôi không phải là -1er nhưng các mẫu là một tính năng phải được sử dụng hết sức cẩn thận để tránh phình mã. Bạn có thể dễ dàng kết thúc với nhiều bản sao của thuật toán khi một thuật toán đủ.
Peter Green

Để làm điều đó, bạn thực sự sẽ phải sử dụng mẫu với một số loại dữ liệu khác nhau và một bản sao KHÔNG NÊN đủ trừ khi bạn đang sử dụng mã đa hình có một lớp cơ sở chung. (Trong trường hợp có chi phí thời gian chạy.) Các mẫu không làm cho mã của bạn bị phồng lên một cách kỳ diệu, chúng chỉ gây ra mã bị phồng khi bạn sử dụng chúng với nhiều loại dữ liệu khi bạn không nhận thức được hậu quả.
Jason S


1

Tổng quát hóa câu hỏi của bạn, có những bộ xử lý ARM được xây dựng cho thị trường nhúng có chứa MMU (đơn vị quản lý bộ nhớ). Kích thước bộ nhớ và phân bổ làm cho các ngôn ngữ như java và c ++ lựa chọn nhúng kém. Khi các bộ xử lý nhúng tiếp tục nhanh hơn và mạnh hơn, và khi bộ nhớ trở nên dày hơn và rẻ hơn, các lựa chọn ngôn ngữ có sẵn cho các kỹ sư nhúng thay đổi đáng kể. Bộ xử lý ARM 32 bit 600 MHz với MMU và thẻ Flash 64G là một ứng cử viên tuyệt vời cho các ứng dụng c ++. Liệu nó có phù hợp với định nghĩa của bộ xử lý nhúng cổ điển hay không là một vấn đề khác.


0

Có lẽ là có .. nhưng dù sao thì bạn cũng không nên ... C là ngôn ngữ được nhúng và không có lợi thế nào khi sử dụng C ++. Hay đúng hơn, lợi thế của C vượt xa các lợi thế của C ++ để nhúng. Đừng lãng phí thời gian của bạn.

  • Nếu bạn biết cách sử dụng các hàm con trỏ, v.v. Bạn có thể viết mã như C ++, không có vấn đề gì ở đó.

5
Tôi có ý kiến ​​khác. Bạn có thể sử dụng nhiều tính năng của C ++ (các lớp, mẫu, nạp chồng toán tử, tham chiếu) với ít hoặc không mất chi phí thời gian chạy. Vâng, bạn có thể thực hiện tất cả những điều này trong C đơn giản với các cấu trúc hackish, nhưng đó là một lực cản trong bộ não của bạn, và tôi thích sử dụng C ++ hơn. (tất nhiên tôi muốn sử dụng một ngôn ngữ tốt hơn, nhưng tôi sẽ chọn một trình biên dịch C ++ trong một nhịp tim trên đồng bằng C.)
Jason S

1
Classes = structs (không có phương thức dựng sẵn, nhưng nếu bạn thích, bạn có thể lưu trữ một con trỏ hàm trong cấu trúc và gọi đó). Mẫu = bạn sử dụng những ??? Toán tử quá tải = có tôi cũng muốn điều đó. Tài liệu tham khảo = con trỏ, không? Với C ít nhất bạn chỉ có thể sử dụng 'tính năng' của C ++ mà bạn muốn mà không phải lo lắng về việc tạo mã thừa hoặc phải bao gồm một thư viện lớn ngẫu nhiên chỉ để lấy thứ gì đó để biên dịch.
AngryEE

1
Tôi cũng xin khác.
Rocketmagnet

3
Có, các mẫu là một cách cực kỳ mạnh mẽ để tạo mã hiệu suất cao và đáng tin cậy. Tài liệu tham khảo là một con trỏ đáng tin cậy hơn. Với C ++, bạn cũng chỉ trả tiền cho các tính năng bạn sử dụng. Tôi nghĩ rằng bạn thực sự cần phải hiểu C ++ nhiều hơn.
Rocketmagnet

3
Tôi không biết ý của bạn là "C là ngôn ngữ được nhúng". Chắc chắn, nó rất phổ biến. Bạn đang nói rằng đó là ngôn ngữ tốt nhất có thể? Chắc chắn là không.
Rocketmagnet
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.