如何将C++ STD 与 AVR 编译器一起使用
How to use C++ STD with AVR compiler?
我已经使用本指南设置了 AVR 编译器,以便与 Atmel 微控制器一起使用。
我无法访问字符串、向量等。如何添加?
快速的答案是它们不可用,您需要编写自己的包装类才能获得此类功能。
如果要将 c++ 用于嵌入式平台,则无法访问所有标准库。但重要的是,您不希望使用所有的标准库,因为它对于某些嵌入式项目来说太重量级了。某些语言功能(如异常处理)在您选择的平台上可能无法实现,或者考虑到可用的资源,这些功能可能过于昂贵。缺少某些语言功能使得无法实现某些标准容器,例如,可能引发异常的容器可能无法在某些平台上以符合标准的方式实现。此外,还有一些 c++ 构造可能可用,但在嵌入式平台上使用将是一个坏主意。通过new
和delete
动态分配内存很可能会使您遇到大量问题,因为您没有大量内存,并且很难处理内存碎片等问题。(如果您出于某种原因需要动态内存,您可能希望查看新的放置以及其他一些内存分配方案,以避免其中一些问题)
如果你想获得std::array
和std::string
等容器的好处,你需要编写自己的内存管理类。使用 std
容器的主要好处之一是它们极大地简化了内存管理(与使用原始 C 样式数组相比)。如果您正在做一个大型嵌入式 c++ 项目,则可以使用 RAII 和其他基本 c++ 语言结构编写自己的内存管理包装器。在大多数情况下,在创建这些类时,您需要避免动态内存分配和异常处理。
我发现具有良好投资回报率的一件事是制作一些结构/类,这些结构/类将数组与数组的长度一起包装。通过保持大小连接,您可以使代码更加清晰。我经常发现自己在写这样的东西:
template<typename T, uint8_t MAX_SIZE>
class array_helper{
public:
typedef T value_type;
array_wrapper():
m_data()
{}
T& operator[](unsigned int idx){
return m_data[idx];
}
T* data(){
return this->m_data;
}
const uint8_t s_max_size = MAX_SIZE;
private:
T m_data[MAX_SIZE];
};
您可能希望对此进行扩展以完成所需的操作,但希望这能为您提供一个想法。
这样做。
不建议在 AVR 上使用动态内存分配,因为它没有 MMU,只有非常有限的 RAM,动态内存分配需要一些记账开销。还存在内存碎片的危险。
在如此微小的处理器上,您应该只使用静态和自动固定大小的内存缓冲区。这确保了确定性的运行时行为。
- 编译器如何将链表中的地址字符串在一起?
- _mm512_exp_pd与 GNU 编译器一起使用
- 尝试将Winelib与标准macOS构建工具一起使用:得到奇怪的编译器错误
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 将shared_ptr与指向指针的指针一起使用时出现编译器错误
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 如何将QT5和QT Creator 2.6.1与VS 2012中的编译器一起使用
- 将运算符 ^ 与“double”操作数一起使用会发出编译器错误
- 我应该将哪个 Boost 版本与支持 C++03 的编译器一起使用
- visual studio 2012为C++使用了什么编译器?它兼容吗?我可以将它与代码块一起使用吗
- gcc 4.7.3与构造函数一起使用make_shared时出现内部编译器错误
- 为什么当 typedef const 指针与额外的 const 一起使用时,编译器不会给出错误?
- 无法使资源编译器与 Code::Blocks 一起使用
- 完全支持C++11的Windows C++编译器(应与Qt一起使用)
- 将CMake与同一语言的多个编译器一起使用
- 名称篡改如何与使用不同编译器编译的DLL和LIB一起工作
- 移动lblas库并将其与g++编译器一起使用
- 有人能让NVCC和英特尔编译器一起工作吗?
- 将使用C++98标准编写的代码与新的编译器一起编译
- 如何将C++ STD 与 AVR 编译器一起使用