mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-08-06 07:00:05 +08:00
feat(freertos): Add function to panic NMI/ISR/task stack data and keep its stack safe
Fix part panic information error.
This commit is contained in:
@ -98,11 +98,11 @@ static void panic_stack(StackType_t *start_stk, StackType_t *end_stk)
|
||||
{
|
||||
uint32_t *start = (uint32_t *)start_stk, *end = (uint32_t *)end_stk;
|
||||
size_t i, j;
|
||||
size_t size = end - start + 1;
|
||||
size_t size = end - start;
|
||||
|
||||
panic_str(" ");
|
||||
for (i = 0; i < STACK_VOL_NUM; i++) {
|
||||
panic_data32(i * sizeof(StackType_t), 16);
|
||||
panic_data32(i * sizeof(void *), 16);
|
||||
panic_str(" ");
|
||||
}
|
||||
panic_str("\r\n\r\n");
|
||||
@ -133,6 +133,8 @@ static void panic_stack(StackType_t *start_stk, StackType_t *end_stk)
|
||||
*/
|
||||
static void panic_info(void *frame, int wdt)
|
||||
{
|
||||
extern int _chip_nmi_cnt;
|
||||
|
||||
task_info_t *task;
|
||||
int *regs = (int *)frame;
|
||||
int x, y;
|
||||
@ -151,29 +153,43 @@ static void panic_info(void *frame, int wdt)
|
||||
show_critical_info();
|
||||
}
|
||||
|
||||
if (xPortInIsrContext())
|
||||
panic_str("Core 0 was running in ISR context:\r\n\r\n");
|
||||
if (_chip_nmi_cnt) {
|
||||
extern StackType_t _chip_nmi_stk, LoadStoreErrorHandlerStack;
|
||||
|
||||
if ((task = (task_info_t *)xTaskGetCurrentTaskHandle())) {
|
||||
StackType_t *pdata = task->pxStack;
|
||||
StackType_t *end = task->pxEndOfStack + 4;
|
||||
_chip_nmi_cnt = 0;
|
||||
panic_str("Core 0 was running in NMI context:\r\n\r\n");
|
||||
|
||||
// "Task stack [%s] stack from [%p] to [%p], total [%d] size\r\n\r\n"
|
||||
panic_str("Task stack [");
|
||||
panic_str(task->pcTaskName);
|
||||
panic_str("] stack from [");
|
||||
panic_data32((uint32_t)pdata, 16);
|
||||
panic_str("] to [");
|
||||
panic_data32((uint32_t)end, 16);
|
||||
panic_str("], total [");
|
||||
panic_data32((uint32_t)(end - pdata + 4), 10);
|
||||
panic_str("] size\r\n\r\n");
|
||||
|
||||
panic_stack(pdata, end);
|
||||
|
||||
panic_str("\r\n\r\n");
|
||||
panic_stack(&_chip_nmi_stk, &LoadStoreErrorHandlerStack);
|
||||
} else {
|
||||
panic_str("No task\r\n\r\n");
|
||||
if (xPortInIsrContext()) {
|
||||
extern StackType_t _chip_interrupt_stk, _chip_interrupt_tmp;
|
||||
|
||||
panic_str("Core 0 was running in ISR context:\r\n\r\n");
|
||||
|
||||
panic_stack(&_chip_interrupt_stk, &_chip_interrupt_tmp);
|
||||
} else {
|
||||
if ((task = (task_info_t *)xTaskGetCurrentTaskHandle())) {
|
||||
StackType_t *pdata = task->pxStack;
|
||||
StackType_t *end = task->pxEndOfStack + 4;
|
||||
|
||||
// "Task stack [%s] stack from [%p] to [%p], total [%d] size\r\n\r\n"
|
||||
panic_str("Task stack [");
|
||||
panic_str(task->pcTaskName);
|
||||
panic_str("] stack from [");
|
||||
panic_data32((uint32_t)pdata, 16);
|
||||
panic_str("] to [");
|
||||
panic_data32((uint32_t)end, 16);
|
||||
panic_str("], total [");
|
||||
panic_data32((uint32_t)(end - pdata), 10);
|
||||
panic_str("] size\r\n\r\n");
|
||||
|
||||
panic_stack(pdata, end);
|
||||
|
||||
panic_str("\r\n\r\n");
|
||||
} else {
|
||||
panic_str("No task\r\n\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (x = 0; x < 20; x += 4) {
|
||||
|
Reference in New Issue
Block a user