X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Frtos%2FFreeRTOS.c;h=10a9b8c0ead47fa5f99924aae8023b74a25685e3;hb=811f7d3f7eb0a2f40406949e21d7f2ab577d2d46;hp=000741607282f80915f01df3d3d4b648403b6f69;hpb=b69119668ed8d9633280f8b596fe9af60f51644b;p=openocd.git diff --git a/src/rtos/FreeRTOS.c b/src/rtos/FreeRTOS.c index 0007416072..10a9b8c0ea 100644 --- a/src/rtos/FreeRTOS.c +++ b/src/rtos/FreeRTOS.c @@ -73,7 +73,7 @@ const struct FreeRTOS_params FreeRTOS_params_list[] = static int FreeRTOS_detect_rtos( struct target* target ); static int FreeRTOS_create( struct target* target ); static int FreeRTOS_update_threads( struct rtos *rtos ); -static int FreeRTOS_get_thread_reg_list(struct rtos *rtos, long long thread_id, char ** hex_reg_list ); +static int FreeRTOS_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char ** hex_reg_list ); static int FreeRTOS_get_symbol_list_to_lookup(symbol_table_elem_t * symbol_list[]); @@ -102,6 +102,7 @@ enum FreeRTOS_symbol_values FreeRTOS_VAL_xTasksWaitingTermination = 7, FreeRTOS_VAL_xSuspendedTaskList = 8, FreeRTOS_VAL_uxCurrentNumberOfTasks = 9, + FreeRTOS_VAL_uxTopUsedPriority = 10, }; static char* FreeRTOS_symbol_list[] = @@ -116,6 +117,7 @@ static char* FreeRTOS_symbol_list[] = "xTasksWaitingTermination", "xSuspendedTaskList", "uxCurrentNumberOfTasks", + "uxTopUsedPriority", NULL }; @@ -226,15 +228,15 @@ static int FreeRTOS_update_threads( struct rtos *rtos ) } - // Unfortunately, we can't know how many lists there are for pxReadyTasksLists, - // So figure it out via other variables - int num_ready_task_lists = (rtos->symbols[FreeRTOS_VAL_xDelayedTaskList1].address - rtos->symbols[FreeRTOS_VAL_pxReadyTasksLists].address) / param->list_width; + // Find out how many lists are needed to be read from pxReadyTasksLists, + int64_t max_used_priority = 0; + retval = target_read_buffer( rtos->target, rtos->symbols[FreeRTOS_VAL_uxTopUsedPriority].address, param->pointer_width, (uint8_t *)&max_used_priority ); - symbol_address_t* list_of_lists = (symbol_address_t *)malloc( sizeof( symbol_address_t ) * ( num_ready_task_lists + 5 ) ); + symbol_address_t* list_of_lists = (symbol_address_t *)malloc( sizeof( symbol_address_t ) * ( max_used_priority+1 + 5 ) ); int num_lists; - for( num_lists = 0; num_lists < num_ready_task_lists; num_lists++ ) + for( num_lists = 0; num_lists <= max_used_priority; num_lists++ ) { list_of_lists[num_lists] = rtos->symbols[FreeRTOS_VAL_pxReadyTasksLists].address + num_lists * param->list_width; } @@ -242,6 +244,7 @@ static int FreeRTOS_update_threads( struct rtos *rtos ) list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xDelayedTaskList1].address; list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xDelayedTaskList2].address; list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xPendingReadyList].address; + list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xSuspendedTaskList].address; list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xTasksWaitingTermination].address; @@ -253,7 +256,7 @@ static int FreeRTOS_update_threads( struct rtos *rtos ) } // Read the number of threads in this list - long long list_thread_count = 0; + int64_t list_thread_count = 0; retval = target_read_buffer( rtos->target, list_of_lists[i], param->thread_count_width, (uint8_t *)&list_thread_count); if ( retval != ERROR_OK ) { @@ -267,8 +270,8 @@ static int FreeRTOS_update_threads( struct rtos *rtos ) } // Read the location of first list item - unsigned long long prev_list_elem_ptr = -1; - unsigned long long list_elem_ptr = 0; + uint64_t prev_list_elem_ptr = -1; + uint64_t list_elem_ptr = 0; retval = target_read_buffer( rtos->target, list_of_lists[i] + param->list_next_offset, param->pointer_width, (uint8_t *)&list_elem_ptr); if ( retval != ERROR_OK ) { @@ -345,11 +348,11 @@ static int FreeRTOS_update_threads( struct rtos *rtos ) return 0; } -static int FreeRTOS_get_thread_reg_list(struct rtos *rtos, long long thread_id, char ** hex_reg_list ) +static int FreeRTOS_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char ** hex_reg_list ) { int retval; const struct FreeRTOS_params* param; - long long stack_ptr = 0; + int64_t stack_ptr = 0; *hex_reg_list = NULL; @@ -472,10 +475,11 @@ static int FreeRTOS_create( struct target* target ) } if ( i >= FREERTOS_NUM_PARAMS ) { - LOG_OUTPUT("Could not find target in FreeRTOS compatability list\r\n"); + LOG_OUTPUT("Could not find target in FreeRTOS compatibility list\r\n"); return -1; } target->rtos->rtos_specific_params = (void*) &FreeRTOS_params_list[i]; return 0; } +