C在不使2KB RAM过载的情况下处理大字符串(微控制器ATMEGA328P)

C在不使2KB RAM过载的情况下处理大字符串(微控制器ATMEGA328P),c,pointers,C,Pointers,我需要打印一个大字符串,问题是字符串太大了,如果我把字符串弄小一点,一切正常,但是当字符串太大时,它就不工作了 所以我试着把变量放在堆上,然后一个字符接着一个字符地打印它,如果这可能会有帮助的话,但不幸的是没有 运行它时,我可以看到RAM使用率为97%(总RAM为2048字节)。 当我从上面删除代码时,RAM使用率会下降到20-30% 我使用的是atmega328P 是否有任何方法可以在不过载可用RAM的情况下打印和\或处理大字符串 编程微小uCs时,忘记malloc和动态分配。忘记动态内存分配

我需要打印一个大字符串,问题是字符串太大了,如果我把字符串弄小一点,一切正常,但是当字符串太大时,它就不工作了

所以我试着把变量放在堆上,然后一个字符接着一个字符地打印它,如果这可能会有帮助的话,但不幸的是没有

运行它时,我可以看到RAM使用率为97%(总RAM为2048字节)。 当我从上面删除代码时,RAM使用率会下降到20-30%

我使用的是atmega328P

是否有任何方法可以在不过载可用RAM的情况下打印和\或处理大字符串

  • 编程微小uCs时,忘记malloc和动态分配。忘记动态内存分配吧

  • 为了防止字符串文字或其他常量数据占用RAM(通常所有内容都复制到RAM中,因为AVR有单独的数据和代码地址空间),您需要将数据放入程序内存中。要访问此存储器,需要特殊的装配说明:

  • 有两种方法:

  • 旧式程序
  • #包括

  • 更新的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.";