Arduino:为什么带有布尔参数的 while() 循环会导致动态内存猛增?
Arduino: Why does while() loop with boolean argument cause dynamic memory to skyrocket?
我正在尝试 运行 Arduino Uno 板上两个射频发射器之间的通信。
在下面代码摘录的顶部启动 while() 循环时,如果我使用“==”运算符,动态内存使用率会飙升至 205% (4.2kB)。
但是,当在循环中使用单个“=”作为赋值运算符时,不会出现此问题(显然,在这种情况下,代码无法按要求运行)。
这就是有趣的地方。完全删除 while() 循环及其内容不会减少动态内存使用。 所以 在我看来,好像在循环中使用赋值运算符实际上减少了整个草图的动态内存使用量(减少到 15% / 325 字节)。
奇怪的是,它似乎不是泄漏问题,因为即使完全删除 while() 循环的内容也不能解决任何问题。
我对使用 C++ 和 Arduino 还很陌生,但假设这可能与全局变量的分配有关...
如果能帮助解决动态内存使用率如此之高的问题,我们将不胜感激!
我正在 Arduino IDE (v1.8.5) 中编码,写入 Arduino Uno(ATMega328 芯片)。
while (loop_var == true){
if (radio.sendWithRetry(TONODEID, &connection_checker, sizeof(connection_checker))){
if (tick == 0) {
Serial.print(F("Node ")); Serial.print(TONODEID); Serial.print(F(" detected. \n"));
tick = 1;
}
loop_var = false;
}
else {
while (tock == 0){
Serial.print(F("Node ")); Serial.print(TONODEID);
Serial.print(F(" - No ACK received, retrying... \n"));
tock++;
}
loop_var = true;
}
这不是关于循环内部发生的事情,而是关于外部发生的事情。
Arduino 附带的 C++ 编译器非常智能。它计算出是否有可能到达一条指令。如果声明的大变量仅在代码中永远不会到达的部分引用,则在计算动态内存时不会计算该变量所需的内存。
一个简单的测试用例如下。
int test[100],test2[100];
void loop() {
bool data=true;
#ifdef WHILE_COMPARE
while(data == true ){
#else
while(data = true){
#endif
for(int i=0;i<100;i++){
test[i]=0;
}
data=false;
}
#ifdef USE_TEST2
for(int i=0;i<100;i++){
test2[i]=0;
}
#endif
}
现在,根据声明了以下哪些组合,动态内存将按以下方式更改。
WHILE_COMPARE定义,USE_TEST2定义,DM射到402字节
WHILE_COMPARE未定义,USE_TEST2已定义,DM为209字节
WHILE_COMPARE已定义,USE_TEST2未定义,DM为209字节
WHILE_COMPARE未定义,USE_TEST2未定义,DM为209字节
希望对您有所帮助。
我正在尝试 运行 Arduino Uno 板上两个射频发射器之间的通信。
在下面代码摘录的顶部启动 while() 循环时,如果我使用“==”运算符,动态内存使用率会飙升至 205% (4.2kB)。
但是,当在循环中使用单个“=”作为赋值运算符时,不会出现此问题(显然,在这种情况下,代码无法按要求运行)。
这就是有趣的地方。完全删除 while() 循环及其内容不会减少动态内存使用。 所以 在我看来,好像在循环中使用赋值运算符实际上减少了整个草图的动态内存使用量(减少到 15% / 325 字节)。
奇怪的是,它似乎不是泄漏问题,因为即使完全删除 while() 循环的内容也不能解决任何问题。
我对使用 C++ 和 Arduino 还很陌生,但假设这可能与全局变量的分配有关...
如果能帮助解决动态内存使用率如此之高的问题,我们将不胜感激!
我正在 Arduino IDE (v1.8.5) 中编码,写入 Arduino Uno(ATMega328 芯片)。
while (loop_var == true){
if (radio.sendWithRetry(TONODEID, &connection_checker, sizeof(connection_checker))){
if (tick == 0) {
Serial.print(F("Node ")); Serial.print(TONODEID); Serial.print(F(" detected. \n"));
tick = 1;
}
loop_var = false;
}
else {
while (tock == 0){
Serial.print(F("Node ")); Serial.print(TONODEID);
Serial.print(F(" - No ACK received, retrying... \n"));
tock++;
}
loop_var = true;
}
这不是关于循环内部发生的事情,而是关于外部发生的事情。
Arduino 附带的 C++ 编译器非常智能。它计算出是否有可能到达一条指令。如果声明的大变量仅在代码中永远不会到达的部分引用,则在计算动态内存时不会计算该变量所需的内存。
一个简单的测试用例如下。
int test[100],test2[100];
void loop() {
bool data=true;
#ifdef WHILE_COMPARE
while(data == true ){
#else
while(data = true){
#endif
for(int i=0;i<100;i++){
test[i]=0;
}
data=false;
}
#ifdef USE_TEST2
for(int i=0;i<100;i++){
test2[i]=0;
}
#endif
}
现在,根据声明了以下哪些组合,动态内存将按以下方式更改。
WHILE_COMPARE定义,USE_TEST2定义,DM射到402字节
WHILE_COMPARE未定义,USE_TEST2已定义,DM为209字节
WHILE_COMPARE已定义,USE_TEST2未定义,DM为209字节
WHILE_COMPARE未定义,USE_TEST2未定义,DM为209字节
希望对您有所帮助。