This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: Re: Problem with CYG_HAL_TABLES
- From: Sergei Gavrikov <sergei dot gavrikov at gmail dot com>
- To: Jay Foster <jay at systech dot com>
- Cc: ecos-discuss <ecos-discuss at ecos dot sourceware dot org>
- Date: Tue, 25 Jan 2011 16:02:32 +0200 (EET)
- Subject: Re: [ECOS] Re: Problem with CYG_HAL_TABLES
- References: <4D387142.1030500@systech.com> <4D387525.5050709@systech.com>
Hi Jay,
On Thu, 20 Jan 2011, Jay Foster wrote:
> Looking at the definition of CYG_HAL_TABLE_TYPE and
> CYG_HAL_TABLE_BEGIN, I see that the CYG_HAL_TABLE_BEGIN uses an
> alignment of CYGARC_P2ALIGNMENT and the CYG_HAL_TABLE_TYPE uses an
> alignment of CYGARC_ALIGNMENT.
>
> For the ARM architecture, these are defined to be different
> (CYGARC_P2ALIGNMENT is 2 and CYGARC_ALIGNMENT is 4). This would
> result in the table label being 4 byte aligned and the elements 16
> byte aligned.
It seemed for me "P2" stands for "power of 2", so 2^2 == 4 and that is
okay ~ http://sourceware.org/binutils/docs/as/P2align.html
For example for i386 architecture they defined
# define CYGARC_ALIGNMENT 32
# define CYGARC_P2ALIGNMENT 5
i.e. 2^5 == 32
> The question is why has this not caused me problems before this?
Jay, I tried your example 'as is' for a few ARM targets (LE/BE) (well I
could only guess what MY_TYPE is) and couldn't reproduce such a miss-
alignment for _MY_LABEL_.
I just use GDB to test your example for ARM targets
## .gdbinit --
set output-radix 16
target sim
print &(_MY_LABEL_)
print &(my_instance1)
detach
quit
This did print always the same addresses. Hm, puzzle. Just a guess, may
be you use some -falign-* GCC option? However, TAB macros written in
asm. And how did you declare the labels? Hope, that is something like
extern MY_TYPE _MY_LABEL_[],
_MY_LABEL_END_;
Is it possible to reproduce the issue if you will provide more
information?
Sergei
> On 1/20/2011 9:30 AM, Jay Foster wrote:
> > I have used the CYG_HAL_TABLE mechanism before with success, but I am now
> > running into an alignment problem with a new application. This is on an ARM
> > architecture.
> >
> > I have an object defined as:
> >
> > typedef struct
> > {
> > ....
> > } CYG_HAL_TABLE_TYPE MY_TYPE;
> >
> > I then declare the HAL table array as:
> >
> > CYG_HAL_TABLE_BEGIN( _MY_LABEL_, _my_name_ );
> > CYG_HAL_TABLE_END( _MY_LABEL_END_, _my_name_ );
> >
> > I then place two instances of the object into the HAL table array:
> >
> > MY_TYPE my_instance1 CYG_HAL_TABLE_QUALIFIED_ENTRY(_my_name_, 2) =
> > {
> > ....
> > };
> >
> > MY_TYPE my_instance2 CYG_HAL_TABLE_QUALIFIED_ENTRY(_my_name_, 3) =
> > {
> > ....
> > };
> >
> > I then iterate the table using:
> >
> > MY_TYPE *p;
> >
> > for (p=&(_MY_LABEL_[0]); p!=&(_MY_LABEL_END_); p++)
> > {
> > }
> >
> > This fails due to alignment issues:
> >
> > The _MY_LABEL_ is not at the same address as the first element in the
> > array (my_instance1) due to alignment issues. The iteration then fails.
> > _MY_LABEL_ is aligned on a 4 byte boundary and the array elements are
> > aligned on 16 byte boundaries. Is there any way to make this work?
> >
> > Jay
> >
>
> --
> Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
> and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
>
>
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss