运营商对于新的Arduino(Operator new for Arduino)

2019-09-01 08:31发布

有人告诉我,(特别是在回答C ++标准库的Arduino的 ,并在堆栈溢出问题的C ++字符串,字符串的Arduino如何将它们结合起来? ))的Arduino的编译器不实施new运营商。 不过,我已经写了它使用它的Arduino(在Arduino的IDE)中的程序,它完美的作品。

void setup() {
    Serial.begin(9600);
}

void loop() {
    char* array;
    char c;
    unsigned arraySize;

    Serial.write("Enter a 1 digit number.\n");

    do {
        c = Serial.read();
    } while(c < '0' or c > '9');
    arraySize = c-'0';

    Serial.write("You wrote ");
    Serial.write(c);
    Serial.write(".\n");
    Serial.write("Now enter ");
    Serial.write(c);
    Serial.write(" lower-case letters.\n");

    array = new char[arraySize];

    for (unsigned i = 0; i < arraySize;) {
        array[i] = Serial.read();
        if (array[i] >= 'a' and array[i] <= 'z')
            i++;
    }

    Serial.write("You entered: ");

    for (unsigned i = 0; i < arraySize; i++) {
        Serial.write(array[i]);
        Serial.write(" ");
    }
    Serial.write("\n");
}

下面是一个示例输出显示其功能:

Enter a 1 digit number.
You wrote 5.
Now enter 5 lower-case letters.
You entered: h e l l o
Enter a 1 digit number.
You wrote 9.
Now enter 9 lower-case letters.
You entered: w a s s u p m a n
Enter a 1 digit number.
You wrote 9.
Now enter 9 lower-case letters.
You entered: h o w y a d o i n
Enter a 1 digit number.
You wrote 4.
Now enter 4 lower-case letters.
You entered: c o o l
Enter a 1 digit number.
You wrote 7.
Now enter 7 lower-case letters.
You entered: i t w o r k s
Enter a 1 digit number.

那么,为什么我不断听到这个? 这些人错了,还是我只是误解他们的意思?

Answer 1:

newdelete被定义为Arduino的发行版的一部分: /usr/share/arduino/hardware/arduino/cores/arduino/new.h

/* Header to define new/delete operators as they aren't provided by avr-gcc by default
   Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453 
 */
#ifndef NEW_H
#define NEW_H

#include <stdlib.h>

void * operator new(size_t size);
void operator delete(void * ptr); 

__extension__ typedef int __guard __attribute__((mode (__DI__)));

extern "C" int __cxa_guard_acquire(__guard *);
extern "C" void __cxa_guard_release (__guard *);
extern "C" void __cxa_guard_abort (__guard *); 

extern "C" void __cxa_pure_virtual(void);

#endif

new.h包括在Printable.h所以你在你的Arduino基本包括得到它。 这些运营商没有在AVR libc的定义是怎样的。 我的这些设计选择的解释:libc中的人认为这是一个坏主意,而Arduino的人都是关于易用性:如果你想newdelete ,请他们。



Answer 2:

正如你已经证明, newdelete 在Arduino的原理工作的。 问题是,你的Arduino的RAM为全局变量,栈和堆相结合 2K,所以你为它编写任何实质性的方案必须高度意识到内存的使用。

因此,对于像这样的嵌入式系统,它一般最好使用静态分配(或者可能是每类在某些情况下,动态分配),而不是通用的动态分配:对于简单的程序,你不需要动态分配,以及复杂的程序,你买不起它。



Answer 3:

仅仅因为平台不预先定义operator new()并不意味着不能定义它。 在你的代码,想必会有人已经写了分配函数的定义,所以一切都很好。

(我假设你熟悉的区别new的表达和分配功能,这是混淆的称为operator new()


这里有一个婴儿例子定义,应该得到一个简短的程序去:

char buf[1024];
char * cur = buf;

void * operator new(std::size_t n)
{
    char * res = cur;
    std::size_t inc = (n + 15) / 16 * 16;

    if (std::distance(cur, buf + sizeof(buf)) < inc)
        throw std::bad_alloc();

    cur += inc;

    return res;
}

void operator delete(void * p) noexcept
{
}

这显然会出现内存不足的速度非常快。



文章来源: Operator new for Arduino