Vi điều khiển với API Java


10

Nhóm phần cứng của tôi đang lên kế hoạch sử dụng bộ vi điều khiển 8 bit Atmel AVR cho một dự án trong tương lai.

Theo như tôi biết, nó phải được lập trình trong C. Tôi đã tìm thấy một JVM cho AVR, mặc dù nó bị giới hạn hơn so với các thư viện C gốc từ Atmel.

Bạn có thể gợi ý cho tôi một vi điều khiển 8 bit hỗ trợ Java không?

Tái bút Tôi không biết C và tôi thiếu kinh nghiệm lập trình vi xử lý.


28
Giả sử ai đó đang bán một chiếc váy nổi lớn và một số cực dài mà họ nói rằng bạn có thể sử dụng với chiếc xe của mình để đi câu cá trên hồ. Sau khi vật lộn trong ba ngày để đặt nó lên, bạn có được khoảng 15 feet xuống hồ trước khi xe của bạn lật và chìm. Bạn sẽ là người cha thực sự tức giận. Bạn đã đi qua cửa hàng thuyền địa phương với một chiếc xuồng đẹp. Ca nô là trình biên dịch C của micro và chiếc xe floaty có gậy là Java trên bộ vi điều khiển 8 bit. May mắn thay, điều này đã không xảy ra ... bạn đang hỏi chúng tôi nơi bạn có thể tìm thấy những chiếc phao. Vì vậy, với tư cách là cha của bạn, hãy để tôi nói "Bạn đang nghĩ gì?! Hãy đi ca nô!"
darron

6
Tôi đang gặp khó khăn khi hình dung chiếc xe floaty với gậy. Bạn có bức tranh nào không?
endolith

8
@darron - Không phải đó là một big_floating_skirtđối tượng thực hiện boatgiao diện trong org.buoyantgói và polecác đối tượng, có một kiểu mẫu thừa kế kỳ lạ java.netmà tôi không thể nhớ bây giờ (nhưng được mô tả rõ ràng trong UML)?
Kevin Vermeer

2
@sterz: Tôi nghĩ rằng không có nền tảng của bộ vi xử lý, điều hoàn toàn dễ hiểu là bạn có thể không nhận ra Java nằm ngoài vi mô 8 bit thực sự như thế nào. Xin lỗi nếu nhận xét đầu tiên của tôi nghe có vẻ gay gắt ... Một "Đừng làm vậy" đơn giản dường như quá yếu.
darron

1
@darron: cảm ơn vì sự tương tự "bắn chim bằng đại bác"
sterz

Câu trả lời:


32

Nếu bạn chưa có kinh nghiệm trong lĩnh vực lập trình vi xử lý / vi điều khiển, có lẽ bạn nên học C trước, để bạn có thể hiểu khi nào và tại sao Java là lựa chọn kém cho hầu hết các dự án vi điều khiển.

Bạn đã đọc các hạn chế đối với JVM mà bạn đã liên kết chưa? Nó bao gồm các vấn đề sau:

  • Ít nhất là 512 byte bộ nhớ chương trình (không phải KB và chắc chắn không phải MB)
  • Ít nhất là 768 byte RAM (nơi các biến của bạn đi. Bạn bị giới hạn ở 768 ký tự chuỗi bởi hạn chế này.)
  • Khoảng 20k opcodes Java mỗi giây trên 8 Mhz AVR.
  • Chỉ bao gồm java.lang.Object, java.lang.System, java.io.PrintStream, java.lang.StringBuffer, lớp điều khiển JVM và lớp IO gốc. Bạn sẽ không thể thực hiện nhập java.util. *; và nhận được tất cả các lớp không có trong danh sách này.

Nếu bạn không quen với những hạn chế này có nghĩa là gì, hãy đảm bảo rằng bạn có kế hoạch B nếu hóa ra bạn thực sự không thể thực hiện dự án với Java do các hạn chế về không gian và tốc độ.

Nếu bạn vẫn muốn sử dụng Java, có lẽ vì bạn hy vọng thiết bị sẽ được lập trình bởi nhiều người chỉ biết Java, tôi thực sự khuyên bạn nên có phần cứng lớn hơn, có thể là thứ gì đó chạy Linux nhúng. Xem trang này từ Oracle để biết một số thông số kỹ thuật để chạy JVM được nhúng, trong Câu hỏi thường gặp về cuộc thảo luận của họ, họ đề xuất tối thiểu 32 MB RAM và 32 MB Flash. Đó là khoảng 32.000 lần RAM và 1,00 lần Flash của AVR mà bạn đang xem. Trang Giới thiệu nhúng Java của Oracle đi sâu vào chi tiết hơn về các hạn chế của JVM. Giọng điệu của họ, như bạn có thể đoán, rất thân thiện với Java hơn tôi. Xin lưu ý rằng loại phần cứng này khó thiết kế hơn nhiều so với AVR 8 bit.

Tôi là một sinh viên kỹ thuật máy tính với một trẻ vị thành niên khoa học máy tính. Khoa CS của trường đại học của tôi đã uống chương trình hỗ trợ Java Kool, vì vậy rất nhiều sinh viên trong chương trình kỹ thuật chỉ biết Java (đó là một tình trạng đáng buồn cho một lập trình viên, ít nhất là học một số Python hoặc C ++ nếu bạn không muốn học C ...), vì vậy một trong những giáo sư của tôi đã xuất bản Bảng Cheat C cho sinh viên có một năm kinh nghiệm Java. Chỉ có 75 trang; Tôi đề nghị bạn đọc hoặc đọc lướt nó trước khi đưa ra quyết định. Theo tôi, C là ngôn ngữ chuyên nghiệp, hiệu quả và bền vững nhất để phát triển một dự án nhúng.

Một lựa chọn khác để xem xét là khung Arduino . Nó sử dụng một phiên bản rút gọn của ngôn ngữ Wires , giống như C ++ mà không có đối tượng hoặc tiêu đề. Nó có thể chạy trên nhiều chip AVR, nó chắc chắn không bị hạn chế đối với phần cứng của chúng. Nó sẽ cung cấp cho bạn một đường cong học tập dễ dàng hơn là chỉ cần nhảy thẳng vào C.

Để kết luận,
Búa vàng XKCD
văn bản Alt: Đã cho tôi năm cố gắng tìm đúng, nhưng cuối cùng tôi đã cứu được chúng tôi - nếu không phải là chiếc thuyền - cuối cùng.


5
Một trong những truyện tranh yêu thích của tôi, tôi đã từng rất thích.
Kortuk

1
Mmm, phụ tá tuyệt vời. +1
tyblu

Tôi tự hỏi làm thế nào mà JVM so sánh với "Java iButtons" đã có sẵn một vài thập kỷ trước?
supercat

@kevin Liên kết "C Cheat sheet" không hoạt động! Vui lòng cập nhật!
charansai

6

Môi trường lập trình phổ biến nhất cho Atmel AVR là Arduino . Ngôn ngữ Arduino là một tập hợp con của C ++.

Arduino "phác thảo" / chương trình xuất hiện về mặt cú pháp rất giống với Java. Các ngôn ngữ Dây mà xuất phát từ Arduino có triển khai trong C ++ ( Arduino ), Java ( chế biến ) và Javascript ( Processing.js ).

Cả hai ngôn ngữ đều có chung kiểu khai báo, cấu trúc vòng lặp và toán tử số học do tổ tiên chung của chúng trong Algol68. Thông thường, tất cả các đối tượng trong Arduino được khai báo trên toàn cầu hoặc trên ngăn xếp, do đó, giống như Java, các hàm thành viên được gọi với .toán tử (ví dụ LED.flash():).

Ngôn ngữ này sẽ rất quen thuộc với một lập trình viên Java - nhưng quan trọng là các bản phác thảo Arduino được biên dịch thành mã gốc chạy ở tốc độ tối đa với toàn quyền truy cập phần cứng. Điều này là rất quan trọng để có được nhiều nhất từ ​​vi điều khiển của bạn.

Đây là API .

Arduino cung cấp mọi thứ bạn cần để thực hiện: phần cứng chi phí thấp, môi trường phát triển tích hợp miễn phí và bộ tải khởi động (để bạn có thể tải mã qua USB / nối tiếp).


3
Nói chính xác hơn, đó là (rất có thể) môi trường lập trình phổ biến nhất với những người có sở thích, nhưng không nhất thiết phải trên tất cả các nhà phát triển AVR.
pfyon

2
Tôi khẳng định rằng Arduino phổ biến nhất theo số lượng người dùng, nhưng không phải theo số lượng đơn vị sản phẩm được vận chuyển có chứa phần mềm Arduino. Có rất nhiều người dùng Arduino ngoài kia
Toby Jaffey

1
Mặc dù "bản phác thảo" được biên dịch, tốc độ truy cập IO có thể được cải thiện đáng kể bằng cách sử dụng C hoặc lắp ráp.
tyblu

1
C ++ và Java trông rất khác với tôi. ("Arduino" chỉ là C ++ với một số cấu trúc kỳ lạ bao gồm để ẩn một số bit kỹ thuật.)
Nick T

2
@Jason S "Bản phác thảo" Arduino "/ chương trình xuất hiện rất giống với Java"
Toby Jaffey

4

Tôi muốn làm rõ rằng tôi chưa từng sử dụng một cái nào trước đây, nhưng đã từng có một năm trước được gọi là Javelin. Có thể Parallax đã mua được chúng hoặc một cái gì đó, bởi vì bây giờ thứ duy nhất xuất hiện là "Tem Javelin". Cách đây nhiều năm, cũng từng có một công ty tên là Velocity S bán dẫn, đã tạo ra một sự thay thế (được cho là) ​​thay thế cho các mô-đun lõi của Rabbit S bán dẫn, và nó có một JVM trong phần cứng, nhưng công ty đó dường như đã biến mất. Chúc bạn may mắn trong việc tìm kiếm!


4

Sun microsystems được sử dụng để tạo ra một nền tảng được gọi là Sun Spot, một nền tảng java nhúng về cơ bản. Bây giờ rõ ràng Sun microsystems không còn ở đây nữa (Oracle đã mua chúng), nhưng có vẻ như bạn vẫn có thể mua Sun Spots - http://www.sunspotworld.com/products/ . Tôi không có ý tưởng lớn về việc sử dụng Java trong môi trường nhúng (mức độ trừu tượng sai cho công việc imho) nhưng đây dường như là nền tảng nhúng tự nhiên nhất cho Java. Lưu ý thông số kỹ thuật về những điều này - chúng là RAM 180 MHz / 512k nặng, và chúng không rẻ ở mức 400 đô la cho một bộ khởi động.

Vì vậy, tôi sẽ là người thứ hai hoặc thứ ba trong số những người trả lời ủng hộ Arduino cho câu hỏi này. Có một địa ngục của một cộng đồng ngoài kia để hỗ trợ bạn nếu bạn cần giúp đỡ. Và nếu bạn cần phần cứng ngoại vi, hãy tìm kiếm "Arduino Shields" trên google và ngạc nhiên - bạn có thể làm bất cứ điều gì từ điều khiển động cơ servo để nhảy lên mạng không dây 802.11 với sự kết hợp đúng của các lá chắn. Không thực tế khi học C (con trỏ nói gì!?) Mà không có thời gian thực hành, nhưng bạn có thể bắt đầu viết bản phác thảo Arduino ngay lập tức ... Bạn cũng có thể có được nền tảng Arduino "thực" khoảng $ 30 và nhân bản (ví dụ RBBB hoặc DorkBoard) với giá dưới 15 đô la.


à vâng, tôi đã thấy điều đó tại Maker Faire hai năm trước! Thiết bị khá tuyệt.
Dave

Tính năng sát thủ cho SunSpots không phải là Java, mà là thứ không dây tích hợp cho phép chúng giao tiếp với nhau. Nếu bạn muốn nhận thức về nhau hoặc giao tiếp không dây dễ dàng với cơ sở gia đình, điều đó rất, rất hay.
Thorbjørn Ravn Andersen

3

Parallax tạo ra Javelin Stamp , CoM (Computer-on-Module) chạy JVM.

Đó là 60 đô la và thực hiện một hướng dẫn rực rỡ ~ 8.500 Java / giây.

Ngoài ra, PCB có màu hồng (Thật vậy!)


2

Các hệ thống Ajile tạo ra một loạt các chip java và bảng eval thời gian thực được nhúng.

Họ chạy java kim loại trần. Nó rất dễ chịu.

www.ajile.com làm cho các chip và bảng eval.

www.systronix.com bán nhiều loại phần cứng java nhúng.

Tôi đã sử dụng AJ-100 từ ajile cho công việc đòi hỏi, chúng rất tuyệt khi làm việc. Và không, chúng không rẻ như avr nhưng chúng xử lý dữ liệu như một pentium cấp thấp.

Chip của Ajiles phản ứng với các ngắt (độ trễ ngắt) trong dưới 1 micro giây.


'không bao giờ làm điều đó trên một hệ thống C nhúng' ??? Làm gì? Độ trễ 1 uS? Tốc độ cao? Khó khăn. Tôi nghĩ rằng bạn đang quên 1GHz + DSP, rất nhiều ARM và khá nhiều thứ khác. Rất nhiều người viết cho những điều này chỉ bằng kim loại trần C (không có hệ điều hành, v.v.). Tôi sẽ cấp cho bạn rằng loại điều này là một cách hợp lý để sử dụng Java trong nhúng (bên ngoài một hệ điều hành quy mô Linux đầy đủ) ... mặc dù sau khi xem nhanh Systronix, tôi nói rằng có vẻ như bạn đang trả tiền phí bảo hiểm tốt cho sự thuận tiện nhỏ. Tôi chắc chắn sẽ nhúng ARM. Ngoài ra, rất nhiều liên kết đến các dự án ngoài Systronix đã chết.
darron

Ồ, và TINI thật ngu ngốc. JVM trong ROM trên 8051. Tôi đã ngu ngốc thử một cách trở lại khi tôi muốn Ethernet dễ dàng, và ngay cả trong C, mọi thứ chỉ bị ngập trong lưu lượng phát sóng của mạng LAN công ty bình thường. Nó sẽ là một sản phẩm tốt nếu họ tiếp thị nó như Tem cơ bản của Parallax, nhưng họ thì không. Nó không phù hợp cho bất kỳ mục đích phi sở thích.
darron

1
Những con chip này đang chạy ở tốc độ vài trăm megahertz. Độ trễ 1uS là có thể khi được lập trình bằng C trên bộ xử lý chạy chậm hơn 100 lần so với các thiết bị này. Bạn có thể thực hiện một số điều khá thú vị (như iPad và điện thoại Droid) với bộ xử lý tương đương, nhưng việc đăng bài này như một giải pháp thay thế cho 8-bit AVR trong câu hỏi hầu như không phải là một so sánh táo bạo.
Kevin Vermeer

@reemrevnivek: Với OP muốn Java, tôi coi phần Ajile là phù hợp ở chỗ đó là một trong những cách hợp lý duy nhất để chạy Java nhúng (bên ngoài HĐH Linux đầy đủ hoặc một cái gì đó). Nếu đoạn cuối và bit TSTIK không có thì tôi thậm chí còn nâng cấp nó.
darron

2

Kinh nghiệm cá nhân của tôi là mã C để lập trình và bắt đầu với AVR khá dễ dàng, tôi cũng đến từ nhiều năm làm java và sau khoảng 2 tháng sử dụng bản phác thảo arduino, tôi đã bỏ môi trường và tìm kiếm các trang web avr-gcc như avrfreaks giúp dễ dàng tìm câu trả lời cho các vấn đề phổ biến. (Tôi vẫn làm tất cả trên Arduino Duemillenove đáng tin cậy của tôi)

Sử dụng nhật thực để biên dịch và "triển khai" tức là ghi vào chip, cũng tốt vì tôi không phải đối phó với một IDE khác

Tôi nghĩ rằng thực sự khó khăn hơn để có được đầu của bạn xung quanh các thanh ghi, các thanh ghi 16 bit và đọc chúng theo thứ tự thích hợp, ngắt, bộ hẹn giờ, PWM phần cứng, so với chính ngôn ngữ lập trình.


1

Mặc dù tôi thường là người "học C và hiểu những gì bộ xử lý thực sự làm", nơi công việc nhúng có liên quan, nhưng đáng để chỉ ra rằng một con chip nhỏ không đắt hơn nhiều so với một chiếc AVR và gần như hợp lý vị trí để xử lý các nhiệm vụ đơn giản trên đầu trang của jvm.


1

NanoVM là một Máy ảo Java được thiết kế để chạy trên các bộ vi điều khiển AVR 8 bit.

(từ trang chủ)

Nó không phải là một máy ảo Java đầy đủ tính năng và nó sẽ không bao giờ. Nó sẽ luôn bị giới hạn trong một tập hợp con nhỏ của ngôn ngữ java và các thư viện java tiêu chuẩn và một vài phương thức cụ thể của ứng dụng. Hơn nữa, nó không có nghĩa là để thay thế C là cách tiêu chuẩn của lập trình vi điều khiển. Nó kém linh hoạt và có hiệu suất thấp hơn các chương trình C hoặc chương trình biên dịch chương trình.

NanoVM là một cách để cung cấp giao diện lập trình hạn chế nhưng có thể kiểm soát được cho một thiết bị dựa trên vi điều khiển. Với hầu hết các mã cụ thể phần cứng nhất là một phần của chính NanoVM, người dùng có thể tập trung vào chính ứng dụng. Nếu người dùng được cung cấp một thiết bị được trang bị NanoVM, anh ta không bắt buộc phải suy nghĩ về chính phần cứng. Hơn nữa, anh ta không cần bất kỳ trình biên dịch cụ thể đích nào hoặc tương tự. Tất cả những gì anh ta cần là một trình biên dịch java tiêu chuẩn và NanoVMTool, bản thân nó được viết bằng java. Do đó, toàn bộ chuỗi phát triển hoạt động trên mọi thiết bị có trình biên dịch java và có thể chạy mã java. Với sự trừu tượng hóa phần cứng mà NanoVM cung cấp, người dùng thậm chí không cần phải quan tâm đến loại vi điều khiển mà mục tiêu dựa trên.


1

Nó không hoàn toàn bằng Java - hoặc 8 bit, nhưng có một trình thông dịch Javascript dành cho Bộ vi điều khiển ARM công suất thấp được gọi là Espruino .

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.