如何使用c++ 11对Arduino进行编程?
How can I use a C++11 to program the Arduino?
如何在编程Arduino时使用c++ 11 ?
我可以使用Arduino IDE或其他环境。我最感兴趣的是核心语言的改进,而不是需要改变标准库的东西。
从 1.6.6版本开始,Arduino IDE默认启用c++ 11。
旧版本,请继续阅读:
可以很容易地更改工具链中任何元素的标志,包括汇编器、编译器、链接器或存档器。
在Arduino IDE 1.5.7版本(2014年7月发布)上测试,
- 找到platform.txt文件,
- AVR架构=>{安装路径} arduino avr硬件 platform.txt
- SAM架构=>{安装路径}硬件 arduino 山姆 platform.txt
- 在该文件中,您可以更改任何标志,例如
- compiler.c。flags用于更改c++文件的默认编译标志。
- compiler.cpp。flags用于更改c++文件的默认编译标志。
- 您还可以更改任何"食谱"。或编译模式,在配置文件的相应部分,标题为"AVR/SAM编译模式"。
- 修改后,必须重启Arduino IDE,至少在1.5.7版本。
要启用对c++ 11 (c++ 0x)的支持,在Arduino IDE版本1.5.7和1.5.8上测试,您只需添加标志"-std=gnu++11"在以compiler.cpp.flags=".
开头的行末尾
预计在不久的将来在Arduino IDE上默认启用c++ 11 。然而,在1.5.8版本(2014年10月),情况仍然不是这样。
Arduino IDE 1.6.6及更新版本默认启用c++ 11(它们在platform.txt文件中设置了编译器标志"-std=gnu++11")。
首先,只有GCC 4.7及以上版本(因此只有AVR-GCC 4.7及以上版本)支持c++ 11。因此,检查安装的版本:
gcc --version
avr-gcc --version
如果AVR-GCC是4.7或更高版本,那么你可以使用c++ 11。
Arduino IDE不支持自定义编译器标志。这已被请求,但尚未实现。
因此,您只能使用其他环境,或者直接从命令行编译您的程序。
在使用AVR-GCC直接从命令行编译的情况下,您只需要添加一个额外的编译器标志来启用c++ 11支持。
-std=c++11
对于特定的开发环境,大多数将支持从IDE中的构建选项编辑编译器标志。上面提到的标志需要添加到每个环境的标志列表中。
c++ 0x是c++ 11标准工作草案的名称。c++ 0x支持从GCC 4.3开始。但是,这是严格的实验性支持,因此您不能可靠地期望提供c++ 11特性。以下是相应版本的GCC提供的完整功能列表。AVR-GCC中的可用特性将与相应GCC版本中的可用特性相同。
c++ 0x的编译器标志是:
-std=c++0x
请注意,没有简单的方法可以从Arduino IDE或使用其他IDE (Eclipse, Code::Blocks等)或命令行指定额外的标志。
作为一个hack,你可以使用一个小代理程序(应该是跨平台的):
//============================================================================
// Name : gcc-proxy.cpp
// Copyright : Use as you want
// Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
//============================================================================
#include <unistd.h>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
vector<string> arguments;
vector<const char*> aptrs;
// Additional options, one per line
ifstream cfg((string(argv[0]) + ".ini").c_str());
if (cfg.bad())
cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;
string arg;
while (cfg) {
getline(cfg, arg);
if(arg == "r" || arg == "n")
continue;
arguments.push_back(arg);
}
for (const string& arg : arguments)
aptrs.push_back(arg.c_str());
for (int i = 1; i < argc; ++i)
aptrs.push_back(argv[i]);
// Add null pointer at the end, execvp expects NULL as last element
aptrs.push_back(nullptr);
// Pass the vector's internal array to execvp
const char **command = &aptrs[0];
return execvp(command[0], command);
}
- 将原来的avr-g++.exe重命名为avr-g++. origin .exe(或任何其他名称)。
- 创建avr-g++.ini文件,其中第一行是原始程序的完整路径(例如D:Arduinohardwaretoolsavrbinavr-g++. origin .exe),并根据需要添加额外的参数,每行一个。
你完成!
<例子em> avr-g + + . ini :
D:Arduinohardwaretoolsavrbinavr-g++.orig.exe
-std=c++0x
我使用Ino,这是有效的:
ino build -cppflags="-std=c++0x"
这生成了一个十六进制文件的大小至少为15k(这是在优化打开的情况下),而标准构建的大小约为5k,这是可怜的小ATmega328的考虑因素。对于具有更多程序空间的微控制器之一,这可能是可以的。
如果您需要更多的控制和更好的IDE,我建议使用Sloeber Plugin for Eclipse或Sloeber IDE本身。
使用这个IDE创建更复杂的代码要容易得多。它还允许向编译器(C, c++和链接器)添加标志。因此,要自定义编译,只需右键单击project并选择Properties。在Properties窗口中,选择Arduino→Compiler Option。这样,您就可以在构建中添加选项。
- Arduino 模块化编程与全局和设置
- 使用 Arduino 对 ATtiny10 进行编程 ( "ld.exe" 错误)
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- 如何使用 3 个按钮对 Arduino 菜单进行编程?
- Arduino 阵列编程
- 在arduino上编程atmega328p的UART
- 在没有IDE(Linux)的情况下编程Arduino DUE
- 使用Arduino IDE编程是否适合商业产品
- 用Arduino编程一个简单的按钮LED电路
- 如何使用Arduino开始与完成的硬件进行编程/通信
- 使用 Arduino 进行 LCD 编程
- 什么编程语言最适合通过Arduino上的传感器控制屏幕上的动画?Java语言C++
- Arduino编程错误
- 如何使用c++ 11对Arduino进行编程?
- 在Arduino中编程时避免使用指针和#define
- 编译和上传到Arduino编程
- Arduino编程中的结构体数组
- 编程 Arduino 与标准 C 有何不同
- 用Visual c++编程arduino串口