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[]);
FreeRTOS_VAL_xTasksWaitingTermination = 7,
FreeRTOS_VAL_xSuspendedTaskList = 8,
FreeRTOS_VAL_uxCurrentNumberOfTasks = 9,
+ FreeRTOS_VAL_uxTopUsedPriority = 10,
};
static char* FreeRTOS_symbol_list[] =
"xTasksWaitingTermination",
"xSuspendedTaskList",
"uxCurrentNumberOfTasks",
+ "uxTopUsedPriority",
NULL
};
}
- // 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;
}
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;
}
// 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 )
{
}
// 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 )
{
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;
}
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;
}
+