对Sony Spresense硬故障进行故障排除

时间:2019-01-16 19:35:20

标签: arduino-ide spresense

我已经与Sony Spresense板一起工作了几天,但我不断遇到“硬故障”。我已经创建了同一代码的多个版本,但是都得到了相同的错误。我正在尝试从SD卡上的文件中复制字符,并将其插入内置SD模块中并进行处理。

我不知道该怎么办,即使代码在该点上不能与SD模块一起工作,错误也会在代码中的随机点突然弹出。如果我在发送错误消息的位置之前注释掉了几行代码,则会在代码中稍后发送错误消息。

错误消息只是突然被打印到串行监视器上,该错误似乎与我最近的所有草图都存在。看起来像这样。

    up_hardfault: PANIC!!! Hard fault: 40000000
    up_assert: Assertion failed at file:armv7-m/up_hardfault.c line: 171                 task: init
    up_dumpstate: sp:     0d0262d4
    up_dumpstate: IRQ stack:
    up_dumpstate:   base: 0d026300
    up_dumpstate:   size: 00000800
    up_dumpstate:   used: 00000128
    up_stackdump: 0d0262c0: 0d0262d8 0d01dc11 00000000 0d0262d8 0d00de13 00000003 00000000 0d00de1b
    up_stackdump: 0d0262e0: 0d00ddf9 0d00dded 000000e0 0d02e804 00000047 0d02e8ec 0d024594 0d00d5f5
    up_dumpstate: sp:     0d02e8d8
    up_dumpstate: User stack:
    up_dumpstate:   base: 0d02ee18
    up_dumpstate:   size: 00001fec
    up_dumpstate:   used: 00000860
    up_stackdump: 0d02e8c0: 00000000 00000000 00000000 00000000 00000000 0d000963 0d024c28 00000047
    up_stackdump: 0d02e8e0: 0d02e934 0d0015c9 198b37d8 00000047 00007fff 0d0003e9 0d0351e0 0000000b
    up_stackdump: 0d02e900: 0000000b 0d020e78 00000000 000003e8 deadbeef 0d035700 0d02cbb4 000000cc
    up_stackdump: 0d02e920: 00000000 00000000 0d034e20 00000000 00000000 0d034e30 00000000 00000000
    up_stackdump: 0d02e940: 0d034e40 00000000 00000000 deadbeef deadbeef deadbeef deadbeef deadbeef
    up_stackdump: 0d02e960: deadbeef 0d034e50 00000000 00000000 0d034e60 00000000 00000000 0d034e70
    up_stackdump: 0d02e980: 00000000 00000000 deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
    up_stackdump: 0d02e9a0: 0d034e80 00000000 00000000 0d034e90 00000000 00000000 0d034ea0 00000000
    up_stackdump: 0d02e9c0: 00000000 deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef 0d034eb0
    up_stackdump: 0d02e9e0: 00000000 00000000 0d034ec0 00000000 00000000 0d034ed0 00000000 00000000
    up_stackdump: 0d02ea00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef 0d034ee0 00000000
    up_stackdump: 0d02ea20: 00000000 0d034ef0 00000000 00000000 0d034f00 00000000 00000000 deadbeef
    up_stackdump: 0d02ea40: deadbeef deadbeef deadbeef deadbeef deadbeef 0d034f10 00000000 00000000
    up_stackdump: 0d02ea60: 0d034f20 00000000 00000000 0d034f30 00000000 00000000 deadbeef deadbeef
    up_stackdump: 0d02ea80: deadbeef deadbeef deadbeef deadbeef 0d034f40 00000000 00000000 0d034f50
    up_stackdump: 0d02eaa0: 00000000 00000000 0d034f60 00000000 00000000 deadbeef deadbeef deadbeef
    up_stackdump: 0d02eac0: deadbeef deadbeef deadbeef 0d034f70 00000000 00000000 0d034f80 00000000
    up_stackdump: 0d02eae0: 00000000 0d034f90 00000000 00000000 deadbeef deadbeef deadbeef deadbeef
    up_stackdump: 0d02eb00: deadbeef deadbeef 0d034fa0 00000000 00000000 0d034fb0 00000000 00000000
    up_stackdump: 0d02eb20: 0d034fc0 00000000 00000000 deadbeef deadbeef deadbeef deadbeef deadbeef
    up_stackdump: 0d02eb40: deadbeef 0d034fd0 00000000 00000000 0d034fe0 00000000 00000000 0d034ff0
    up_stackdump: 0d02eb60: 00000000 00000000 0d034c90 ffffffe9 00000000 00000000 00000000 00000000
    up_stackdump: 0d02eb80: 0d035000 00000000 00000000 0d035010 00000000 00000000 0d035020 00000000
    up_stackdump: 0d02eba0: 00000000 00000000 00000000 00000000 00000002 0d02c8f8 0d025954 0d035030
    up_stackdump: 0d02ebc0: 00000000 00000000 0d035040 00000000 00000000 0d035050 00000000 00000000
    up_stackdump: 0d02ebe0: 00000000 00000000 00000000 00000000 00000000 00000000 0d035060 00000000
    up_stackdump: 0d02ec00: 00000000 0d035070 00000000 00000000 0d035080 00000000 00000000 0d02ec70
    up_stackdump: 0d02ec20: 0000003c 0d015777 0d0244f4 0d015843 00000000 0d035090 00000000 00000000
    up_stackdump: 0d02ec40: 0d0350a0 00000000 00000000 0d0350b0 00000000 00000000 0000000a 0d0164ed
    up_stackdump: 0d02ec60: 0d027390 00000005 0d034c60 0d01de65 0d0350c0 00000000 00000000 0d0350d0
    up_stackdump: 0d02ec80: 00000000 00000000 0d0350e0 00000000 00000000 0000ffff 00000026 0d035c60
    up_stackdump: 0d02eca0: 00000000 00000004 00000080 0d0350f0 00000000 00000000 0d035100 00000000
    up_stackdump: 0d02ecc0: 00000000 0d035110 00000000 00000000 000000e0 0000002a 0d02edd8 0d021348
    up_stackdump: 0d02ece0: 0d024594 00000000 0d035120 00000000 00000000 0d035130 00000000 00000000
    up_stackdump: 0d02ed00: 0d035140 00000000 00000000 0d003cd1 00000001 00000000 00000000 00000075
    up_stackdump: 0d02ed20: 0d0245f4 0d035150 00000000 00000000 0d035160 00000000 00000000 0d035170
    up_stackdump: 0d02ed40: 00000000 00000000 041ac000 0d014cf3 041ac000 0d006d01 0d006a75 0d0245e8
    up_stackdump: 0d02ed60: 0d035180 00000000 00000000 0d035190 00000000 00000000 0d0351a0 00000000
    up_stackdump: 0d02ed80: 00000000 000000e0 000000e0 041ac000 00000002 0d0068ef 0d0068cf 0d0351b0
    up_stackdump: 0d02eda0: 00000000 00000000 0d0351c0 00000000 00000000 0d0351d0 00000000 00000000
    up_stackdump: 0d02edc0: 00000000 0d0062f9 00000000 0d000f11 000003ff 0d000f29 0d02459c 0d02459c
    up_stackdump: 0d02ede0: 0d000000 0d024594 00000000 00000000 00000000 0d000b51 0d008707 00000101
    up_stackdump: 0d02ee00: 00000000 00000000 00000000 0d00920f 00000000 00000000 deadbeef 0d02ee24
    up_registerdump: R0: 198b37d8 0d02e8ec 00000001 00000000 198b37d8 00000047 0d02e8ec 0d024594
    up_registerdump: R8: 00000000 00000000 0000003c 00000000 00000002 0d02e8d8 0d0015c9 0d00156e
    up_registerdump: xPSR: 21000000 BASEPRI: 000000e0 CONTROL: 00000000
    up_registerdump: EXC_RETURN: ffffffe9
    up_taskdump: Idle Task: PID=0 Stack Used=0 of 0
    up_taskdump: hpwork: PID=1 Stack Used=584 of 2028
    up_taskdump: lpwork: PID=2 Stack Used=352 of 2028
    up_taskdump: lpwork: PID=3 Stack Used=352 of 2028
    up_taskdump: lpwork: PID=4 Stack Used=352 of 2028
    up_taskdump: init: PID=5 Stack Used=2144 of 8172
    up_taskdump: cxd56_pm_task: PID=6 Stack Used=320 of 996
    up_taskdump: <pthread>: PID=7 Stack Used=312 of 1020 

它基本上是在我定义的另一个串行打印的中间打印的。

我一直在处理代码,并且如前所述,该错误看起来只是在随机点触发的。我尝试使用SD模块的所有草图中似乎都存在该错误,并且即使该设备未在积极使用SD模块,该错误也会弹出。

这是我目前正在尝试使用的代码

#include <SDHCI.h>

SDClass SD;
File myFile;

struct Landmark
{
  // strings
  String name;
  String sound;
  String rawLocation;

  // actual location
  float latitude;
  float longitude;

  // grid co-ordinates
  float p1;
  float p2;
  float p3;
  float p4;
};

bool proDebug = true; // debugging?

void getData()
{
  Serial.println("Getting Data");
  Serial.println("________________________________________");
  Serial.println("Locating File");

  Serial.println("  OK - Preparing Variables");
  Landmark landmark[20];
  int newLine;
  int space;
  int comma;

  Serial.println("  OK - Opening File 'datalog.txt'");
  String buffer = "datalog.txt";
  myFile = SD.open(buffer);

  Serial.println("  OK - Verifying Presence");
  if(myFile)
  {
    Serial.println("  Success - File Loaded");
    Serial.println("");

    Serial.println("Extracting Data");
    Serial.println("  OK - Beginning Final Extraction");

    while(myFile.available())
    {
      char c = myFile.read();

      if(c == '\n')
      {
        newLine++;
      }
      else if(c == ' ')
      {
        space++;
      }
      else
      {
        if(space == 0)
        {
          landmark[newLine].name += c;
        }
        else if(space == 1)
        {
          if(c == ',')
          {
            comma++;
            landmark[newLine].rawLocation += c;
          }

          if(comma == 0)
          {
            landmark[newLine].latitude += c;
          }
          else
          {
            landmark[newLine].longitude += c;
          }

          landmark[newLine].rawLocation += c;
        }
        else if(space == 2)
        {
          landmark[newLine].sound += c;
        }
      }
    }
  }
  else
  {
    Serial.println("  Error - File not Present");
    Serial.println("  OK - Terminating Algorithm");
    Serial.println("________________________________________");
    Serial.println("");
    while(1) {};
  }

  myFile.close();
  Serial.println("  Success - Data Loaded Locally");
  Serial.println("");

  Serial.println("Data Feedback");
  Serial.println("  OK - Dumping All Data");
  Serial.println("");

  for(int i = 0; i < (newLine + 1); i++)
  {
    Serial.print("Struct "); Serial.println(i);
    Serial.print("  location name   "); Serial.println(landmark[i].name);
    Serial.print("  sound file      "); Serial.println(landmark[i].sound);
    Serial.print("  raw location    "); Serial.println(landmark[i].rawLocation);
    Serial.print("  latitude        "); Serial.println(landmark[i].latitude);
    Serial.print("  longitude       "); Serial.println(landmark[i].longitude);
  }

  Serial.println("");
  Serial.println("  Success - Data Dumped");
  Serial.println("________________________________________");
  Serial.println("");
}

void setup()
{
  Serial.begin(115200);
  while(!Serial) {};

  Serial.println("");
  Serial.println("");
  getData();
}

void loop()
{

}

1 个答案:

答案 0 :(得分:0)

我发现此文档非常有用:https://www.nuttx.org/doku.php?id=wiki:howtos:cortexm-hardfault

您最大的希望是使用jtag探针,并与调试器和断点一起查看代码中发生的情况和位置

相关问题