aboutsummaryrefslogtreecommitdiff
path: root/src/rtos/FreeRTOS.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtos/FreeRTOS.c')
-rw-r--r--src/rtos/FreeRTOS.c132
1 files changed, 72 insertions, 60 deletions
diff --git a/src/rtos/FreeRTOS.c b/src/rtos/FreeRTOS.c
index 6e829b5..215f55d 100644
--- a/src/rtos/FreeRTOS.c
+++ b/src/rtos/FreeRTOS.c
@@ -345,6 +345,74 @@ static unsigned populate_offset_size(struct FreeRTOS *freertos,
return offset;
}
+static void FreeRTOS_compute_offsets(struct rtos *rtos)
+{
+ struct FreeRTOS *freertos = (struct FreeRTOS *) rtos->rtos_specific_params;
+
+ if (freertos->pointer_size != 0)
+ return;
+
+ freertos->pointer_size = DIV_ROUND_UP(target_address_bits(rtos->target), 8);
+ freertos->ubasetype_size = DIV_ROUND_UP(target_data_bits(rtos->target), 8);
+
+ /*
+ * FreeRTOS can be compiled with configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES
+ * in which case extra data is inserted and OpenOCD won't work right.
+ */
+
+ /* struct xLIST */
+ type_offset_size_t struct_list_info[] = {
+ {TYPE_UBASE, 0, 0}, /* uxNumberOfItems */
+ {TYPE_POINTER, 0, 0}, /* ListItem_t *pxIndex */
+ {TYPE_TICKTYPE, 0, 0}, /* xItemValue */
+ {TYPE_POINTER, 0, 0}, /* ListItem_t *pxNext */
+ {TYPE_POINTER, 0, 0}, /* ListItem_t *pxPrevious */
+ };
+
+ /* struct xLIST_ITEM */
+ type_offset_size_t struct_list_item_info[] = {
+ {TYPE_TICKTYPE, 0, 0}, /* xItemValue */
+ {TYPE_POINTER, 0, 0}, /* ListItem_t *pxNext */
+ {TYPE_POINTER, 0, 0}, /* ListItem_t *pxPrevious */
+ {TYPE_POINTER, 0, 0}, /* void *pvOwner */
+ {TYPE_POINTER, 0, 0}, /* List_t *pvContainer */
+ };
+
+ /* struct tskTaskControlBlock */
+ type_offset_size_t task_control_block_info[] = {
+ {TYPE_POINTER, 0, 0}, /* StackType_t *pxTopOfStack */
+ {TYPE_LIST_ITEM, 0, 0}, /* ListItem_t xStateListItem */
+ {TYPE_LIST_ITEM, 0, 0}, /* ListItem_t xEventListItem */
+ {TYPE_UBASE, 0, 0}, /* uxPriority */
+ {TYPE_POINTER, 0, 0}, /* StackType_t *pxStack */
+ /* configMAX_TASK_NAME_LEN varies a lot between targets, but luckily the
+ * name is NULL_terminated and we don't need to read anything else in
+ * the TCB. */
+ {TYPE_CHAR_ARRAY, 0, FREERTOS_THREAD_NAME_STR_SIZE}, /* char pcTaskName[configMAX_TASK_NAME_LEN] */
+ /* Lots of more optional stuff, but is is irrelevant to us. */
+ };
+
+ freertos->list_width = populate_offset_size(
+ freertos, struct_list_info, ARRAY_SIZE(struct_list_info));
+ freertos->list_uxNumberOfItems_offset = struct_list_info[0].offset;
+ freertos->list_uxNumberOfItems_size = struct_list_info[0].size;
+ freertos->list_next_offset = struct_list_info[3].offset;
+ freertos->list_next_size = struct_list_info[3].size;
+
+ freertos->list_item_width = populate_offset_size(
+ freertos, struct_list_item_info, ARRAY_SIZE(struct_list_item_info));
+ freertos->list_elem_next_offset = struct_list_item_info[1].offset;
+ freertos->list_elem_next_size = struct_list_item_info[1].size;
+ freertos->list_elem_content_offset = struct_list_item_info[3].offset;
+ freertos->list_elem_content_size = struct_list_item_info[3].size;
+
+ populate_offset_size(
+ freertos, task_control_block_info, ARRAY_SIZE(task_control_block_info));
+ freertos->thread_stack_offset = task_control_block_info[0].offset;
+ freertos->thread_stack_size = task_control_block_info[0].size;
+ freertos->thread_name_offset = task_control_block_info[5].offset;
+}
+
static int FreeRTOS_update_threads(struct rtos *rtos)
{
int retval;
@@ -353,6 +421,8 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
if (rtos->rtos_specific_params == NULL)
return ERROR_FAIL;
+ FreeRTOS_compute_offsets(rtos);
+
struct FreeRTOS *freertos = (struct FreeRTOS *) rtos->rtos_specific_params;
if (rtos->symbols == NULL) {
@@ -638,6 +708,8 @@ static int FreeRTOS_get_stacking_info(struct rtos *rtos, threadid_t thread_id,
return ERROR_FAIL;
}
+ FreeRTOS_compute_offsets(rtos);
+
struct FreeRTOS *freertos = (struct FreeRTOS *) rtos->rtos_specific_params;
const struct FreeRTOS_params *param = freertos->param;
@@ -847,65 +919,5 @@ static int FreeRTOS_create(struct target *target)
return ERROR_FAIL;
}
- freertos->pointer_size = DIV_ROUND_UP(target_address_bits(target), 8);
- freertos->ubasetype_size = DIV_ROUND_UP(target_data_bits(target), 8);
-
- /*
- * FreeRTOS can be compiled with configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES
- * in which case extra data is inserted and OpenOCD won't work right.
- */
-
- /* struct xLIST */
- type_offset_size_t struct_list_info[] = {
- {TYPE_UBASE, 0, 0}, /* uxNumberOfItems */
- {TYPE_POINTER, 0, 0}, /* ListItem_t *pxIndex */
- {TYPE_TICKTYPE, 0, 0}, /* xItemValue */
- {TYPE_POINTER, 0, 0}, /* ListItem_t *pxNext */
- {TYPE_POINTER, 0, 0}, /* ListItem_t *pxPrevious */
- };
-
- /* struct xLIST_ITEM */
- type_offset_size_t struct_list_item_info[] = {
- {TYPE_TICKTYPE, 0, 0}, /* xItemValue */
- {TYPE_POINTER, 0, 0}, /* ListItem_t *pxNext */
- {TYPE_POINTER, 0, 0}, /* ListItem_t *pxPrevious */
- {TYPE_POINTER, 0, 0}, /* void *pvOwner */
- {TYPE_POINTER, 0, 0}, /* List_t *pvContainer */
- };
-
- /* struct tskTaskControlBlock */
- type_offset_size_t task_control_block_info[] = {
- {TYPE_POINTER, 0, 0}, /* StackType_t *pxTopOfStack */
- {TYPE_LIST_ITEM, 0, 0}, /* ListItem_t xStateListItem */
- {TYPE_LIST_ITEM, 0, 0}, /* ListItem_t xEventListItem */
- {TYPE_UBASE, 0, 0}, /* uxPriority */
- {TYPE_POINTER, 0, 0}, /* StackType_t *pxStack */
- /* configMAX_TASK_NAME_LEN varies a lot between targets, but luckily the
- * name is NULL_terminated and we don't need to read anything else in
- * the TCB. */
- {TYPE_CHAR_ARRAY, 0, FREERTOS_THREAD_NAME_STR_SIZE}, /* char pcTaskName[configMAX_TASK_NAME_LEN] */
- /* Lots of more optional stuff, but is is irrelevant to us. */
- };
-
- freertos->list_width = populate_offset_size(
- freertos, struct_list_info, ARRAY_SIZE(struct_list_info));
- freertos->list_uxNumberOfItems_offset = struct_list_info[0].offset;
- freertos->list_uxNumberOfItems_size = struct_list_info[0].size;
- freertos->list_next_offset = struct_list_info[3].offset;
- freertos->list_next_size = struct_list_info[3].size;
-
- freertos->list_item_width = populate_offset_size(
- freertos, struct_list_item_info, ARRAY_SIZE(struct_list_item_info));
- freertos->list_elem_next_offset = struct_list_item_info[1].offset;
- freertos->list_elem_next_size = struct_list_item_info[1].size;
- freertos->list_elem_content_offset = struct_list_item_info[3].offset;
- freertos->list_elem_content_size = struct_list_item_info[3].size;
-
- populate_offset_size(
- freertos, task_control_block_info, ARRAY_SIZE(task_control_block_info));
- freertos->thread_stack_offset = task_control_block_info[0].offset;
- freertos->thread_stack_size = task_control_block_info[0].size;
- freertos->thread_name_offset = task_control_block_info[5].offset;
-
return 0;
}