Troubleshooting Sony Spresense Hard Fault

690 views Asked by At

I have been working with the Sony Spresense board for a couple of days now but I am continuously getting a "hard fault". I have created multiple versions of the same code, but all get the same error. I am trying to copy the characters from a file on an SD card, inserted in the built-in SD Module and process them.

I have no idea what to do, the error just pops up at random points in the code, even if the board does not work with the SD Module at that point. If I comment out some lines of code before the point where the error message is sent, the error message is sent later on in the code.

The error message just gets printed to the serial monitor suddenly, the error seems to be present with all of my recent sketches. It looks like this.

    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 

It is basically printed in the middle of another serial print that I defined.

I played around with the code, and as previously said, the error just gets triggered at a random point, as it seems. It seems to be present in pretty much all the sketches I tried with the SD Module and the error pops up even if the device is not actively using the SD module.

This is the code that I am currently trying to use

#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

There are 1 answers

0
Clonk On

I found this documentation to be very useful : https://www.nuttx.org/doku.php?id=wiki:howtos:cortexm-hardfault

Also your best hope is to use a jtag probe and see with a debugger & breakpoints what happens and where in the code