diff --git a/cm_backtrace/cm_backtrace.c b/cm_backtrace/cm_backtrace.c index 3e76321..5c35d3a 100644 --- a/cm_backtrace/cm_backtrace.c +++ b/cm_backtrace/cm_backtrace.c @@ -182,6 +182,12 @@ void cm_backtrace_firmware_info(void) { } #ifdef CMB_USING_OS_PLATFORM + +#if (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_FREERTOS) +uint32_t ft_start_addr; +size_t ft_size; +#endif + /** * Get current thread stack information * @@ -208,8 +214,9 @@ static void get_cur_thread_stack_info(uint32_t *sp, uint32_t *start_addr, size_t *start_addr = (uint32_t) OSTCBCurPtr->StkBasePtr; *size = OSTCBCurPtr->StkSize * sizeof(CPU_STK_SIZE); #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_FREERTOS) - *start_addr = (uint32_t)vTaskStackAddr(); - *size = vTaskStackSize() * sizeof( StackType_t ); + xTaskGetCurrentTaskHandle(); + *start_addr = (uint32_t) ft_start_addr; + *size = (size_t) ft_size; #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_RTX5) osRtxThread_t *thread = osRtxInfo.thread.run.curr; *start_addr = (uint32_t)thread->stack_mem; @@ -246,7 +253,8 @@ static const char *get_cur_thread_name(void) { return (const char *)OSTCBCurPtr->NamePtr; #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_FREERTOS) - return vTaskName(); + char *taskName = pcTaskGetName(NULL); + return (const char *)taskName; #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_RTX5) return osRtxInfo.thread.run.curr->name; #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_THREADX) diff --git a/cm_backtrace/cmb_def.h b/cm_backtrace/cmb_def.h index 0740c61..7b5e5ae 100644 --- a/cm_backtrace/cmb_def.h +++ b/cm_backtrace/cmb_def.h @@ -343,10 +343,10 @@ if (!(EXPR)) \ #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_UCOSIII) #include #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_FREERTOS) - #include - extern uint32_t *vTaskStackAddr(void);/* need to modify the FreeRTOS/tasks source code */ - extern uint32_t vTaskStackSize(void); - extern char * vTaskName(void); + #include + #include "task.h" + extern TaskHandle_t xTaskGetCurrentTaskHandle(void); + extern char * pcTaskGetName(TaskHandle_t xTaskToQuery); #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_RTX5) #include "rtx_os.h" #elif (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_THREADX) @@ -427,4 +427,17 @@ if (!(EXPR)) \ #error "not supported compiler" #endif +#if (CMB_OS_PLATFORM_TYPE == CMB_OS_PLATFORM_FREERTOS) +extern uint32_t ft_start_addr; +extern size_t ft_size; + +#undef traceRETURN_xTaskGetCurrentTaskHandle +#define traceRETURN_xTaskGetCurrentTaskHandle(xReturn) \ + { \ + ft_start_addr = (xReturn != NULL ? (StackType_t)xReturn->pxStack : 0); \ + ft_size = (xReturn != NULL ? (StackType_t)xReturn - (StackType_t)xReturn->pxStack - \ + 4 * sizeof(StackType_t) : 0); \ + } +#endif + #endif /* _CMB_DEF_H_ */