mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-15 22:53:33 +08:00
Add hardfault log progmem flash backend
This commit is contained in:
committed by
Daniel Agar
parent
ca9ae80b10
commit
fa87375d0c
@@ -54,12 +54,18 @@
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#ifdef HAS_BBSRAM
|
||||
#include <stm32_bbsram.h>
|
||||
#endif
|
||||
|
||||
#include <systemlib/px4_macros.h>
|
||||
#include <systemlib/hardfault_log.h>
|
||||
#include <lib/version/version.h>
|
||||
|
||||
#ifdef HAS_PROGMEM
|
||||
#include <px4_platform/progmem_dump.h>
|
||||
#endif
|
||||
|
||||
#include "chip.h"
|
||||
|
||||
#if defined(CONSTRAINED_FLASH_NO_HELP)
|
||||
@@ -224,7 +230,7 @@ static void identify(const char *caller)
|
||||
/****************************************************************************
|
||||
* hardfault_get_desc
|
||||
****************************************************************************/
|
||||
static int hardfault_get_desc(char *caller, struct bbsramd_s *desc, bool silent)
|
||||
static int hardfault_get_desc(char *caller, dump_s *desc, bool silent)
|
||||
{
|
||||
int ret = -ENOENT;
|
||||
int fd = open(HARDFAULT_PATH, O_RDONLY);
|
||||
@@ -237,7 +243,7 @@ static int hardfault_get_desc(char *caller, struct bbsramd_s *desc, bool silent)
|
||||
|
||||
} else {
|
||||
ret = -EIO;
|
||||
int rv = ioctl(fd, PX4_BBSRAM_GETDESC_IOCTL, (unsigned long)((uintptr_t)desc));
|
||||
int rv = ioctl(fd, PX4_HF_GETDESC_IOCTL, (unsigned long)((uintptr_t)desc));
|
||||
|
||||
if (rv >= 0) {
|
||||
ret = fd;
|
||||
@@ -251,6 +257,39 @@ static int hardfault_get_desc(char *caller, struct bbsramd_s *desc, bool silent)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if HAS_PROGMEM
|
||||
/****************************************************************************
|
||||
* hardfault_clear
|
||||
****************************************************************************/
|
||||
static int hardfault_clear(char *caller, bool silent)
|
||||
{
|
||||
int ret = -ENOENT;
|
||||
int fd = open(HARDFAULT_PATH, O_RDONLY);
|
||||
int value = 1;
|
||||
|
||||
if (fd < 0) {
|
||||
if (!silent) {
|
||||
identify(caller);
|
||||
hfsyslog(LOG_INFO, "Failed to open Fault Log file to clear [%s] (%d)\n", HARDFAULT_PATH, fd);
|
||||
}
|
||||
|
||||
} else {
|
||||
ret = -EIO;
|
||||
int rv = ioctl(fd, PROGMEM_DUMP_CLEAR_IOCTL, (unsigned long)((uintptr_t)&value));
|
||||
|
||||
if (rv >= 0) {
|
||||
ret = fd;
|
||||
|
||||
} else {
|
||||
identify(caller);
|
||||
hfsyslog(LOG_INFO, "Failed to clear progmem sector (%d)\n", rv);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* write_stack_detail
|
||||
****************************************************************************/
|
||||
@@ -518,7 +557,7 @@ static int write_user_stack_info(int fdout, info_s *pi, char *buffer,
|
||||
/****************************************************************************
|
||||
* write_dump_info
|
||||
****************************************************************************/
|
||||
static int write_dump_info(int fdout, info_s *info, struct bbsramd_s *desc,
|
||||
static int write_dump_info(int fdout, info_s *info, dump_s *desc,
|
||||
char *buffer, unsigned int sz)
|
||||
{
|
||||
char fmtbuff[ TIME_FMT_LEN + 1];
|
||||
@@ -859,7 +898,7 @@ static int hardfault_commit(char *caller)
|
||||
{
|
||||
int ret = -ENOENT;
|
||||
int state = -1;
|
||||
struct bbsramd_s desc;
|
||||
dump_s desc;
|
||||
char path[LOG_PATH_LEN + 1];
|
||||
ret = hardfault_get_desc(caller, &desc, false);
|
||||
|
||||
@@ -889,7 +928,7 @@ static int hardfault_commit(char *caller)
|
||||
if (fdout >= 0) {
|
||||
identify(caller);
|
||||
syslog(LOG_INFO, "Saving Fault Log file %s\n", path);
|
||||
ret = hardfault_write(caller, fdout, HARDFAULT_FILE_FORMAT, true);
|
||||
ret = hardfault_write(caller, fdout, HARDFAULT_FILE_FORMAT, false);
|
||||
identify(caller);
|
||||
hfsyslog(LOG_INFO, "Done saving Fault Log file\n");
|
||||
|
||||
@@ -916,6 +955,12 @@ static int hardfault_commit(char *caller)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAS_PROGMEM
|
||||
// Clear flash sector to write new hardfault
|
||||
hardfault_clear(caller, false);
|
||||
#endif
|
||||
ret = hardfault_rearm(caller);
|
||||
|
||||
close(fdout);
|
||||
}
|
||||
}
|
||||
@@ -931,7 +976,7 @@ static int hardfault_commit(char *caller)
|
||||
* hardfault_dowrite
|
||||
****************************************************************************/
|
||||
static int hardfault_dowrite(char *caller, int infd, int outfd,
|
||||
struct bbsramd_s *desc, int format)
|
||||
dump_s *desc, int format)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
char *line = zalloc(OUT_BUFFER_LEN);
|
||||
@@ -1056,7 +1101,7 @@ __EXPORT int hardfault_rearm(char *caller)
|
||||
__EXPORT int hardfault_check_status(char *caller)
|
||||
{
|
||||
int state = -1;
|
||||
struct bbsramd_s desc;
|
||||
dump_s desc;
|
||||
int ret = hardfault_get_desc(caller, &desc, true);
|
||||
|
||||
if (ret < 0) {
|
||||
@@ -1122,8 +1167,11 @@ __EXPORT int hardfault_increment_reboot(char *caller, bool reset)
|
||||
|
||||
if (!reset) {
|
||||
if (read(fd, &count, sizeof(count)) != sizeof(count)) {
|
||||
//Progmem could have an empty file hence we ignore this error
|
||||
#ifndef HAS_PROGMEM
|
||||
ret = -EIO;
|
||||
close(fd);
|
||||
#endif
|
||||
|
||||
} else {
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
@@ -1155,7 +1203,7 @@ __EXPORT int hardfault_increment_reboot(char *caller, bool reset)
|
||||
|
||||
__EXPORT int hardfault_write(char *caller, int fd, int format, bool rearm)
|
||||
{
|
||||
struct bbsramd_s desc;
|
||||
dump_s desc;
|
||||
|
||||
switch (format) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user