Supper Thomas
Supper Thomas
https://github.com/Yaochenger/RvBacktrace
``` // backtrace function void rvbacktrace_fno(int (*print_func)(const char *fmt, ...)) { print_func("\r\n---- RV_Backtrace Call Frame Start: ----\r\n"); print_func("###Please consider the value of ra as accurate and the value of sp...
``` #if __riscv_xlen == 32 #define BACKTRACE_LEN 8 #endif #if __riscv_xlen == 64 #define BACKTRACE_LEN 16 #endif ```
主要函数`rvbacktrace_fno`
``` void rt_cm_backtrace_exception_hook(void *context) { uint8_t lr_offset = 0; uint32_t lr; #define CMB_LR_WORD_OFFSET_START 6 #define CMB_LR_WORD_OFFSET_END 20 #define CMB_SP_WORD_OFFSET (lr_offset + 1) #if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M0) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M3)...
``` for (; sp < stack_start_addr + stack_size; sp += sizeof(size_t)) { /* the *sp value may be LR, so need decrease a word to PC */ pc = *((uint32_t...
``` extern char *__etext; extern char *__stext; __attribute__((always_inline)) static inline void *backtrace_get_sp(void) { void *sp; __asm__ volatile("mv %0, sp\n" : "=r"(sp)); return sp; } __attribute__((always_inline)) static inline void *backtrace_get_pc(void) {...
__builtin_frame_address是GCC和Clang编译器提供的一个内置函数,用于获取当前函数调用堆栈中某个帧的地址。以下是其详细用法:
C:/RT-ThreadStudio/repo/Extract/ToolChain_Support_Packages/RISC-V/RISC-V-GCC-RV32/2022-04-12/bin/riscv32-unknown-elf-objdump -d rtthread.elf > rtthread.asm
https://club.rt-thread.org/ask/article/64bfe06feb7b3e29.html