Arduino 打印在大量打印时失败

Arduino print fails at large print count

我是 运行 我在 Arduino Uno 上的 loop() 函数中的这段代码:

int times = 400;
int i;
double raw[times];
for (i = 0; i < times; i++) {
    Serial.println(i);
    raw[i] = (double) i;
}

for (i = 0; i < times; i++) {
    Serial.println(raw[i]);
}

times小于500时,打印正常,但当times接近500时,串口打印会出现乱停或打印奇怪的字符,有时根本打印不出来。

是否与 RAM 使用有关?

Arduino Uno 使用 ATmega328P 微控制器。如果您查看该微控制器数据表的第一页: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf 你会注意到它说:

2KBytes Internal SRAM

您的阵列位于 SRAM 中。数组的大小(以字节为单位)可以通过以下方式计算: sizeof(double) * times。在这种情况下,sizeof(double) 是 4 个字节,因此当您将 times 设置为 500 时,数组使用 2000 个字节。 Uno 上的其余代码 运行 需要一些额外的 SRAM,因此您正在使用更多可用内存。这会导致未定义的行为,从而导致您遇到不良结果。

  1. 正如@per1234 提到的,RAM 是一个问题
  2. double 对于这个小型微型计算机来说非常昂贵。每次计算都需要数百个时钟周期,打印需要大量 RAM 和 uC 时间。您应该尝试改用整数/长整数 - 使用缩放算法

一种简单的检查方法是对数组进行硬编码:

如您所见,草图使用了 1,798 字节的 RAM,编译器已经报错了。如果您将其更改为 500,它会告诉您您使用的 RAM 比现有的多。