Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: For C Experts

2006-03-30 by dsidlauskas1

Brendan,

The information to the compiler is in the line:

 ip = (int *)&buf[i];

Where it should be clear that the pointer is to an unaligned int.

Dave S.

--- In lpc2000@yahoogroups.com, "brendanmurphy37" <brendan.murphy@...>
wrote:
>
> 
> When you say "I believe that the compiler has enough information to 
> use byte aligned transfers", are you refering to the line:
> 
> x[4] = *ip
> 
> If so, why do you expect byte transfers? You're copying from one 
> integer sized object to another. What happened before this line is 
> irrelevant (in particular the fact that you've forced the "ip" 
> pointer to have a badly alligned value).
> 
> Or am I misunderstanding what you're asking?
> 
> Brendan
> 
> --- In lpc2000@yahoogroups.com, "dsidlauskas1" <dsidlauskas@> 
> wrote:
> >
> > Consider the following code:
> > 
> > ============================
> > char buf[]={1,2,3,4,5,6,7,8};
> > int *ip, x[4];
> > 
> > for (i=0; i<4; i++)
> >     {
> >     ip = (int *)&buf[i];
> >     x[4]  = *ip;
> >     }
> > =============================
> > The Keil compiler compiles this without warning, but does not 
> produce
> > the expected (for me) result in x. The problem is that Keil uses the
> > LDR instruction to effect the transfer and this is valid only on 4
> > byte boundaries.
> > 
> > GCC compiles but does give a non-aligned access warning.
> > 
> > I believe that the compiler has enough information to use byte 
> aligned
> > transfers, and should, or at least give a warning.
> > 
> > Anybody want to weigh in on this one.
> > 
> > Thanks in advance for your comments.
> > 
> > Dave Sidlauskas
> >
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.