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,因此您正在使用更多可用内存。这会导致未定义的行为,从而导致您遇到不良结果。
- 正如@per1234 提到的,RAM 是一个问题
- double 对于这个小型微型计算机来说非常昂贵。每次计算都需要数百个时钟周期,打印需要大量 RAM 和 uC 时间。您应该尝试改用整数/长整数 - 使用缩放算法
一种简单的检查方法是对数组进行硬编码:
如您所见,草图使用了 1,798 字节的 RAM,编译器已经报错了。如果您将其更改为 500,它会告诉您您使用的 RAM 比现有的多。
我是 运行 我在 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,因此您正在使用更多可用内存。这会导致未定义的行为,从而导致您遇到不良结果。
- 正如@per1234 提到的,RAM 是一个问题
- double 对于这个小型微型计算机来说非常昂贵。每次计算都需要数百个时钟周期,打印需要大量 RAM 和 uC 时间。您应该尝试改用整数/长整数 - 使用缩放算法
一种简单的检查方法是对数组进行硬编码:
如您所见,草图使用了 1,798 字节的 RAM,编译器已经报错了。如果您将其更改为 500,它会告诉您您使用的 RAM 比现有的多。