gpt4 book ai didi

c++ - Arduino:为什么带有 bool 参数的 while() 循环会导致动态内存猛增?

转载 作者:太空狗 更新时间:2023-10-29 21:33:26 24 4
gpt4 key购买 nike

我正在尝试在 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字节

希望对您有所帮助。

关于c++ - Arduino:为什么带有 bool 参数的 while() 循环会导致动态内存猛增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com