mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 06:28:27 -04:00
AP_Logger: save crash_dump.bin to sdcard on boot
on each boot write crash_dump.bin to the microSD if it is available this makes it easier for users to send in their crash dumps, and less likely they will overwrite it with a fw update
This commit is contained in:
parent
45c016ea13
commit
a15cf3192d
@ -1293,6 +1293,36 @@ int16_t AP_Logger::Write_calc_msg_len(const char *fmt) const
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
see if we need to save a crash dump. Returns true if either no crash
|
||||||
|
dump available or we have saved it to sdcard. This is called
|
||||||
|
continuously until success to account for late mount of the microSD
|
||||||
|
*/
|
||||||
|
bool AP_Logger::check_crash_dump_save(void)
|
||||||
|
{
|
||||||
|
int fd = AP::FS().open("@SYS/crash_dump.bin", O_RDONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
// we don't have a crash dump file. The @SYS filesystem
|
||||||
|
// returns -1 for open on empty files
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int fd2 = AP::FS().open("APM/crash_dump.bin", O_WRONLY|O_CREAT|O_TRUNC);
|
||||||
|
if (fd2 == -1) {
|
||||||
|
// sdcard not available yet, try again later
|
||||||
|
AP::FS().close(fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint8_t buf[128];
|
||||||
|
int32_t n;
|
||||||
|
while ((n = AP::FS().read(fd, buf, sizeof(buf))) > 0) {
|
||||||
|
AP::FS().write(fd2, buf, n);
|
||||||
|
}
|
||||||
|
AP::FS().close(fd2);
|
||||||
|
AP::FS().close(fd);
|
||||||
|
GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Saved crash_dump.bin");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// thread for processing IO - in general IO involves a long blocking DMA write to an SPI device
|
// thread for processing IO - in general IO involves a long blocking DMA write to an SPI device
|
||||||
// and the thread will sleep while this completes preventing other tasks from running, it therefore
|
// and the thread will sleep while this completes preventing other tasks from running, it therefore
|
||||||
// is necessary to run the IO in it's own thread
|
// is necessary to run the IO in it's own thread
|
||||||
@ -1300,6 +1330,8 @@ void AP_Logger::io_thread(void)
|
|||||||
{
|
{
|
||||||
uint32_t last_run_us = AP_HAL::micros();
|
uint32_t last_run_us = AP_HAL::micros();
|
||||||
uint32_t last_stack_us = last_run_us;
|
uint32_t last_stack_us = last_run_us;
|
||||||
|
uint32_t last_crash_check_us = last_run_us;
|
||||||
|
bool done_crash_dump_save = false;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
uint32_t now = AP_HAL::micros();
|
uint32_t now = AP_HAL::micros();
|
||||||
@ -1318,6 +1350,13 @@ void AP_Logger::io_thread(void)
|
|||||||
last_stack_us = now;
|
last_stack_us = now;
|
||||||
hal.util->log_stack_info();
|
hal.util->log_stack_info();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check for saving a crash dump file every 5s
|
||||||
|
if (!done_crash_dump_save &&
|
||||||
|
now - last_crash_check_us > 5000000U) {
|
||||||
|
last_crash_check_us = now;
|
||||||
|
done_crash_dump_save = check_crash_dump_save();
|
||||||
|
}
|
||||||
#if HAL_LOGGER_FILE_CONTENTS_ENABLED
|
#if HAL_LOGGER_FILE_CONTENTS_ENABLED
|
||||||
file_content_update();
|
file_content_update();
|
||||||
#endif
|
#endif
|
||||||
|
@ -525,6 +525,7 @@ private:
|
|||||||
|
|
||||||
void start_io_thread(void);
|
void start_io_thread(void);
|
||||||
void io_thread();
|
void io_thread();
|
||||||
|
bool check_crash_dump_save(void);
|
||||||
|
|
||||||
#if HAL_LOGGER_FILE_CONTENTS_ENABLED
|
#if HAL_LOGGER_FILE_CONTENTS_ENABLED
|
||||||
// support for logging file content
|
// support for logging file content
|
||||||
|
Loading…
Reference in New Issue
Block a user