Hi, I want to preserve some memory between reboots so I can check the cause (for example, by setting a variable before calling abort); or just keep some counters (like an error counter).
I've seen that I can achieve that with "RTC_NOINIT_ATTR", but I'm not sure the bootloader will not override the values, is there a proper way to do this?
Also, it would be interesting to have some kind of stack trace or core dump preserved, I'm not sure if that can be done.
Preserving error information between reboots with RTC_NOINIT_ATTR
Re: Preserving error information between reboots with RTC_NOINIT_ATTR
It seems like I should check the linker script for this, although I still don't know how to do it...
-
- Posts: 9764
- Joined: Thu Nov 26, 2015 4:08 am
Re: Preserving error information between reboots with RTC_NOINIT_ATTR
The bootloader shouldn't touch the RTC memory.
Re: Preserving error information between reboots with RTC_NOINIT_ATTR
This should preserve esp_log information through aborts, reboots, deep-sleep etc. Unfortunately, if the power supply is lost to the ESP32, so is this information. This information is stored through RTC RAM.
Here is a bare bones, simple proof of concept to provide a starting point for you. I have made it as minimal as possible to convey the core concept. Note that it gibberish will be printed on the first run, and the log_message (Test Message), will be printed on the second run, having been saved in RTC RAM
Here is a bare bones, simple proof of concept to provide a starting point for you. I have made it as minimal as possible to convey the core concept. Note that it gibberish will be printed on the first run, and the log_message (Test Message), will be printed on the second run, having been saved in RTC RAM
Code: Select all
// Global declaration
RTC_NOINIT_ATTR char recent_log[1000];
static const char* TAG = "MyModule";
// Handler to direct log output to RTC RAM
int _log_vprintf(const char *fmt, va_list args)
{
//Should probably wrap this in a semaphore if running on multiple cores for thread safety
sprintf(recent_log,"%s", fmt);
return vprintf(fmt, args);
}
void app_main()
{
esp_log_set_vprintf(_log_vprintf);
printf("Message = [%s]\n", recent_log);
ESP_LOGW(TAG, "Test Message");
delay(1000);
esp_restart();
}
Who is online
Users browsing this forum: Majestic-12 [Bot], ShreyAcharya and 93 guests