Implement saftey memory dump feature and increase heap space
This commit is contained in:
parent
10596cdbf0
commit
7aa0b62012
@ -54,6 +54,8 @@ INCLUDEPATH += -Iconfig-parser/include
|
|||||||
|
|
||||||
CFILES += base64-lib/src/base64-lib.c
|
CFILES += base64-lib/src/base64-lib.c
|
||||||
INCLUDEPATH += -Ibase64-lib/include
|
INCLUDEPATH += -Ibase64-lib/include
|
||||||
|
DEFINES += -DBASE64_LOOKUP_TABLE_SECTION="\".ccm.bss\""
|
||||||
|
|
||||||
|
|
||||||
DEBUG_DEFINES = -DDEBUGBUILD
|
DEBUG_DEFINES = -DDEBUGBUILD
|
||||||
RELEASE_DEFINES =
|
RELEASE_DEFINES =
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#define __SAFETY_MEMORY_H__
|
#define __SAFETY_MEMORY_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
/** @addtogroup safety-memory
|
/** @addtogroup safety-memory
|
||||||
* @{
|
* @{
|
||||||
@ -245,6 +246,15 @@ int safety_memory_get_config_override_count(uint32_t *count);
|
|||||||
*/
|
*/
|
||||||
int safety_memory_get_config_override(uint32_t idx, struct config_override *config_override);
|
int safety_memory_get_config_override(uint32_t idx, struct config_override *config_override);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get a base64 dump of the whole safety memory.
|
||||||
|
* @param[out] buffer Buffer to write the base 64 dump into.
|
||||||
|
* @param buffsize Size of buffer. Must be large enough to hold the data plus a '\0' terminator
|
||||||
|
* @param[out] used_size Number of written bytes including the '\0' terminator. May be NULL.
|
||||||
|
* @return 0 if successful
|
||||||
|
*/
|
||||||
|
int safety_memory_dump_base64(char *buffer, size_t buffsize, size_t *used_size);
|
||||||
|
|
||||||
#endif /* __SAFETY_MEMORY_H__ */
|
#endif /* __SAFETY_MEMORY_H__ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -55,3 +55,5 @@ int backup_ram_get_data(uint32_t addr, uint32_t *data, uint32_t count);
|
|||||||
int backup_ram_write_data(uint32_t addr, const uint32_t *data, uint32_t count);
|
int backup_ram_write_data(uint32_t addr, const uint32_t *data, uint32_t count);
|
||||||
|
|
||||||
uint32_t backup_ram_get_size_in_words(void);
|
uint32_t backup_ram_get_size_in_words(void);
|
||||||
|
|
||||||
|
volatile void *backup_ram_get_base_ptr(void);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <helper-macros/helper-macros.h>
|
#include <helper-macros/helper-macros.h>
|
||||||
#include <stm-periph/crc-unit.h>
|
#include <stm-periph/crc-unit.h>
|
||||||
#include <stm-periph/backup-ram.h>
|
#include <stm-periph/backup-ram.h>
|
||||||
|
#include <base64-lib/base64-lib.h>
|
||||||
|
|
||||||
static int word_to_error_memory_entry(uint32_t entry_data, struct error_memory_entry *out)
|
static int word_to_error_memory_entry(uint32_t entry_data, struct error_memory_entry *out)
|
||||||
{
|
{
|
||||||
@ -481,3 +482,29 @@ int safety_memory_insert_config_override(struct config_override *config_override
|
|||||||
int safety_memory_get_config_override_count(uint32_t *count);
|
int safety_memory_get_config_override_count(uint32_t *count);
|
||||||
|
|
||||||
int safety_memory_get_config_override(uint32_t idx, struct config_override *config_override);
|
int safety_memory_get_config_override(uint32_t idx, struct config_override *config_override);
|
||||||
|
|
||||||
|
int safety_memory_dump_base64(char *buffer, size_t buffsize, size_t *used_size)
|
||||||
|
{
|
||||||
|
uint32_t safety_mem_size;
|
||||||
|
size_t output_size;
|
||||||
|
const char *backup_mem_ptr;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (!buffer)
|
||||||
|
return -1000;
|
||||||
|
|
||||||
|
safety_mem_size = backup_ram_get_size_in_words() * 4U;
|
||||||
|
output_size = base64_calculate_encoded_size(safety_mem_size);
|
||||||
|
|
||||||
|
if (output_size + 1 > buffsize)
|
||||||
|
return -1001;
|
||||||
|
|
||||||
|
backup_mem_ptr = (const char *)backup_ram_get_base_ptr();
|
||||||
|
res = base64_encode(backup_mem_ptr, buffer, safety_mem_size, buffsize, &output_size);
|
||||||
|
if (res)
|
||||||
|
return -1;
|
||||||
|
buffer[output_size] = '\0';
|
||||||
|
if (used_size)
|
||||||
|
*used_size = output_size + 1u;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <reflow-controller/settings/settings.h>
|
#include <reflow-controller/settings/settings.h>
|
||||||
#include <reflow-controller/button.h>
|
#include <reflow-controller/button.h>
|
||||||
#include <reflow-controller/safety/fault.h>
|
#include <reflow-controller/safety/fault.h>
|
||||||
|
#include <reflow-controller/safety/safety-memory.h>
|
||||||
|
|
||||||
#ifndef GIT_VER
|
#ifndef GIT_VER
|
||||||
#define GIT_VER "VERSION NOT SET"
|
#define GIT_VER "VERSION NOT SET"
|
||||||
@ -546,6 +547,70 @@ static shellmatta_retCode_t shell_cmd_panic(const shellmatta_handle_t handle, co
|
|||||||
return SHELLMATTA_OK;
|
return SHELLMATTA_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *get_safety_mem_dump(size_t *used_bytes)
|
||||||
|
{
|
||||||
|
char *buffer;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
buffer = (char *)malloc(5470);
|
||||||
|
|
||||||
|
res = safety_memory_dump_base64(buffer, 5470UL, used_bytes);
|
||||||
|
if (res) {
|
||||||
|
if (buffer)
|
||||||
|
free(buffer);
|
||||||
|
buffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static shellmatta_retCode_t shell_cmd_dump_safety_mem(const shellmatta_handle_t handle, const char *arguments,
|
||||||
|
uint32_t length)
|
||||||
|
{
|
||||||
|
(void)arguments;
|
||||||
|
(void)length;
|
||||||
|
static char *buffer;
|
||||||
|
static const char *ptr;
|
||||||
|
size_t used_bytes;
|
||||||
|
static size_t full_lines = 0;
|
||||||
|
static size_t current_line;
|
||||||
|
size_t remainder;
|
||||||
|
static const char *hline = "----------------------------------------------------------------";
|
||||||
|
|
||||||
|
if (full_lines == 0) {
|
||||||
|
shellmatta_printf(handle, "Safety memory content\r\n%s\r\n", hline);
|
||||||
|
|
||||||
|
buffer = get_safety_mem_dump(&used_bytes);
|
||||||
|
if (!buffer) {
|
||||||
|
shellmatta_printf(handle, "Error dumping memory!\r\n");
|
||||||
|
return SHELLMATTA_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
full_lines = (used_bytes - 1) / 64;
|
||||||
|
remainder = (used_bytes - 1) % 64;
|
||||||
|
if (remainder)
|
||||||
|
full_lines++;
|
||||||
|
|
||||||
|
ptr = buffer;
|
||||||
|
current_line = 0;
|
||||||
|
return SHELLMATTA_BUSY;
|
||||||
|
} else {
|
||||||
|
if (current_line < full_lines) {
|
||||||
|
shellmatta_printf(handle, "%.64s\r\n", ptr);
|
||||||
|
ptr += 64;
|
||||||
|
current_line++;
|
||||||
|
} else {
|
||||||
|
shellmatta_printf(handle, "%s\r\n", hline);
|
||||||
|
full_lines = 0;
|
||||||
|
if (buffer)
|
||||||
|
free(buffer);
|
||||||
|
buffer = NULL;
|
||||||
|
return SHELLMATTA_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SHELLMATTA_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
//typedef struct shellmatta_cmd
|
//typedef struct shellmatta_cmd
|
||||||
//{
|
//{
|
||||||
// char *cmd; /**< command name */
|
// char *cmd; /**< command name */
|
||||||
@ -555,7 +620,7 @@ static shellmatta_retCode_t shell_cmd_panic(const shellmatta_handle_t handle, co
|
|||||||
// shellmatta_cmdFct_t cmdFct; /**< pointer to the cmd callack function */
|
// shellmatta_cmdFct_t cmdFct; /**< pointer to the cmd callack function */
|
||||||
// struct shellmatta_cmd *next; /**< pointer to next command or NULL */
|
// struct shellmatta_cmd *next; /**< pointer to next command or NULL */
|
||||||
//} shellmatta_cmd_t;
|
//} shellmatta_cmd_t;
|
||||||
static shellmatta_cmd_t cmd[17] = {
|
static shellmatta_cmd_t cmd[18] = {
|
||||||
{
|
{
|
||||||
.cmd = "version",
|
.cmd = "version",
|
||||||
.cmdAlias = "ver",
|
.cmdAlias = "ver",
|
||||||
@ -690,6 +755,14 @@ static shellmatta_cmd_t cmd[17] = {
|
|||||||
.helpText = "Panic Mode!",
|
.helpText = "Panic Mode!",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_cmd_panic,
|
.cmdFct = shell_cmd_panic,
|
||||||
|
.next = &cmd[17],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cmd = "safety-mem-dump",
|
||||||
|
.cmdAlias = NULL,
|
||||||
|
.helpText = "",
|
||||||
|
.usageText = "",
|
||||||
|
.cmdFct = shell_cmd_dump_safety_mem,
|
||||||
.next = NULL,
|
.next = NULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -107,3 +107,8 @@ uint32_t backup_ram_get_size_in_words(void)
|
|||||||
{
|
{
|
||||||
return (uint32_t)BACKUP_RAM_SIZE_WORDS;
|
return (uint32_t)BACKUP_RAM_SIZE_WORDS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
volatile void *backup_ram_get_base_ptr(void)
|
||||||
|
{
|
||||||
|
return backup_ram;
|
||||||
|
}
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
/* USER PARAMETERS */
|
/* USER PARAMETERS */
|
||||||
__ld_stack_size = 0x3000;
|
__ld_stack_size = 0x3000;
|
||||||
__ld_heap_size = 0x2100;
|
__ld_heap_size = 0x4200;
|
||||||
__stack_corruption_area_size = 128;
|
__stack_corruption_area_size = 128;
|
||||||
|
|
||||||
/* END OF USER PARAMETERS */
|
/* END OF USER PARAMETERS */
|
||||||
|
Loading…
Reference in New Issue
Block a user