gpt4 book ai didi

c++ - 关于 Arduino 上的 strcpy 和内存

转载 作者:行者123 更新时间:2023-11-30 05:12:31 25 4
gpt4 key购买 nike

我在我的 Arduino Uno 上运行这段代码:

#include <stdlib.h>


#include <Arduino.h>
#include <SoftwareSerial.h>
#include <MemoryFree.h>


void setup() {
Serial.begin(9600);
char cc[300];
char* ce = "Bonjour ca va et toi ?Bonjour ca va et toi ?Bonjour ca va et toi ?Bonjour ca va et toi ?";
strcpy(cc, ce, 300);
Serial.println(getFreeMemory());
}

void loop() {
// Put your main code here, to run repeatedly:

}

所以我想看看这占用了多少内存。令我惊讶的是,它不是我预期的 300,而是 300 + len(cc)。我想我不明白如何strcpy作品。但我认为这段代码会将 ce 复制到 cc 并且不会使用更多内存。

另一件事:当我在没有 strcpy 的情况下运行代码时,就像我的 SRAM 中什么都没有一样。

最佳答案

您缺少的部分是双引号字符串常量同时使用闪存(程序大小)和 RAM。不是因为strcpy;它是这个哈佛架构 MCU 上不同类型存储器的产物。

为避免同时使用闪存和 RAM 作为字符串常量,使用 F 宏强制它只能从闪存访问:

void setup() {
Serial.begin(9600);
char cc[300];
strcpy_P(cc, (const char *) F("Bonjour ca va et toi ?Bonjour ca va et toi ?"
"Bonjour ca va et toi ?Bonjour ca va et toi ?") );
Serial.println(getFreeMemory());
}

... 或将其定义为 PROGMEM 字符数组:

const char ce[] PROGMEM =
"Bonjour ca va et toi ?Bonjour ca va et toi ?"
"Bonjour ca va et toi ?Bonjour ca va et toi ?";

void setup() {
Serial.begin(9600);
char cc[300];
strcpy_P(cc,ce);
Serial.println(getFreeMemory());
}

注意事项:

  • 您必须使用 strcpy_P 变体从闪存而不是 RAM 复制
  • 长双引号字符串可以分解成几个相邻的双引号字符串。编译器将为您连接它们。

更新:

如果你能用碎片做你的“事情”,你可能不需要一个大数组。例如,不要制作一个大数组以便打印或发送。只需打印或发送各个部分——一些来自 RAM(例如,变量),一些来自闪存(例如,双引号字符串常量)。这节省了 RAM(很多!)和处理时间(没有拷贝或连接)。

关于c++ - 关于 Arduino 上的 strcpy 和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44488382/

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