64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Copyright (c) 2006-2021, RT-Thread Development Team | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||
|  |  * | ||
|  |  * 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
 |