12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- * File : backtrace.c
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006, 2008 RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://openlab.rt-thread.com/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2008-07-29 Bernard first version from QiuYi implementation
- */
- #include <rtthread.h>
- #ifdef __GNUC__
- /*
- -->High Address,Stack Top
- PC<-----|
- LR |
- IP |
- FP |
- ...... |
- PC<-| |
- LR | |
- IP | |
- FP---|-- |
- ...... |
- PC |
- LR |
- IP |
- FP---
- -->Low Address,Stack Bottom
- */
- void rt_hw_backtrace(rt_uint32_t *fp, rt_uint32_t thread_entry)
- {
- rt_uint32_t i, pc, func_entry;
- pc = *fp;
- rt_kprintf("[0x%x]\n", pc-0xC);
- for(i=0; i<10; i++)
- {
- fp = (rt_uint32_t *)*(fp - 3);
- pc = *fp ;
- func_entry = pc - 0xC;
- if(func_entry <= 0x30000000) break;
- if((func_entry == thread_entry))
- {
- rt_kprintf("EntryPoint:0x%x\n", func_entry);
- break;
- }
- rt_kprintf("[0x%x]\n", func_entry);
- }
- }
- #else
- void rt_hw_backtrace(rt_uint32_t *fp, rt_uint32_t thread_entry)
- {
- /* old compiler implementation */
- }
- #endif
|