diff --git a/components/esp_gdbstub/src/port/riscv/gdbstub_riscv.c b/components/esp_gdbstub/src/port/riscv/gdbstub_riscv.c index 1fd13ba3e4..2fb05d0b3b 100644 --- a/components/esp_gdbstub/src/port/riscv/gdbstub_riscv.c +++ b/components/esp_gdbstub/src/port/riscv/gdbstub_riscv.c @@ -11,6 +11,7 @@ #include "rv_decode.h" #include "sdkconfig.h" #include "esp_private/crosscore_int.h" +#include "esp_private/freertos_debug.h" extern volatile esp_gdbstub_frame_t *temp_regs_frame; @@ -85,15 +86,7 @@ void esp_gdbstub_int(__attribute__((unused)) void *frame) /* Pointer to saved frame is in pxCurrentTCB * See rtos_int_enter function */ - /* Todo: Provide IDF interface for getting pxCurrentTCB (IDF-8182) */ - int core_id = esp_cpu_get_core_id(); -#if CONFIG_FREERTOS_USE_KERNEL_10_5_1 - extern void **pxCurrentTCBs; - dummy_tcb_t *tcb = (dummy_tcb_t *) &pxCurrentTCBs[core_id]; -#else - extern void **pxCurrentTCB; - dummy_tcb_t *tcb = (dummy_tcb_t *) &pxCurrentTCB[core_id]; -#endif /* CONFIG_FREERTOS_USE_KERNEL_10_5_1 */ + dummy_tcb_t *tcb = (dummy_tcb_t *)pvTaskGetCurrentTCBForCore(esp_cpu_get_core_id()); gdbstub_handle_uart_int((esp_gdbstub_frame_t *)tcb->top_of_stack); } diff --git a/components/freertos/esp_additions/freertos_tasks_c_additions.h b/components/freertos/esp_additions/freertos_tasks_c_additions.h index 35383d52e8..6640ece168 100644 --- a/components/freertos/esp_additions/freertos_tasks_c_additions.h +++ b/components/freertos/esp_additions/freertos_tasks_c_additions.h @@ -1181,6 +1181,26 @@ UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, } /*----------------------------------------------------------*/ +/* ----------------------------------------------------- Misc ----------------------------------------------------- */ + +void * pvTaskGetCurrentTCBForCore( BaseType_t xCoreID ) +{ + void * pvRet; + + configASSERT( ( xCoreID >= 0 ) && ( xCoreID < configNUM_CORES ) ); + #if CONFIG_FREERTOS_USE_KERNEL_10_5_1 + pvRet = ( void * ) pxCurrentTCBs[ xCoreID ]; + #else /* CONFIG_FREERTOS_USE_KERNEL_10_5_1 */ + #if CONFIG_FREERTOS_SMP + /* SMP FreeRTOS defines pxCurrentTCB as a macro function call */ + pvRet = pxCurrentTCB; + #else /* CONFIG_FREERTOS_SMP */ + pvRet = ( void * ) pxCurrentTCB[ xCoreID ]; + #endif /* CONFIG_FREERTOS_SMP */ + #endif /* CONFIG_FREERTOS_USE_KERNEL_10_5_1 */ + return pvRet; +} + /* ----------------------------------------------------- OpenOCD ---------------------------------------------------- */ #if CONFIG_FREERTOS_DEBUG_OCDAWARE diff --git a/components/freertos/esp_additions/include/esp_private/freertos_debug.h b/components/freertos/esp_additions/include/esp_private/freertos_debug.h index 5b05289665..dcf77dddbc 100644 --- a/components/freertos/esp_additions/include/esp_private/freertos_debug.h +++ b/components/freertos/esp_additions/include/esp_private/freertos_debug.h @@ -20,6 +20,8 @@ #endif /* *INDENT-ON* */ +/* -------------------------------------------------- Task Snapshot ------------------------------------------------- */ + /** * @brief Task Snapshot structure * @@ -78,6 +80,18 @@ UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArrayLength, UBaseType_t * const pxTCBSize ); +/* ----------------------------------------------------- Misc ----------------------------------------------------- */ + +/** + * @brief Get a void pointer to the current TCB of a particular core + * + * @note This function provides no guarantee that the return TCB will still be the current task (or that the task still + * exists) when it returns. It is the caller's responsibility to ensure that the task does not get scheduled or deleted. + * @param xCoreID The core to query + * @return Void pointer to current TCB + */ +void * pvTaskGetCurrentTCBForCore( BaseType_t xCoreID ); + /* *INDENT-OFF* */ #ifdef __cplusplus }