Calculate the FreeRTOS type sizes and offsets more adaptively. (#806)

* Calculate the FreeRTOS type sizes and offsets more adaptively.

The definition of TickType_t varies between different targets. And it is also related to configUSE_16_BIT_TICKS option.
Thus introduce a new command to make sure we are using a correct ticktype size.

Change-Id: I9e38b331a9f07b96eb9a2c259e32377fca0106ad
Signed-off-by: Chao Du <duchao@eswincomputing.com>

* redundant semicolon.

Change-Id: Ia21f0537e476099d8fe519ef78b3328d14123a38

* Update after review.

Change-Id: I1825185ec9b0557d7e01f34a8f366661b3734aa7

* update doc

Change-Id: I24b21c88b02ca3d76f1362f2545e86c068fc0ec6

---------

Signed-off-by: Chao Du <duchao@eswincomputing.com>
This commit is contained in:
Chao Du 2023-03-09 08:24:06 +08:00 committed by GitHub
parent cd481a97e9
commit 59e368e308
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 6 deletions

View File

@ -12018,6 +12018,14 @@ contrib/rtos-helpers/FreeRTOS-openocd.c
contrib/rtos-helpers/uCOS-III-openocd.c
@end table
@section RTOS Commands
@cindex RTOS Commands
@deffn {Config Command} {freertos_ticktype_size} (2|4|8)
Pass the size (in bytes) of FreeRTOS TickType_t to OpenOCD. To make sure the
calculation of offsets and sizes is correct. Defaults to 4.
@end deffn
@anchor{usingopenocdsmpwithgdb}
@section Using OpenOCD SMP with GDB
@cindex SMP

View File

@ -59,6 +59,8 @@ struct FreeRTOS {
unsigned ubasetype_size;
/* sizeof(void *) */
unsigned pointer_size;
/* sizeof(TickType_t) */
unsigned ticktype_size;
unsigned list_width;
unsigned list_item_width;
unsigned list_elem_next_offset;
@ -127,6 +129,45 @@ static int nds32_stacking(struct rtos *rtos, const struct rtos_register_stacking
return ERROR_OK;
}
/* take 4 bytes (32 bits) as the default size,
* which is suitable for most 32-bit targets and
* configuration of configUSE_16_BIT_TICKS = 0. */
static unsigned int freertos_ticktype_size = 4;
COMMAND_HANDLER(handle_freertos_ticktype_size)
{
if (CMD_ARGC != 1) {
LOG_ERROR("Command takes exactly 1 parameter");
return ERROR_COMMAND_SYNTAX_ERROR;
}
unsigned int size;
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], size);
switch (size) {
case 2:
case 4:
case 8:
freertos_ticktype_size = size;
break;
default:
LOG_ERROR("Invalid ticktype size. Should be 2, 4 or 8.");
return ERROR_COMMAND_SYNTAX_ERROR;
}
return ERROR_OK;
}
static const struct command_registration freertos_commands[] = {
{
.name = "freertos_ticktype_size",
.handler = handle_freertos_ticktype_size,
.mode = COMMAND_ANY,
.usage = "(2|4|8)",
.help = "Pass the size (in bytes) of TickType_t to OpenOCD. To make sure the "
"calculation of offsets and sizes is correct. Defaults to 4."
},
COMMAND_REGISTRATION_DONE
};
static enum {
STACKING_MAINLINE,
STACKING_METAL
@ -305,13 +346,12 @@ static unsigned populate_offset_size(struct FreeRTOS *freertos,
align = freertos->pointer_size;
break;
case TYPE_TICKTYPE:
/* Could be either 16 or 32 bits, depending on configUSE_16_BIT_TICKS. */
info[i].size = 4;
align = 4;
info[i].size = freertos->ticktype_size;
align = freertos->ticktype_size;
break;
case TYPE_LIST_ITEM:
info[i].size = freertos->list_item_width;
align = MAX(freertos->ubasetype_size, freertos->pointer_size);
align = MAX(freertos->ticktype_size, freertos->pointer_size);
break;
case TYPE_CHAR_ARRAY:
/* size is set by the caller. */
@ -347,11 +387,12 @@ static void freertos_compute_offsets(struct rtos *rtos)
{
struct FreeRTOS *freertos = (struct FreeRTOS *) rtos->rtos_specific_params;
if (freertos->pointer_size != 0)
if (freertos->ticktype_size == freertos_ticktype_size)
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->ticktype_size = freertos_ticktype_size;
/*
* FreeRTOS can be compiled with configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES
@ -915,5 +956,5 @@ static int freertos_create(struct target *target)
return ERROR_FAIL;
}
return ERROR_OK;
return register_commands(target->rtos->cmd_ctx, NULL, freertos_commands);
}