【问题标题】:Is there a way or tutorial for converting Arduino code to C code?有没有将 Arduino 代码转换为 C 代码的方法或教程?
【发布时间】:2012-04-24 23:40:13
【问题描述】:

我知道这个问题很笼统,但是我找不到转换 Arduino 代码的教程或好的编码方法(我的意思是我们在 Arduino 软件上编写的代码,这对 Arduino Uno 无关紧要或Mega 或...),即使是小样本。

有教程吗?

我只是想学习技术,我知道这取决于项目。

【问题讨论】:

    标签: c embedded arduino


    【解决方案1】:

    Arduino 代码是,或多或少,C 代码。

    Arduino 的独特之处在于代码是经过预处理的(例如,它们通过建立 setup 和 loop 函数提供简单的钩子)并有一个托管的构建/上传过程来处理电路板限制、包含、库等...

    当然可以自己使用相同的工具包来构建和运行代码,我就是这样做的。 Arduino and GCC, compiling and uploading programs using only makefiles 是我发现的最有用的链接,涵盖了您开始所需的步骤。

    正如我所说,我已经离开了 Arduino IDE 并自己选择了avr-gcc 路线,因为如果您了解 GNU 工具,您可以做更强大的事情——比如使用 C++ 标准库。我错过了我的vectors,我能说什么。 avr-libc 在完整的 C++ 功能方面相当落后,因此很难塞进 STL 和 Andy Brown has gotten much of it working。

    把这些东西放在一起,你就有了一个相当强大的开发环境。

    【讨论】:

    • 非常感谢您的精彩回答,请问您最喜欢编写此代码的编辑器是什么?哪个更好在eclipse中安装avr并从eclips运行它或使用一些文本编辑器并从终端运行它?
    • @justin 我喜欢你的问题,这对我很有帮助,因为我是这个领域的初学者。
    • 我使用 vim 开发并从终端运行 makefile,但现在我们进入了一些“宗教”领域。我认为 eclipse 是一个很棒的工具,但配置它(恕我直言)就像在终端中一样复杂,因为您使用的是 GUI 来运行终端命令。如果您在终端中执行此操作,则它更接近“标准”环境,即构建工具的环境。不过,这真的是关于舒适:我在航站楼里很舒服,所以在那里工作对我来说感觉更“一致”。
    • 一个建议:永远不要在业余爱好者世界之外的 8 位 MCU 上使用 C++ 向量或 STL。永远不要在求职面试中提及他们。除了伴随它们而来的 RAM 和闪存的明显冲击之外,动态存储器在嵌入式世界中也受到了反对。如果您想成为一名专业的嵌入式开发人员,那么不要在 C++ 上浪费时间。有些地方可以使用完整的 C++ 语言,但 8 位 MCU 不是其中之一。你必须去掉大部分使 C++ 与 C 不同的东西才能使它有用。而是专注于 C、汇编、电子、RTOS 等。
    • Arduino 将代码编译为 C++,它提供的用于简化编码的库基于 (C++) 类。将这些库移植到 C 将是一项艰巨的任务。
    【解决方案2】:

    (编辑:我在写自己的答案时错过了马特答案中非常有用的链接。所以我们假设下面是该链接的非技术摘要)。

    马特回答正确。我想添加更多信息。

    了解Arduino编程的关键在目录Arduino-1.0\hardware\arduino\cores\arduino

    您会发现main.cpp 文件包含:

    #include <Arduino.h>
    
    int main(void)
    {
        init();
    
        #if defined(USBCON)
            USB.attach();
        #endif
    
        setup();
    
        for (;;) {
            loop();
            if (serialEventRun) serialEventRun();
        }
    
        return 0;
    }
    

    “setup()”和“loop()”(如果您阅读 Arduino 文档,甚至是“serialEventRun()”)是否会响铃?:-)

    Arduino 只隐藏了这一点。

    Arduino 使用 C++ 语言。当然,如果你自己用avr-gcc编译你的代码,你可以使用C,但是Arduino IDE的配置方式,是纯C++。

    但是,由于微控制器并未真正适应面向对象的开发,因此缺少一些功能。我想到了“新”和“删除”运算符。它们不存在,因此开箱即用,在使用 Arduino 开发时应避免使用堆。这就是为什么如果你想使用一些标准的 C++ 库你应该小心。它们可能不适用于微控制器编程(内存操作过多)。

    在Arduino-1.0\hardware\arduino\cores\arduino目录下,还可以看到Arduino库的实现。它允许查看存在哪些“低级”微控制器功能(来自 avr-libc)以及如何实现自己的库和工具。

    顺便说一句,正如您想知道如何在 C 中移植 Arduino 代码,avr-libc 是一个 C 库而不是 C++ 库。因此,您可以看到 Arduino 如何将其 C++ 代码包装在 C 代码上。

    在File/Preferences 菜单中,您可以检查“查看详细输出”以查看哪些参数和文件用于构建最终的 Arduino 二进制文件(以及临时构建目录在哪里)。

    最后,您还必须知道 Arduino 板有一个嵌入您的代码的引导加载程序。它简化了从 Arduino IDE 到 Arduino 板的部署。所以 Arduino 板实际上包含的代码比你自己的要多。

    【讨论】:

    • 面向对象编程与动态内存分配无关。它甚至与选择的编程语言没有任何关系。有些语言只支持面向对象的特性。我一直在用 C 语言为微控制器编写面向对象的程序,没有动态内存。
    • 这就是我写避免使用堆的原因,这与做 OOP 并不矛盾。此外,Arduino 库是在很少或没有动态内存分配的情况下进行面向对象编程的一个明显示例。
    • 是的,您可以编写不执行动态内存分配的面向对象代码,但倾向于使用动态内存的特性是面向对象语言中的关键概念。虽然经验丰富的程序员不会因为避免使用使 C++、Java 和其他 OO 语言有用的所有特性而阻碍他们的技能,但对于刚开始接触嵌入式世界的人来说,坚持使用普通 C 可能会更好选择。
    【解决方案3】:

    这不是一个转换教程,而是一篇关于 arduino 的 hello world 背后的精彩文章:
    A tour of the Arduino internals. How does hello world actually work?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2010-10-17
      • 2022-08-12
      • 1970-01-01
      • 2012-04-25
      相关资源
      最近更新 更多