如何在AVR编译器中使用C ++ STD?

时间:2014-03-30 20:33:27

标签: c++ eclipse avr avr-gcc avrdude

我已经设置了AVR编译器,可以使用this guide与Atmel微控制器一起使用。

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

2 个答案:

答案 0 :(得分:2)

不要这样做。

在avr上使用动态内存分配是不可取的,因为它没有MMU,只有非常有限的RAM和动态内存分配需要一些开销来进行簿记。 还存在记忆碎片化的危险。

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

答案 1 :(得分:1)

快速回答是它们不可用,你需要编写自己的包装类来获得这种功能。

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

如果您希望获得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];
};

您可能希望扩展此功能以满足您的需求,但希望这可以为您提供一个想法。