Arduino 似乎在 45 uint32_t >崩溃
Arduino seems to crash when uint32_t > 45
我在UNO克隆上运行以下程序。
uint32_t counter = 0;
void setup() {
Serial.begin(9600);
while(!Serial);
}
void loop() {
char *result = malloc(32);
sprintf(result, "%024u", counter);
Serial.print("{"n": ");
Serial.print(result);
Serial.println(" }");
delay(100);
counter++;
}
一切正常工作,并按预期打印字符串和计数器。以下是输出的示例:
{"n": 000000000000000000000000 }
{"n": 000000000000000000000001 }
{"n": 000000000000000000000002 }
{"n": 000000000000000000000003 }
....
但是,每当counter > 45
时,程序都会停止在UART上打印,这就是输出的样子:
{"n": 000000000000000000000044 }
{"n": 000000000000000000000045 }
{"n": }
对可能导致此问题的任何见解都非常感谢。
每次调用loop
时,分配了32个字节。Arduino Uno的内存不多,因此很快就用完了。完成后,您需要处理内存。这是一个类比。
RAM是一条字符串。该字符串的长度固定。您可以切断一块字符串并将其用于您喜欢的任何东西。这是分配。如果您不断从字符串中切割32个字节,最终将用完。完成使用后,您需要将一块字符串胶带回到主字符串中。这是DealLocation。
那是一个非常糟糕的类比,但我希望你明白了!要解决直接问题,您可以简单地将free(result)
附加到功能的末尾,即可每次分配时对其进行处理。为了真正正确解决问题,您应该在堆栈上分配而不是堆。当您在堆栈上分配时,将在范围末尾自动处理内存。要在堆栈上分配32个字节,您只需这样做:
char result[32];
result
中的内存仅在其封闭范围(loop
函数)中有效。以上片段基本上等同于此:
char result_0;
char result_1;
char result_2;
// ...
char result_29;
char result_30;
char result_31;
堆栈分配要比堆分配(malloc
和free
)快得多,因为编译器确切知道您使用了多少内存。不过,这有缺点。为了堆叠内存,编译器需要知道您使用的内存数量!你不能这样做:
int size = get_a_number_from_somewhere();
char result[size];
因为编译器不知道要分配多少内存。但是,这是:
int size = get_a_number_from_somewhere();
char *result = malloc(size);
// ...
free(result);
完全可以。
通常,当您需要的内存量为编译时常数(例如32
)时,您应该堆叠分配,否则分配堆。每次您写malloc
时,请仔细考虑相应的free
去向。
malloc(),但在非常有限的RAM的Arduino上不太有用。
Arduino没有操作系统,如果没有足够的内存可以分配,它可能会干扰。(无论如何,保持Arduino永远运行该怎么办?)
如果您有Java背景,请避免new
关键字,这会导致相同的问题。
如果您需要内存,请尽早获取(在编译时间最好)并保留它。
当然,free(result)
响应也正确。
为什么不使用String()
,例如代码Bellow:
uint32_t counter = 0;
void setup() {
Serial.begin(9600);
while(!Serial);
}
void loop() {
Serial.print("{"n": ");
Serial.print(String(counter));
Serial.println(" }");
delay(100);
counter++;
}
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- EASTL矢量<向量<int>>连续的
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃