Issue #18: Check error memory entries at safety ram init

This commit is contained in:
Mario Hüttel 2020-09-05 17:37:56 +02:00
parent 77c88c69cd
commit ea26f56545
4 changed files with 44 additions and 5 deletions

View File

@ -68,19 +68,22 @@ Weight override ``0xA2`` ``Weight`` ``Flag Number`` res
Persistance override ``0x8E`` ``Persistance`` ``Flag Number`` reserved don't care (written as 0xBB) Persistance override ``0x8E`` ``Persistance`` ``Flag Number`` reserved don't care (written as 0xBB)
======================= ============ ================= ===================== ===================================== ======================= ============ ================= ===================== =====================================
All words, not matching the table above are ignored and do not cause an error. By default the firmware fills this memory area with zeroes.
Error Memory Error Memory
~~~~~~~~~~~~ ~~~~~~~~~~~~
The error memory contains error entries in form of 32 bit words. The entries are coded as stated below. The error memory contains error entries in form of 32 bit words. The entries are coded as stated below.
``Error Flag`` entries are used to restore error flags after boot. In theory, all flags can be set using this entry type, ``Error Flag`` entries are used to restore error flags after boot. In theory, all flags can be set using this entry type.
however, only persistent flags are stored in the error memory by the firmware. However, only persistent flags are stored in the error memory by the firmware.
``NOP`` entries have no meaning. They are used as a filler. When adding a new error memory entry, the error memory is scanned until the first ``NOP`` entry is found. ``NOP`` entries have no meaning. They are used as a filler. When adding a new error memory entry, the error memory is scanned until the first ``NOP`` entry is found.
It is replaced with a valid entry. If the error memory contains a word, that is not defined below, it is considered invalid and will trigger the RAM checker on boot. It is replaced with a valid entry. If the error memory contains a word, that is not defined below, it is considered invalid and will trigger the RAM checker on boot.
``NOP`` entries can be used to preallocate the error memory in advance. ``NOP`` entries can be used to preallocate the error memory in advance. if the end of the error memory is reached, it is expanded by 1 word to first
the new error entry, until the backup RAM is full. After this, no further errors are stored.
If the same persistent error is triggered mutliple times, the ``COUNTER`` in the error entry is incremented.
======================= ============ ================= ===================== ===================================== ======================= ============ ================= ===================== =====================================
Entry Byte 1 (LSB) Byte 2 Byte 3 Byte 4 (MSB) Entry Byte 1 (LSB) Byte 2 Byte 3 Byte 4 (MSB)

View File

@ -28,6 +28,11 @@
*/ */
#define SAFETY_MEMORY_MAGIC 0x12AA5CB7 #define SAFETY_MEMORY_MAGIC 0x12AA5CB7
/**
* @brief Error memory NOP entry
*/
#define SAFETY_MEMORY_NOP_ENTRY 0xC1AA1222
/** /**
* @brief Offset address for the safety_memory_header. * @brief Offset address for the safety_memory_header.
* @note Any other value than 0UL doesn't really make sense. Therfore, this should not be changed. * @note Any other value than 0UL doesn't really make sense. Therfore, this should not be changed.

View File

@ -154,14 +154,12 @@ static inline void setup_system(void)
setup_nvic_priorities(); setup_nvic_priorities();
systick_setup(); systick_setup();
oven_driver_init(); oven_driver_init();
digio_setup_default_all(); digio_setup_default_all();
led_setup(); led_setup();
loudspeaker_setup(); loudspeaker_setup();
reflow_menu_init(); reflow_menu_init();
uart_gpio_config(); uart_gpio_config();
setup_shell_uart(&shell_uart); setup_shell_uart(&shell_uart);

View File

@ -239,6 +239,35 @@ int safety_memory_set_boot_status(const struct safety_memory_boot_status *status
return 0; return 0;
} }
static int safety_memory_check_error_entries()
{
struct safety_memory_header header;
uint32_t addr;
uint32_t data;
int ret = 0;
int res;
if (safety_memory_get_header(&header) != SAFETY_MEMORY_INIT_VALID_MEMORY) {
return -2000;
}
for (addr = header.err_memory_offset; addr < header.err_memory_end; addr++) {
res = backup_ram_get_data(addr, &data, 1UL);
if (res)
return -100;
/* Valid flag entry */
if ((data & 0xFF) == 0x51)
continue;
if (data == SAFETY_MEMORY_NOP_ENTRY)
continue;
ret--;
}
return ret;
}
int safety_memory_get_error_entry_count(uint32_t *count); int safety_memory_get_error_entry_count(uint32_t *count);
int safety_memory_check(void) int safety_memory_check(void)
@ -246,6 +275,10 @@ int safety_memory_check(void)
int res; int res;
res = safety_memory_check_crc(); res = safety_memory_check_crc();
if (!res) {
res |= safety_memory_check_error_entries();
}
return -!!res; return -!!res;
} }