【问题标题】:How do you embed Java into a microcontroller?如何将 Java 嵌入到微控制器中?
【发布时间】:2013-06-29 06:08:50
【问题描述】:

我有一个微控制器,当发生事件时,我希望它发送电子邮件。我知道如何在 Java 中使用电子邮件,但是如何将 Java 代码放在微控制器的 C 代码中呢?

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRB |= 1 << PINB0; // = 0b00000001
DDRB &= ~(1 << PINB1);
PORTB |= 1 << PINB1;
DDRB |= 1 << PINB2;

while(1)
{
    PORTB ^= 1 << PINB0;
    if(bit_is_clear(PINB, 1)){
        PORTB &= ~(1 << PINB2);
        _delay_ms(100); //SLOW
    }           
    else{
        _delay_ms(10); //FAST
        /////I want the Java code in here/////

        PORTB ^= 1 << PINB2;
    }
}
}   

编辑

我使用的是 Atmel Atmega8A 微控制器。我正在制作一个简单的警报系统,如果引脚 B1 的电线断开,我想收到电子邮件或文本通知。

而且我只是一个高中生,所以请不要太过分......

哦,如果有人可以为我淡化 C 中的多线程,那就太好了。我来自 Java 背景,因为这是他们在高中教的内容。

【问题讨论】:

  • 你的微控制器是什么?
  • 只是为了获得更多信息,如果您希望能够在 Linux 上运行完整且不受特定硬件的束缚,请查看 Gumstix

标签: java c embed microcontroller


【解决方案1】:

好吧,您的“问题”是将 Java 嵌入到您的 AVR 中……但您真正想要的是发送电子邮件。有一些实现可以运行 Java 字节码(或者至少我是这么认为的),但我相信没有一个能够发送电子邮件。

您需要了解 AVR 的功能非常有限。要发送电子邮件,您的设置将需要使用 TCP/IP 连接到 Internet。如此复杂的事情,ATmega8A 本身无法完成。 也许可以找到可以通过 UART 进行通信以发送电子邮件的硬件,或者您可以简单地将其连接到 PC 并运行应用程序来监听 COM 端口并发送电子邮件,或者...无论如何您需要额外的硬件

您可能想研究其他微控制器。我相信有一些支持网络,但它们可能会非常昂贵。或者,您可以只使用 Raspberry Pi。

【讨论】:

    【解决方案2】:

    Java 和 C 是 veryvery 不同的语言。

    您需要为您的微控制器找到支持 Java 的编译器。

    但是,如果您的控制器可以通过 GCC 编译 C,那么使用 GCJ 可能会在目标平台上使用某些内存限制。您需要生成正确架构的目标文件,并使用与微控制器兼容的 gcc 链接它。

    不值得花时间。我建议改为在 C 中实现它。

    此外,由于微控制器通常不提供超出硬件访问某些方面的任何内核例程,因此可能不会打开文件和套接字。 libc 也可能不存在或很少。

    您也可能没有网络硬件。如果您能告诉我们哪个微控制器,我们可以提供帮助。

    【讨论】:

      【解决方案3】:

      Alvin Wong 已经对这个问题给出了更直接的答案,但我觉得你的问题太模糊了,帮助你重新调整焦点可能会很好。

      当您从 Java 程序发送邮件时,您应该开始了解实际发生了什么,然后了解您的微控制器实际上可以完成其中的哪些部分,以及如何完成。

      那么,当您运行邮件发送 Java 程序时会发生什么?

      1. 您用 Java 语言编写程序,编译成 Java 字节码,由 Java 虚拟机解释,该虚拟机将调用 Java 运行时提供的某个库,
      2. 这将(可能间接)启动“网络通信”,这将利用操作系统网络设施,...
      3. 将使用网络硬件,
      4. 使用某种邮件协议与邮件服务器通信,并向其发送一些特定的字节序列,使其了解正在向某人发送邮件消息。

      (1) 部分由 Java 平台的所有层介导。 (请记住:Java 不仅仅是一种语言)。
      (2) 是 Java 平台下的一个(或几个)层,包括您的所有操作系统(Windows、Linux、Mac OS X 等)。
      (3) 是一个由您的硬件组成的层,其中包括其他子层,例如您的网卡中的固件,它仍然是可以管理诸如以太网/Wifi 协议的详细信息之类的更多软件。
      (4) 层是在某些通信通道(以太网、WiFi 等)中打开和关闭的位和字节。

      现在,您的微控制器可以完成哪一部分?
      微控制器位于 (3) 的下部。在你的情况下,Atmega 甚至没有任何网络硬件支持,所以......我不知道你打算如何连接到网络。反正就算你有,你也离(4)那么近,想上(1)还不如发疯。 (1) 是大象的说法,(4) 可以由蚂蚁来完成,而微控制器大约有瓢虫大小,参考 Atmel 的吉祥物 :P。

      所以:不要像大象一样思考。实际上,您必须努力实现目标,但如果您采取大象的方式,您可能会做大量不必要的工作 - 如果可以完成的话,我对此表示怀疑。

      (如果无论如何我不得不采取大象的方式,即在 AVR 中使用 Java,我将从查看 GCJ 或 LLVM 选项开始。我知道已经完成了一些工作来将极简 JVM 移植到 8 位微控制器上十年前,但不知道它是如何演变的)

      【讨论】:

        【解决方案4】:

        就像其他人所说的那样,以这种方式发送电子邮件真的离你的微机很远(我假设你主要想发送邮件,而不是在其中运行 Java VM)。要让邮件正常发送,您需要使用 TCP/IP 连接到 Internet,然后使用例如 SMTP 协议,您也许可以完成此操作。

        有问题的部分是连接到互联网。为此,您需要将设备连接到“合适的线路”上,通常是以太网,但也可能存在基于无线电的解决方案。然后,您必须实现在那条线上进行通信所需的一切(整个网络堆栈,直到 TCP/IP)。这不能合理地全部由您自己完成。一种方法是使用具有一些内置以太网连接功能的微型计算机,并根据您的喜好使用例如lwipContiki 来发挥作用。另一种方法是使用额外的硬件来为你做这件事,例如this Moxa product,但你可能无法通过它实现 SMTP。

        然后你将“只”需要实现一个合适的SMTP (Simple Mail Transfer Protocol) 层来正确发送你的邮件(我上面介绍的一个或另一个解决方案可能已经为你提供了这个)。

        【讨论】:

          【解决方案5】:

          您的微控制器需要支持 JDK 或 Java ME(可能是 Sun SPOT)。 http://www.inonit.com/cygwin/jni/invocationApi/c.html 有一个使用 JNI 启动 JVM 并调用您的类的示例。

          【讨论】:

            【解决方案6】:

            微控制器通常是在 C 环境中开发的,因为在微控制器中,硬件能力方面的资源是有限的。使用 C 是因为它允许最大的灵活性并允许微调,因为在微控制器环境中实时计算机是非常重要的。但这并不是说,微控制器世界中使用了 java。非常令人费解的是,android 在一些 java 上运行,这些 java 在最低端可能使用 ARM 处理器(由您决定是否真的想将其称为微控制器)。所以总而言之,是的,我建议你学习 C。如果你真的想走 java 的路,我个人还没有遇到很多资源可以让你在 AVR 微控制器上使用 java。这可能是可能的,但预计会影响性能。

            如果您没有微控制器方面的经验,我建议您研究 Arduino (arduino.cc)。

            祝你好运!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-24
              • 1970-01-01
              • 2020-02-18
              • 1970-01-01
              相关资源
              最近更新 更多