编程Arduino与标准C有何不同?

28

我具有编程嵌入式系统的背景(TI MSP430,Atmel ATxmega)。编写Arduino与这些系统有何不同?我能够将哪些C语言知识用于编写Arduino程序?


已将 C++ 标签移除,因为它实际上是纯 C。 - Xeo
3
抱歉,我感到困惑是因为在这个例子中http://www.arduino.cc/en/Hacking/LibraryTutorial,他们确实使用了C++。 - Nathan
1
我不明白为什么移除了C++标签。Arduino库通常是C++类。(哎呀!这是两年前的评论 :-P) - Marcello Romani
仍然是C++,现在已经快3岁了... 呃。 :-P - Able Mac
5个回答

36

虽然我不了解ATXMega,但像新版Arduino上使用的ATmega328这样的8位AVR芯片使用AVR-GCC编译器。这允许将C甚至C++编译到AVR芯片上。在AVR-GCC之上的一级是AVR Libc,它是一个C库,使得为AVR编程成为更高级别的任务(不再需要直接引用寄存器等操作)。

Arduino IDE 在后端使用AVR-GCC和AVR libc库。此外,Arduino IDE 还提供其他可用的库,例如漂亮的串行接口。

最后,Arduino带有烧录在AVR芯片上的引导程序。引导程序仅仅使得通过串行连接(从USB)而不是使用内部系统编程器或开发板来编程AVR成为可能。

足够的背景知识,回答你的问题:Arduino可以使用C甚至C ++进行编程。可用的库是用C编写的,并且所有内容都将使用AVR-GCC进行编译。甚至不需要Arduino IDE。

编辑

似乎对这个话题有相当多的兴趣。我写了一篇博客文章,尝试给出有关AVR、Arduino和AVR-GCC的更详细信息


1
可用的库是用C编写的,主要是用C++编写的。 - Pointer Null
Eclipse项目的代码库已被删除。 - oldmud0
@oldmud0 谢谢,我可能在某个时候删除了GitHub仓库。我已经从答案中删除了对Eclipse项目的引用。 - baalexander

9
您可以在使用Arduino时运用您已有的C语言知识。
Arduino的目的是为艺术家/非程序员提供便利,让他们轻松开始进行硬件编程和调试,因此“Arduino语言”只是一个简化开发的包装器。
作为一名C程序员,您应该会更容易使用Arduino。文档并不冗长,维基也很好,论坛上的人们热情而乐于助人。

4
你可以将你在C语言和嵌入式系统方面的知识应用到Arduino上,这并不难。请收藏Arduino参考页,你很快就能开始编写程序了。

4

Arduino类似于C语言,非常易学。他们已经将读写外围寄存器等基本任务抽象化了。

只要看一下一些示例代码和Arduino参考资料,如果你之前在其他平台上真正使用过C语言,那么很快就能上手。


4

Arduino是一种基于C语言的开发平台,不同之处在于每个程序中都会插入以下内容:

void main() {
  setup();
  for(;;) {
    loop();
  }
}

5
Arduino不仅仅是C语言,它是C++的(一个子集)。参考文献:http://en.wikipedia.org/wiki/Processing_%28programming_language%29#Wiring.2C_Arduino.2C_and_Fritzing。 - Peter Mortensen
2
在使用Arduino IDE时,还有一些其他的异常情况。例如,在函数调用或返回中使用结构时会出现问题,除非您在单独的.h文件中定义该结构。正如http://playground.arduino.cc/Code/Struct中所说:通常的Arduino解决方法/黑客是将所有需要自定义数据结构的函数放置在另一个.h文件中。只需在IDE中创建一个新选项卡并命名为name.h,然后#include "name.h"即可。 - ViennaMike
1
奇怪。尽管这可能是一个愚蠢的例子,但是在Arduino IDE v1.0.5下可以编译此代码:http://pastebin.com/aF3QLVce。我正在下载1.5.6-r2来尝试一下...出于好奇,你能把你尝试过的代码放到pastebin上吗?(顺便说一句,我使用的是Ubuntu 12.04 x64) - Marcello Romani
1
也可以在1.5.6-r2下编译。 - Marcello Romani
1
如果我没记错的话,Arduino IDE会干扰.ino源文件的前几行。这有时会导致有效的C++结构变得语法错误。解决此问题的一种方法是将导致问题的行放在单独的.h文件中,然后在草图中包含它(用双引号)。我已经尝试过你的例子,它可以工作。(还要看看上面ViennaMike的评论。) - Marcello Romani
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接