是否有将Arduino代码转换为C代码的方法或教程?

8 c embedded arduino

我知道这个问题是通用的,但是我找不到一个教程或一个很好的编码方式来转换Arduino代码(我的意思是我们在Arduino软件上编写的代码,它对Arduino UnoMega或者无关紧要. ..)即使是小样本.

有教程吗?

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

Mat*_*att 13

Arduino的代码,更多或更少的,C代码.

Arduino发生的独特之处在于代码是经过预处理的(例如,它们通过建立setuploop函数提供简单的钩子),并且具有托管构建/上载过程,负责处理板限制,包括,库等...

当然可以自己使用相同的工具包来构建和运行代码,这就是我的工作方式.Arduino和GCC,仅使用makefile编译和上传程序是我发现的最有用的链接,涵盖了入门所需的步骤.

正如我所说,我已经离开了Arduino IDE并avr-gcc自己开始了这条路线,因为如果你了解GNU工具,你可以做更强大的事情 - 比如使用C++标准库.我错过了我vector的,我能说什么.avr-libc在完整的C++功能方面落后了很多,这使得很难在STL中加入,但是Andy Brown已经有很多工作了.

将这些东西放在一起,你就拥有了相当强大的开发环境.

  • 建议:永远不要在业余爱好者世界之外的8位MCU上使用C++向量或STL.在求职面试中永远不要提及他们.除了随之而来的RAM和闪存的明显冲击之外,动态内存在嵌入式世界中也是不受欢迎的.如果您希望成为一名专业的嵌入式开发人员,那么_don't_会浪费时间在C++上.有些地方可以使用完整的C++语言,但8位MCU不是其中之一.你必须去除大部分使C++与C不同的东西,使它变得有用.专注于C,汇编程序,电子产品,RTOS等. (4认同)
  • 非常感谢您的好答案,我可以问您最喜欢的编辑器代码是什么?哪一个是在eclipse中安装avr并从eclips或使用一些文本编辑器运行它并从终端运行它? (2认同)
  • @justin我喜欢你的问题,这对我很有帮助,因为我是这个领域的初学者. (2认同)
  • Arduino 将代码编译为 C++,它提供的用于简化编码的库基于 (C++) 类。将这些库移植到 C 将是一项艰巨的任务。 (2认同)

Vin*_*ren 7

(编辑:在编写我自己的答案时,我错过了Matt答案中非常有用的链接.所以,让我们说下面的内容是链接的非技术性摘要).

马特回答说得对.我想补充一些其他信息.

了解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;
}
Run Code Online (Sandbox Code Playgroud)

做"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语言为微控制器编写面向对象的程序,一直没有动态内存. (2认同)