Arduino Sketch编译然后在上传时冻结

时间:2012-05-09 14:10:00

标签: c++ class arduino adk

我目前正致力于开发自动跳棋板。我使用三个类在C ++中编写它,然后进行必要的更改以将其用作Arduino上的库。 C ++代码分为三个类,它们为电路板的位置启动一个8乘8的数组,并跟踪该电路板上的棋子的移动。

我认为转换到Arduino库是正确的,因为我能够编译草图而没有任何错误。但是当我将它上传到ADK Mega时,即使是Serial.print()之类的简单命令,串行监视器上也没有任何响应。

这是草图:

#include <Board.h>

Board myBoard ;

int currentTurn=0;
int order[4][4]={{0,2,1,3},{1,5,2,4},{4,2,5,3},{2,4,0,2}};
int k=0;    
int *A;

void setup()
{
  pinMode(13, OUTPUT); 
  Serial.begin(9600);
}

void loop()
{
  A=myBoard.arr(); 
  for (int i=0; i<98; i++)
  {
     Serial.print(A[i]);
  }

 command[0]=order[k][0]; 
 command[1]=order[k][1];
 command[2]=order[k][2];
 command[3]=order[k][3];

  myBoard.processCommand(command,currentTurn); 

  if(myBoard.nextTurn())
  {
    if(currentTurn==0)
    { 
      currentTurn=1; 
      digitalWrite(13,HIGH);
      delay(3000);
    }
    else
    { 
      currentTurn=0;
      digitalWrite(13,LOW);
      delay(3000);    
    }      
  }
k++;
}

基本上,该类返回一个0和1的数组,其中包含有关pawn位置的信息。但是一上传草图就没有任何事情发生!

有没有人知道为什么会发生这种情况?

如果有人认为问题可能存在,那么这是Board类的构造函数

修改

 Board::Board()
{

    bool gameFinished=false;
    bool turnChange=false;
    initBoard();
    initPawns();

}

我更改了构造函数以简化操作。现在,对象数组在标题中创建为公共成员:Pawn myPawns [24]。 该程序现在正确运行,我能够打印数组,但只能在void loop()中的第一次迭代,之后打印的数组对应一个空板(没有pawn存在)。 我怀疑程序在第一次迭代后没有正确访问Pawns数组 - 当构造函数被调用时 - 。 动态分配Pawns数组会解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在你的构造函数中,你为小型处理器要求相当多的堆栈:

  • 24 Pawn s - 无论多大
  • int
  • 64 board s

Pawn以字节为单位有多大?

你可能用完了堆栈。查看this thread以获取有关内存类型以及如何查看堆栈/堆耗尽的更多讨论。 Another useful page on Arduino memory

1224字节是2048(IIRC)中相当多的可用的总数!

另外 - 你是否正在调用new - 它也将使用堆也是RAM。

修改 从你的评论中听到你已经分配了两次,一次在课堂上,一次在函数内的堆栈上 - 你的意思是这样做吗?

更多编辑

不要在标题中分配内容。 extern然后或原型,或将它们放在课堂上。但是不要在那里分配它们!

如果课程中有Pawn myPawns[24],则不需要在构造函数中声明它。