C在不使2KB RAM过载的情况下处理大字符串(微控制器ATMEGA328P)
我需要打印一个大字符串,问题是字符串太大了,如果我把字符串弄小一点,一切正常,但是当字符串太大时,它就不工作了 所以我试着把变量放在堆上,然后一个字符接着一个字符地打印它,如果这可能会有帮助的话,但不幸的是没有 运行它时,我可以看到RAM使用率为97%(总RAM为2048字节)。 当我从上面删除代码时,RAM使用率会下降到20-30% 我使用的是atmega328P 是否有任何方法可以在不过载可用RAM的情况下打印和\或处理大字符串C在不使2KB RAM过载的情况下处理大字符串(微控制器ATMEGA328P),c,pointers,C,Pointers,我需要打印一个大字符串,问题是字符串太大了,如果我把字符串弄小一点,一切正常,但是当字符串太大时,它就不工作了 所以我试着把变量放在堆上,然后一个字符接着一个字符地打印它,如果这可能会有帮助的话,但不幸的是没有 运行它时,我可以看到RAM使用率为97%(总RAM为2048字节)。 当我从上面删除代码时,RAM使用率会下降到20-30% 我使用的是atmega328P 是否有任何方法可以在不过载可用RAM的情况下打印和\或处理大字符串 编程微小uCs时,忘记malloc和动态分配。忘记动态内存分配
#包括
更新的gcc命名地址空间:
编程微小uCs时,忘记malloc和动态分配。忘记动态内存分配吧
为了防止字符串文字或其他常量数据占用RAM(通常所有内容都复制到RAM中,因为AVR有单独的数据和代码地址空间),您需要将数据放入程序内存中。要访问此存储器,需要特殊的装配说明:
有两种方法:
旧式程序
#包括
更新的gcc命名地址空间:
字符串是常量吗?请参阅,这将允许您将字符串放在闪存中,而不是放在RAM中。sizeof(*largeString)
是字符(=1)的大小。除了sizeof(*largeString)
是1x char
的大小之外,以下largeString=“…”
将覆盖新分配内存的指针,导致泄漏。如果字符串是常量,则不需要malloc。只是const char*largeString=“…”代码>你对malloc所做的一切毫无意义。只需删除此呼叫。除了浪费内存,它什么也不做。如果您看到两行代码,比如x=malloc(…);x=y代码>那么您应该立即知道它们是错误的。字符串常量是多少?请参阅,这将允许您将字符串放在闪存中,而不是放在RAM中。sizeof(*largeString)
是字符(=1)的大小。除了sizeof(*largeString)
是1x char
的大小之外,以下largeString=“…”
将覆盖新分配内存的指针,导致泄漏。如果字符串是常量,则不需要malloc。只是const char*largeString=“…”代码>你对malloc所做的一切毫无意义。只需删除此呼叫。除了浪费内存,它什么也不做。如果您看到两行代码,比如x=malloc(…);x=y代码>那么你应该马上知道他们错了
char* largeString = malloc(sizeof(*largeString));
largeString = "some large string with ONLY alphanumerical values and . , ' \n and at the end: \0";
while(*largeString != '\0') {
printf("%c", *largeString );
++largeString ;
}
#include <avr/pgmspace.h>
char FlashString[] PROGMEM = "This is a string held completely in flashmemory.";