如何将C++ STD 与 AVR 编译器一起使用

How to use C++ STD with AVR compiler?

本文关键字:编译器 一起 AVR C++ STD      更新时间:2023-10-16

我已经使用本指南设置了 AVR 编译器,以便与 Atmel 微控制器一起使用。

我无法访问字符串、向量等。如何添加?

快速的答案是它们不可用,您需要编写自己的包装类才能获得此类功能。

如果要将 c++ 用于嵌入式平台,则无法访问所有标准库。但重要的是,您不希望使用所有的标准库,因为它对于某些嵌入式项目来说太重量级了。某些语言功能(如异常处理)在您选择的平台上可能无法实现,或者考虑到可用的资源,这些功能可能过于昂贵。缺少某些语言功能使得无法实现某些标准容器,例如,可能引发异常的容器可能无法在某些平台上以符合标准的方式实现。此外,还有一些 c++ 构造可能可用,但在嵌入式平台上使用将是一个坏主意。通过newdelete动态分配内存很可能会使您遇到大量问题,因为您没有大量内存,并且很难处理内存碎片等问题。(如果您出于某种原因需要动态内存,您可能希望查看新的放置以及其他一些内存分配方案,以避免其中一些问题)

如果你想获得std::arraystd::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,动态内存分配需要一些记账开销。还存在内存碎片的危险。

在如此微小的处理器上,您应该只使用静态和自动固定大小的内存缓冲区。这确保了确定性的运行时行为。