Need help in figuring out how to allocate sizes to the array
Gedare Bloom
gedare at rtems.org
Thu Aug 13 16:10:16 UTC 2020
On Thu, Aug 13, 2020 at 9:28 AM Richi Dubey <richidubey at gmail.com> wrote:
>
> Thanks,
>
> But I still can't find the code that links the 'Ready' in this
>
> >> #define RTEMS_SCHEDULER_EDF_SMP( name ) \
> >> static struct { \
> >> Scheduler_EDF_SMP_Context Base; \
This 'Base' will be an instance of the struct
Scheduler_EDF_SMP_Context. In memory, it will look like this:
Scheduler_EDF_SMP_Context Base =
the 0-valued array won't actually take any storage.
> >> Scheduler_EDF_SMP_Ready_queue Ready[ CONFIGURE_MAXIMUM_PROCESSORS
This
> >> + 1 ]; \
>
In memory this structure will look like this:
{ Scheduler_SMP_Context, int64_t, Chain_Control,
Scheduler_EDF_SMP_Ready_queue[CONFIGURE_MAXIMUM_PROCESSORS + 1] }
Because the Scheduler_EDF_SMP_Context type comes first and provides
{ Scheduler_SMP_Context, int64_t, Chain_Control,
Scheduler_EDF_SMP_Ready_queue[0] } where the last element is a 0-value
array so it doesn't actually take up any memory storage, then the
Scheduler_EDF_SMP_Ready_queue Ready[ CONFIGURE_MAXIMUM_PROCESSORS + 1]
overlaps with the Scheduler_EDF_SMP_Ready_queue[0] because the end of
Base aligns with the start of Ready.
This is what I meant by you need to review how C struct layout works.
> to the 'Ready' in scheduleredfsmp.h:
>
> typedef struct {
> Scheduler_SMP_Context Base;
>
> /**
> * @brief Current generation for LIFO (index 0) and FIFO (index 1) ordering.
> */
> int64_t generations[ 2 ];
>
> /**
> * @brief Chain of ready queues with affine threads to determine the highest
> * priority ready thread.
> */
> Chain_Control Affine_queues;
>
> /**
> * @brief A table with ready queues.
> *
> * The index zero queue is used for threads with a one-to-all processor
> * affinity. Index one corresponds to processor index zero, and so on.
> */
> Scheduler_EDF_SMP_Ready_queue Ready[ RTEMS_ZERO_LENGTH_ARRAY ];
> } Scheduler_EDF_SMP_Context;
>
> If I figure this out, everything else would make sense too. Please help me out.
>
> On Thu, Aug 13, 2020 at 8:47 PM Gedare Bloom <gedare at rtems.org> wrote:
>>
>> On Thu, Aug 13, 2020 at 8:34 AM Richi Dubey <richidubey at gmail.com> wrote:
>> >
>> > Thanks,
>> > I am assuming this is the code that allocates space:
>> >
>> >> #define RTEMS_SCHEDULER_EDF_SMP( name ) \
>> >> static struct { \
>> >> Scheduler_EDF_SMP_Context Base; \
>> >> Scheduler_EDF_SMP_Ready_queue Ready[ CONFIGURE_MAXIMUM_PROCESSORS
>> >> + 1 ]; \
>> >> } SCHEDULER_EDF_SMP_CONTEXT_NAME( name )
>> >
>> This is declaring a structure type that will have a particular format
>> of the struct name.
>>
>> >
>> > How do we use or refer to this 'Base'? How do we link this 'Ready' to the 'Ready' inside the EDF_SMP_Context?
>> >
>>
>> This stuff gets set up during confdefs step. Eventually the scheduler
>> contexts are instantiated in the scheduler table.
>>
>> confdefs/scheduler.h:
>> #define CONFIGURE_SCHEDULER RTEMS_SCHEDULER_EDF_SMP( dflt )
>>
>> #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
>> RTEMS_SCHEDULER_TABLE_EDF_SMP( dflt, CONFIGURE_SCHEDULER_NAME )
>> ....
>> const Scheduler_Control _Scheduler_Table[] = {
>> CONFIGURE_SCHEDULER_TABLE_ENTRIES
>> };
>>
>> This is where the space actually gets allocated, based on how
>> CONFIGURE_SCHEDULER_TABLE_ENTRIES gets defined up to here from the CPP
>> macros.
>>
>>
>>
>> > On Thu, Aug 13, 2020 at 6:17 PM Sebastian Huber <sebastian.huber at embedded-brains.de> wrote:
>> > >
>> > > On 13/08/2020 14:42, Richi Dubey wrote:
>> > >
>> > > > I want to use arrays with size _CONFIGURE_MAXIMUM_PROCESSORS. Is it
>> > > > okay if I define the arrays with this size while writing the scheduler
>> > > > strong APA header file? I am asking this because the value of this
>> > > > header gets defined at the time the test case runs while the scheduler
>> > > > gets linked to the test case at the time of linking. So how would it
>> > > > work?
>> > >
>> > > Do NOT use _CONFIGURE_MAXIMUM_PROCESSORS.
>> > >
>> > > In <rtems/scheduler.h> please use something similar to the EDF scheduler
>> > > instantiation:
>> > >
>> > > #ifdef CONFIGURE_SCHEDULER_EDF_SMP
>> > > #include <rtems/score/scheduleredfsmp.h>
>> > >
>> > > #ifndef CONFIGURE_MAXIMUM_PROCESSORS
>> > > #error "CONFIGURE_MAXIMUM_PROCESSORS must be defined to configure
>> > > the EDF SMP scheduler"
>> > > #endif
>> > >
>> > > #define SCHEDULER_EDF_SMP_CONTEXT_NAME( name ) \
>> > > SCHEDULER_CONTEXT_NAME( EDF_SMP_ ## name )
>> > >
>> > > #define RTEMS_SCHEDULER_EDF_SMP( name ) \
>> > > static struct { \
>> > > Scheduler_EDF_SMP_Context Base; \
>> > > Scheduler_EDF_SMP_Ready_queue Ready[ CONFIGURE_MAXIMUM_PROCESSORS
>> > > + 1 ]; \
>> > > } SCHEDULER_EDF_SMP_CONTEXT_NAME( name )
>> > >
>> > > #define RTEMS_SCHEDULER_TABLE_EDF_SMP( name, obj_name ) \
>> > > { \
>> > > &SCHEDULER_EDF_SMP_CONTEXT_NAME( name ).Base.Base.Base, \
>> > > SCHEDULER_EDF_SMP_ENTRY_POINTS, \
>> > > SCHEDULER_EDF_MAXIMUM_PRIORITY, \
>> > > ( obj_name ) \
>> > > SCHEDULER_CONTROL_IS_NON_PREEMPT_MODE_SUPPORTED( false ) \
>> > > }
>> > >
>> > > /* Provided for backward compatibility */
>> > >
>> > > #define RTEMS_SCHEDULER_CONTEXT_EDF_SMP( name, max_cpu_count ) \
>> > > RTEMS_SCHEDULER_EDF_SMP( name )
>> > >
>> > > #define RTEMS_SCHEDULER_CONTROL_EDF_SMP( name, obj_name ) \
>> > > RTEMS_SCHEDULER_TABLE_EDF_SMP( name, obj_name )
>> > > #endif
>> > >
>> > _______________________________________________
>> > devel mailing list
>> > devel at rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list