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:
Dong Heng
2018-10-19 12:58:03 +08:00
parent 6b2c48f582
commit a6a342ae51
2 changed files with 65 additions and 36 deletions

View File

@ -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) {