[PATCH v4 2/5] rtems: Add rtems_task_create_from_config()
Sebastian Huber
sebastian.huber at embedded-brains.de
Sun Sep 13 08:41:06 UTC 2020
On 12/09/2020 02:53, Chris Johns wrote:
> On 12/9/20 1:34 am, Sebastian Huber wrote:
>> + * @par Notes
>> + * By default, the calculation for the required memory in the RTEMS Workspace
>> + * for tasks assumes that all Classic API Tasks are created by
>> + * rtems_task_create(). This configuration option can be used to reduce the
>> + * required memory for the system-provided task storage areas since tasks
>> + * created by rtems_task_create_from_config() use a user-provided task storage
>> + * area.
>> + */
>> +#define CONFIGURE_TASKS_CREATED_FROM_CONFIG
> The documentation does not deal with 0 the default. It is fair to assume a
> config that controls allocations for an API is consistent with similar calls. It
> I set message queues to 0 any create call fails. I needed to check the patch to
> know if 0 meant you could not create any tasks from a config.
>
> If CONFIGURE_TASKS_CREATED_FROM_CONFIG was added to the configuration table
> (which I am ok with) the rtems_task_create_from_config() could check for a
> non-zero value before proceeding.
The tasks created by rtems_task_create_from_config() are normal Classic
API tasks. The only difference is that the thread storage is provided by
the user. If you get the configuration wrong, you just have a wrong
workspace size. There are lots of other ways to get a wrong workspace
size. I am not sure if we really should add extra code just to check
this option and produce more run-time errors.
>
>> +#ifndef CONFIGURE_TASKS_CREATED_FROM_CONFIG
>> + #define CONFIGURE_TASKS_CREATED_FROM_CONFIG 0
>> +#endif
>> +
>> +#if CONFIGURE_TASKS_CREATED_FROM_CONFIG > CONFIGURE_MAXIMUM_TASKS
>> + #error "CONFIGURE_TASKS_CREATED_FROM_CONFIG shall be less than or equal to CONFIGURE_MAXIMUM_TASKS"
>> +#endif
>> +
>> #ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
>> #define CONFIGURE_MAXIMUM_POSIX_THREADS 0
>> #endif
>> diff --git a/cpukit/include/rtems/confdefs/wkspace.h b/cpukit/include/rtems/confdefs/wkspace.h
>> index de476dbf82..215cdcb141 100644
>> --- a/cpukit/include/rtems/confdefs/wkspace.h
>> +++ b/cpukit/include/rtems/confdefs/wkspace.h
>> @@ -100,7 +100,9 @@
>> + _CONFIGURE_POSIX_INIT_THREAD_STACK_EXTRA \
>> + _CONFIGURE_LIBBLOCK_TASKS_STACK_EXTRA \
>> + CONFIGURE_EXTRA_TASK_STACKS \
>> - + rtems_resource_maximum_per_allocation( _CONFIGURE_TASKS ) \
>> + + rtems_resource_maximum_per_allocation( \
>> + _CONFIGURE_TASKS - CONFIGURE_TASKS_CREATED_FROM_CONFIG \
> I am confused by this. Does _CONFIGURE_TASKS have the number of tasks created
> from config included in it? How was that added in?
>
> I would have assumed I set CONFIGURE_TASKS_CREATED_FROM_CONFIG and that would be
> added _CONFIGURE_TASKS internally.
>
> Sorry, I think I am not understanding something.
My proposal is to configure the maximum Classic API tasks as usual:
#define CONFIGURE_MAXIMUM_TASKS 123
Then also define how many are created by rtems_task_create_from_config():
#define CONFIGURE_TASKS_CREATED_FROM_CONFIG 42
An alternative could be to do something like this:
#define CONFIGURE_MAXIMUM_TASKS 81
#define CONFIGURE_MAXIMUM_TASKS_CREATED_FROM_CONFIG 42
However, this has some issues:
1. What happens if you use the unlimited option for both?
2. You need extra code to enforce the individual maximum values.
3. It suggests that the tasks belong to different APIs or object
classes. This is not the case.
More information about the devel
mailing list