【问题标题】:How to use C++ STD with AVR compiler?如何将 C++ STD 与 AVR 编译器一起使用?
【发布时间】:2014-03-30 20:33:26
【问题描述】:

我已经设置了 AVR 编译器,以便使用 this guide 与 Atmel 微控制器配合使用。

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

【问题讨论】:

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


    【解决方案1】:

    不要这样做。

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

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

    【讨论】:

    • 好的,Arduino IDE 包含这个的原因是它应该很容易使用吗?毕竟,Arduino 旨在为更广泛的受众开放微控制器编程。
    • 我对 C++ 完全陌生并学习它,因为我想制作一个八轴飞行器作为一个爱好项目。你真的可以没有性病吗?我的意思是,如果没有微控制器上的 STD,你能做所有事情吗?
    • @FriendofKim 对于 AVR,您会发现最多的东西是 C,这是有原因的。我认为使用 c++ 在代码质量方面具有许多优势,但是您必须知道可以免费使用 c++ 的哪些功能以及哪些功能会带来额外的内存和运行时开销。为什么四轴飞行器软件需要 std::strings?
    • 嗯,你知道我应该读什么好书吗?几乎每个 Arduino 库都是用 C++ 编写的,但他们可能知道可以免费使用什么......
    • 我之所以首先询问性病,是为了做一些测试。例如,我想测试一个 LCD 屏幕。然后我想通过串行编写命令,比如“#clear#”来清除屏幕。这就是我想要字符串的原因。
    【解决方案2】:

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

    如果您想将 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];
    };
    

    您可能希望对此进行扩展以做您需要的事情,但希望这能给您一个想法。

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 1970-01-01
      • 2017-03-23
      • 2012-03-15
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多