1、【完善】获取 PSP 、MSP 及 SP 寄存器函数,增强兼容性。

Signed-off-by: armink <armink.ztl@gmail.com>
This commit is contained in:
armink
2017-04-29 21:59:05 +08:00
parent 8aae96fc28
commit 390541a413
4 changed files with 47 additions and 39 deletions
+5 -32
View File
@@ -31,33 +31,6 @@
#include <string.h>
#include <stdio.h>
/* include or export for supported __get_MSP, __get_PSP function */
#if defined(__CC_ARM)
static __inline __asm uint32_t __get_MSP(void) {
mrs r0, msp
bx lr
}
static __inline __asm uint32_t __get_PSP(void) {
mrs r0, psp
bx lr
}
#elif defined(__ICCARM__)
#include <intrinsics.h>
#elif defined(__GNUC__)
__attribute__( ( always_inline ) ) static inline uint32_t __get_MSP(void) {
register uint32_t result;
__asm volatile ("MRS %0, msp\n" : "=r" (result) );
return(result);
}
__attribute__( ( always_inline ) ) static inline uint32_t __get_PSP(void) {
register uint32_t result;
__asm volatile ("MRS %0, psp\n" : "=r" (result) );
return(result);
}
#else
#error "not supported compiler"
#endif
#if defined(__CC_ARM)
#define SECTION_START(_name_) _name_##$$Base
#define SECTION_END(_name_) _name_##$$Limit
@@ -369,7 +342,7 @@ size_t cm_backtrace_call_stack(uint32_t *buffer, size_t size, uint32_t sp) {
}
} else {
/* OS environment */
if (__get_SP() == __get_PSP()) {
if (cmb_get_sp() == cmb_get_psp()) {
get_cur_thread_stack_info(sp, &stack_start_addr, &stack_size);
}
#endif /* CMB_USING_OS_PLATFORM */
@@ -426,7 +399,7 @@ void cm_backtrace_assert(uint32_t sp) {
CMB_ASSERT(init_ok);
#ifdef CMB_USING_OS_PLATFORM
uint32_t cur_stack_pointer = __get_SP();
uint32_t cur_stack_pointer = cmb_get_sp();
#endif
cmb_println("");
@@ -434,14 +407,14 @@ void cm_backtrace_assert(uint32_t sp) {
#ifdef CMB_USING_OS_PLATFORM
/* OS environment */
if (cur_stack_pointer == __get_MSP()) {
if (cur_stack_pointer == cmb_get_msp()) {
cmb_println(print_info[PRINT_ASSERT_ON_HANDLER]);
#ifdef CMB_USING_DUMP_STACK_INFO
dump_main_stack(main_stack_start_addr, main_stack_size, (uint32_t *) sp);
#endif /* CMB_USING_DUMP_STACK_INFO */
} else if (cur_stack_pointer == __get_PSP()) {
} else if (cur_stack_pointer == cmb_get_psp()) {
cmb_println(print_info[PRINT_ASSERT_ON_THREAD], get_cur_thread_name());
#ifdef CMB_USING_DUMP_STACK_INFO
@@ -616,7 +589,7 @@ void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) {
/* check which stack was used before (MSP or PSP) */
if (on_thread_before_fault) {
cmb_println(print_info[PRINT_FAULT_ON_THREAD], get_cur_thread_name() != NULL ? get_cur_thread_name() : "NO_NAME");
saved_regs_addr = stack_pointer = __get_PSP();
saved_regs_addr = stack_pointer = cmb_get_psp();
#ifdef CMB_USING_DUMP_STACK_INFO
get_cur_thread_stack_info(stack_pointer, &stack_start_addr, &stack_size);