0

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

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

4

2 回答 2

1

不要这样做。

不推荐在 avr 上使用动态内存分配,因为它没有 MMU,而且只有非常有限的 RAM 和动态内存分配需要一些记账开销。还有内存碎片的危险。

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

于 2014-03-31T15:54:03.990 回答
1

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

如果您想将 c++ 用于嵌入式平台,您将无法访问所有标准库。但重要的是,您不需要所有标准库,因为它对于某些嵌入式项目来说太重了。某些语言功能(如异常处理)可能无法在您选择的平台上使用,或者考虑到您可用的资源,这些功能可能过于昂贵。某些语言特性的缺失导致无法实现某些标准容器,例如可能抛出异常的容器可能无法在某些平台上以符合标准的方式实现。此外,还有一些 c++ 结构可能可用,但在嵌入式平台上使用是个坏主意。new通过和动态分配内存delete很可能会让您遇到大量问题,因为您没有大量内存,并且内存碎片等问题很难处理。(如果您出于某种原因需要动态内存,您可能需要考虑放置 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];
};

你会想扩展它来做你需要的,但希望这能给你一个想法。

于 2014-10-22T19:11:36.947 回答