2009-05-22 49 views
8

Có thể ai đó xin vui lòng cho tôi biết nếu nó có thể ghi một vi điều khiển 8.051 với một chương trình C + +? Tôi đã thử tìm kiếm về nó trực tuyến nhưng dường như không thể tìm ra chắc chắn nếu nó có thể hay không. Keil sử dụng C, nhưng chương trình tôi cần phải viết là rất nhiều chuỗi và C là khá chuỗi-không thân thiện so với C# đó là những gì tôi đang sử dụng để sử dụng. Tại thời điểm này, tôi đang cố gắng viết mã trong C nhưng nó thực sự lộn xộn, vì vậy tôi sẽ rất nhẹ nhõm nếu tôi có thể viết nó trong C++.C++ cho vi điều khiển 8051?

Tôi cần trình biên dịch C++ để tạo tệp kết xuất Hex có thể được ghi lên bộ vi điều khiển. Có ai nghe về thứ gì đó tôi có thể sử dụng không? Và C cũng sử dụng một tệp tiêu đề cho phép bạn tham chiếu đến cổng, nhưng khi tôi cố tìm hiểu xem tệp tiêu đề này có được sử dụng trong C++ hay không, tôi không thể tìm thấy bất kỳ thông tin nào trên đó.

Bổ sung: Bộ vi điều khiển tôi đang sử dụng là Atmel AT89C51 với 4K Byte bộ nhớ Flash lập trình lại và RAM nội bộ 128 x 8 bit. Điều này thực sự là cho một Robot cho một dự án ở trường đại học và mã hóa không thực sự yêu cầu OOP. Nó chỉ có rất nhiều tra cứu bảng có định dạng mảng chuỗi 2D. Lý do duy nhất tôi muốn xem xét C + + là do cách thao tác lộn xộn các chuỗi dường như đang nhận được (do MY thiếu chuyên môn trong C).

Và có ai biết về tệp tiêu đề không? C sử dụng #include reg51.h nhưng tôi đã cố gắng để tìm hiểu xem điều này làm việc cho C + + và không thể tìm thấy bất cứ điều gì về nó.

+4

Tôi không biết nếu có cách nào có nguồn gốc, nhưng bạn luôn có thể sử dụng LLVM C++ to C dịch. – Zifre

+0

Bạn có bao nhiêu bộ nhớ (cả ROM và RAM)? – lothar

+3

Quên đi! Có thể bạn sẽ cần mỗi ** bit ** duy nhất của 128 Byte RAM và 4096 Byte Flash. Sử dụng ngôn ngữ lắp ráp được khuyến khích mạnh mẽ ... –

Trả lời

2

Có trình biên dịch thương mại từ ceibo.

Tuy nhiên nếu bạn có thể sử dụng C++ (đặc biệt là chuỗi STL) phụ thuộc vào bao nhiêu nguồn lực (cả ROM và RAM bạn sẽ có.

Có một 8051 site với diễn đàn, hướng dẫn và tải nơi bạn có thể nhận được một số tài nguyên hơn cho lập trình 8051.

11

Tôi sẽ đặt câu hỏi liệu đây có thực sự là ý tưởng hay không ngay từ đầu Tôi hiểu lý do đằng sau muốn sử dụng C++ trên C trong trường hợp chung nhưng trong trường hợp của vi điều khiển kiến ​​trúc Harvard 8 bit Tôi sẽ cảnh báo về điều này.

Những điều cần lưu ý trong tâm trí bao gồm:

  • Hỗ trợ gỡ lỗi cấp nguồn sẽ ở đâu đó giữa người nghèo và không thể.
  • Thời gian chạy trên cao của OOP trên máy 8 bit. Tôi thực sự khuyên bạn nên thực hiện một số điểm chuẩn nghiêm trọng trước khi cam kết với một công cụ.
  • Bộ nhớ không hề rẻ trong các hệ thống nhúng và bạn sẽ không nghi ngờ có một số hạn chế về không gian địa chỉ.

Ngoài ra, nếu bạn thực sự đang xử lý chuỗi nghiêm trọng, tôi khuyên bạn nên sử dụng thư viện chuẩn C chứ không phải thư viện đối tượng chuỗi đơn giản vì bạn có quyền kiểm soát tốt hơn thay thế tại chỗ. glaringly rõ ràng trong mã.

Vui lòng đăng một chút về vi điều khiển bạn dự định sử dụng (Bộ nhớ dữ liệu, Bộ nhớ chương trình) và có yêu cầu về hiệu năng nào phải đáp ứng để chúng tôi có thể giúp cụ thể hơn một chút không.

+1

"Hỗ trợ gỡ lỗi cấp nguồn sẽ ở đâu đó giữa người nghèo và không thể". IMHO nó sẽ không khác với việc gỡ lỗi C. Nếu mục tiêu có JTAG nó sẽ khá eo hẹp về phía trước nếu trình gỡ lỗi có hỗ trợ cho nó. – lothar

+0

Từ những gì tôi hiểu, tất cả 8051 C++ công cụ dịch sang C và sử dụng một nền tảng phổ biến như các công cụ Keil hoặc các hệ thống IAR. Đây là những công cụ sau đó thực hiện hỗ trợ gỡ lỗi IDE. Tất nhiên tôi có thể bị nhầm lẫn hoàn toàn :-) – mikelong

+2

Hãy nhớ rằng C++ thực hiện tính toán/tạo mã thời gian để nó có thể tạo ra mã tốt hơn so với bất kỳ trình biên dịch C nào. Tôi đang làm việc trên một cổng LLVM đến một kiến ​​trúc 8 bit (xin lỗi, không thể nói nhiều hơn thế), và mặt trước C++ tạo ra mã số đẹp mà không thể tạo ra từ C thuần khiết! Về cơ bản tôi đã có một phiên bản tấn công của Eigen 3 tạo mã số điểm cố định cho kiến ​​trúc 8 bit với hệ số phần cứng. Mã đó ngang bằng với việc lắp ráp bằng tay, nhân tiện. –

1

Bạn có thể muốn xem xét việc cung cấp chi tiết bổ sung về các loại chương trình mà bạn định chạy trên vi điều khiển:

Bạn nói C++, cũng như C# trong thông báo của bạn, cả hai đều chắc chắn không lý tưởng sử dụng để xử lý chuỗi nặng trên vi điều khiển, chưa kể rằng bạn có thể xem xét sử dụng nhiều STL, điều này sẽ làm tăng kích thước của tệp thực thi hơn nữa?

Vậy chính xác những hạn chế chính của bạn (RAM, CPU, ROM v.v.) là gì? Nếu bạn thực sự nghĩ rằng bạn cần phải thực hiện xử lý chuỗi này theo kiểu OO, bạn có thể muốn xem xét chạy một trình thông dịch kịch bản nhúng nhẹ trên bộ điều khiển, để sau đó bạn có thể cung cấp các quy trình xử lý chuỗi bằng cách sử dụng ngôn ngữ kịch bản lệnh , trong khi thông dịch viên chính nó sẽ được ANSI C biên dịch thành một tệp HEX (ví dụ: lua hoặc nasal cả hai sẽ có vẻ như là ứng cử viên phù hợp). Tuy nhiên, có tính đến một ngôn ngữ kịch bản như lua thường sẽ áp đặt khoảng 100kb + phí trong không gian, Mũi nhẹ hơn một chút và có thể biên dịch xuống 50-70 kb nếu bạn tắt một số tiện ích mở rộng nhất định.

Ngoài ra, còn có các trình thông dịch tập lệnh khác có sẵn đặc biệt được sử dụng trên nền tảng được nhúng.

+0

Đối với một bộ vi xử lý như thế này, việc chạy một công cụ tạo kịch bản sẽ quá lớn. Tốt hơn để viết một số thói quen chuỗi hiệu quả trong C hoặc C++. –

+0

nó thực sự nắm được những gì anh ta cần phải làm, có nhiều mục tiêu nhúng khác như các bộ định tuyến ví dụ cũng không cung cấp nhiều năng lượng hơn 8051, nhưng vẫn sử dụng các công cụ tạo kịch bản, tức là để cung cấp Giao diện người dùng có thể sử dụng linh hoạt và có thể duyệt được – none

+0

@ không có - tôi là một cô ấy bằng cách này! :-) – CodeConfused

0

Có một số trình biên dịch thương mại có sẵn. Số 1 trong ngành là từ Keil Software.

+0

Tôi đã sử dụng Keil trước đó. IMHO, IDE của họ là lựa chọn tốt nhất cho phát triển 8.051 C. - Nhưng việc quét trang web của tôi dẫn tôi đến kết luận rằng họ không * cung cấp các trình biên dịch C++ cho 8.051. Tui bỏ lỡ điều gì vậy? – Nate

+2

Tôi chỉ nói chuyện với một trong những dev của họ, và bạn nói đúng. Nó chỉ là C. Vì vậy, câu trả lời của tôi không thực sự đáp ứng các yêu cầu của OP. ; – NotMe

4

Hệ thống IAR có 8051 compiler có thể biên dịch C++ nguyên bản (không dịch sang C) và gỡ lỗi ở cấp nguồn không phải là vấn đề.

+0

Đây là liên kết cho trình biên dịch C/C++ 8051 của IAR: http://iar.com/website1/1.0.1.0/244/1/ – Nate

+0

Cảm ơn, đã cập nhật bài đăng. Tôi đã quá lười biếng để khai thác liên kết. – JesperE

0

Bạn có thể thử chuyển đổi mã C++ thành mã C và sau đó biên dịch nó bằng trình biên dịch C hiện có của bạn.

Bạn sẽ có thể tạo một Makefile gọi trình biên dịch C++ và sau đó chạy trình biên dịch C sau đó.

Nó không phải là giải pháp thanh lịch nhất nhưng nó thực sự là khá bất thường để sử dụng C++ trên các thiết bị nhỏ như Disclaimer 8051.

: Tôi đã không thực sự cố gắng may mắn rất tốt này! Nếu đó là tôi, tôi sẽ dính vào C và viết một số chức năng xử lý chuỗi mạnh mẽ.

0

Những người khác đã đề cập rằng có trình biên dịch C++ cho 8.051. Tôi đoán vấn đề chính của bạn với những vấn đề đó sẽ là chi phí. Rất nhiều công ty sẽ cho phép bạn viết assembly miễn phí nhưng tính phí cho trình biên dịch C hoặc C++. Có lẽ chúng ta đang nói vài trăm đô la ở đây.

Câu hỏi chính của tôi là những gì đang nhận được 'lộn xộn' trong mã của bạn? Bạn đang cố gắng sử dụng những tính năng nào trong C++, điều đó đang trở nên lộn xộn trong C? Một số tính năng trong C++ không dịch tốt đến môi trường nhúng tối thiểu như vậy (luồng, hàm tạo, hàm hủy, v.v.). C có thể thực hiện nhiều chức năng kiểu hướng đối tượng với các cấu trúc. Các chức năng khác chỉ nên tránh (bất cứ điều gì với quản lý bộ nhớ động).

Tôi sẽ cố gắng làm cho nó hoạt động trong C trước khi có khả năng chi tiêu nhiều tiền và nhận mã lớn, chậm và khó sử dụng.

+0

Tôi bắt đầu nghĩ rằng bạn đúng, Stephen. :( Chỉ là không có gì dễ dàng có sẵn – CodeConfused

1

IAR dường như cung cấp a C/C++ compiler for 8051'sa C/C++ compiler for 8051's. - Nhưng trong tiết lộ đầy đủ, tôi chỉ sử dụng trình biên dịch C của Keil để phát triển 8.051. Đối với các mối quan tâm của tệp tiêu đề: Các tệp tiêu đề thường được phân phối bởi nhà cung cấp IDE hoặc nhà sản xuất phần cứng và thường cung cấp một biểu diễn tượng trưng cho ánh xạ đăng ký của bạn. Một số tiền khiêm tốn của việc xoa bóp có thể được yêu cầu để kết hợp tệp tiêu đề dựa trên C vào một dự án C++. - Nếu bạn chuẩn bị chuyển đổi các trình biên dịch/IDE của bạn, bạn thường có thể mong đợi một số mã nguồn của bạn để chứa trình biên dịch mới. (Đọc: truy cập mã C từ cơ sở mã C++ thường khiến tôi dừng lại một ngày để làm đúng.)

0

Có vẻ như bạn muốn trình biên dịch C++ để bạn có thể sử dụng std::string. std::string yêu cầu một đống. Bạn sẽ không có một heap có thể sử dụng với chỉ 128x8 bit RAM nội bộ, đặc biệt là không cho các đối tượng std::string Hãy xem xét nếu bạn đọc một chuỗi 80 ký tự từ một cổng nối tiếp, tiêu thụ hơn 60% RAM sẵn có của bạn. Bạn cũng sẽ sử dụng RAM bên ngoài? Bao nhiêu?

Phần mềm của bạn có thực sự cần xử lý xử lý chuỗi khi chạy không? Ví dụ, nó gửi/nhận lệnh như chuỗi thông qua một cổng nối tiếp hoặc một số giao diện khác? Nếu vậy, bạn nên cô lập chuỗi xử lý từ phần còn lại của mã của bạn càng nhiều càng tốt, và sử dụng các thẻ (các kiểu liệt kê hoặc các hằng số tách rời #defined) ở nơi khác. Nếu không, bạn sẽ gặp phải ít rắc rối khi lắp logic vào bộ nhớ bị hạn chế của bộ vi xử lý bằng cách sử dụng mã thông báo thay cho chuỗi.

Ngoài ra, nếu bạn cần phân tích cú pháp chuỗi, bạn có thể viết tắt máy trạng thái xử lý từng ký tự một lần để bạn không phải xử lý chuỗi đầy đủ. Một lần nữa, 128 byte không phải là rất nhiều không gian để xử lý chuỗi.

+1

Chỉ cần làm rõ.Bạn biết đấy, std :: string chỉ là typedef cho basic_string, với char và phân bổ. Thay vì phân bổ số lượng lớn, trình phân bổ tùy chỉnh có thể được triển khai –

+0

@Johann Gerell: Tôi nghi ngờ rằng việc viết một phân bổ STL tùy chỉnh quản lý các chuỗi được lưu trữ trong ROM sẽ khó khăn hơn nhiều (nếu có thể) hơn viết lại chuỗi xử lý trong C. Hãy nhớ rằng Hệ thống đích của OP chỉ có 128 byte RAM và 4 KB flash, điều đó có nghĩa là các bảng tra cứu phải được lưu trữ trong flash. – bk1e

0

Tại sao không sử dụng thư viện chuỗi C? Giống như bstrlib hoặc tương tự? C++ không phải là những gì bạn cần cho vi điều khiển này.

0

có, bạn có thể ghi bộ nhớ của vi điều khiển 8051 bằng chương trình C++ và cũng có một số trình biên dịch miễn phí có thể được sử dụng để tạo tệp Hex và sau đó gửi tệp đến vi điều khiển. Bạn có thể tìm thấy bất kỳ thông tin nào về quy trình lập trình vi điều khiển trong một số comprehensive article with tutorials, compilers, simulators, etc

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