Arduino Zero - Region Ram溢出堆栈

时间:2017-05-03 11:06:10

标签: arduino

我有一些代码使用嵌套的Structs来存储设备参数,如下所示:

这是使用Ardunio Zero(Atmel SAMD21)

声明Storeage,每个网络最多有3个网络,有64个设备。

我想使用5个网络但是当我将网络增加到4时,代码将无法编译。

我得到区域RAM溢出堆栈/ RAM溢出4432字节。

据我所知,这比我有更多的公羊?我想看看是否有一个解决方案使用不同的方法来实现相同的东西,但让它适合?

 struct device {
   int   stat;
   bool  changed;
   char  data[51];
   char  state[51];
   char  atime[14];
   char  btime[14];
   };

struct outputs {
   device fitting[64];
   };


struct storage {
    int deviceid =0;
    int addstore =0;
    bool set;
    bool run_events = false;
    char authkey[10];
    outputs network[3];
 } ;

storage data_store;

2 个答案:

答案 0 :(得分:0)

嗯,通常的方法是:

  1. 考虑所有或任何数据是否实际上是只读的,因此可以const(它应该将其移动到只读内存,如果失败,你通常可以通过添加编译器强制它 - 具体的魔法)。
  2. 找出使用较少位表示数据的方法。例如,对于三个时间戳中的每一个使用14个字节可能看起来过多;将这些切换为32位时间戳并在需要时生成字符串将节省大约70%。
  3. 如果存在重复项,那么每个storage可能不需要三个唯一outputs,但可以将指针存储到唯一配置的共享“池”中。
  4. 如果不是所有的64 fitting都被使用,那么该数组也可以重构成具有非恒定长度。
  5. 由于我不太了解您的数据或应用程序,因此很难更具体。

答案 1 :(得分:0)

你的结构占据了太多的位置。就这样。假设chars,int和bools每个内部都是1个字节,那么device结构需要132个字节。然后,您的outputs结构需要8448个字节或8.25Kb。你的单位有32Kb的RAM ......