Устранение неполадок Sony Spresense Hard Fault - PullRequest
0 голосов
/ 16 января 2019

Я работаю с платой 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 голосов
/ 24 января 2019

Я нашел эту документацию очень полезной: https://www.nuttx.org/doku.php?id=wiki:howtos:cortexm-hardfault

Также ваша лучшая надежда - использовать jtag-зонд и посмотреть с отладчиком и точками останова, что происходит и где в коде

...