Yahoo Groups archive

Lpc2000

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

Message

Re: Non-aligned access?

2006-01-21 by Guillermo Prandi

Gary, I wonder if you could solve your problem. I am facing the same 
problem here too. :(

Guille

--- In lpc2000@yahoogroups.com, "ee_gary" <ee_gary@y...> wrote:
>
> Definitely seems interrupt related... When I disable the timer
> interrupt, the interrupt driven spi works great.  When I disable the
> spi interrupt, the interrupt driven timer works great.  When both 
are
> enabled, I get about 10 seconds of run time and then the program 
runs
>  off into the bushes.  I'm using Keil w/ GCC, ARM-mode.  What's
> special about having two interrupts active that might cause this?
> 
> Thanks,
> 
> Gary
> 
> --- In lpc2000@yahoogroups.com, Tom Walsh <tom@o...> wrote:
> >
> > Charles Manning wrote:
> > 
> > >On Wednesday 09 November 2005 11:13, Guillermo Prandi wrote:
> > >  
> > >
> > >>Just an idea: perhaps interrupt routines are not 
saving/restoring all
> > >>the registers correctly?
> > >>    
> > >>
> > >
> > >That would be my first though too.
> > >
> > >Either that or a stack corruption causing the register to be 
nuked,
> but that 
> > >would probably be less likely.
> > >
> > >Is 40000241H within the RAM address space? If not, what does it
> correspond to?
> > >
> > >If you can figure out how R1 got to have this value you're well 
on
> your way to 
> > >solving the problem.
> > >
> > >
> > >
> > >  
> > >
> > 
> > I had that, I grapped some project source of an example program 
and
> used 
> > that as the foundation for my project. I got bit by 
an "__attribute__ 
> > ((naked))" definition of an ISR handler.
> > 
> > TomW
> > 
> > >  
> > >
> > >>Guille
> > >>
> > >>--- In lpc2000@yahoogroups.com, "ee_gary" <ee_gary@y...> wrote:
> > >>    
> > >>
> > >>>--- In lpc2000@yahoogroups.com, Charles Manning 
<manningc2@a...>
> > >>>      
> > >>>
> > >>wrote:
> > >>    
> > >>
> > >>>>On Tuesday 08 November 2005 14:40, Tom Walsh wrote:
> > >>>>        
> > >>>>
> > >>>>>ee_gary wrote:
> > >>>>>          
> > >>>>>
> > >>>>>>Hello,
> > >>>>>>
> > >>>>>>I'm having a problem where my code goes into the bushes 
after
> > >>>>>>            
> > >>>>>>
> > >>~10
> > >>
> > >>    
> > >>
> > >>>>>>seconds.  Running it in the simulator results in a "Non-
aligned
> > >>>>>>Access" error, ARM Instruction at 00000200H, Memory Access 
at
> > >>>>>>40000241H.  Any idea what that means?  Simple code, just an
> > >>>>>>            
> > >>>>>>
> > >>interrupt
> > >>
> > >>    
> > >>
> > >>>>>>driven timer and interrupt driven SPIĀ…
> > >>>>>>            
> > >>>>>>
> > >>>>What instruction was this accessing?
> > >>>>        
> > >>>>
> > >>>The instruction at 200H was:
> > >>>LDR R3,[R1]
> > >>>
> > >>>It was part of this function:
> > >>>void wait (void)  {
> > >>>  unsigned long i;
> > >>>
> > >>>  i = timeval;
> > >>>  while ((i + 10) != timeval);
> > >>>}
> > >>>
> > >>>where 'timeval' is incremented by an ISR.
> > >>>
> > >>>      
> > >>>
> > >>>>The following things can give you non-aligned accesses:
> > >>>>
> > >>>>1) Trying to read a U32 on a non-4-byte boundary or a U16 on a
> > >>>>        
> > >>>>
> > >>>non-2byte
> > >>>
> > >>>      
> > >>>
> > >>>>boundary. This might raise a data abort.
> > >>>>
> > >>>>2) Trying to execute an ARM instruction at a non-4-byte 
location
> > >>>>        
> > >>>>
> > >>or
> > >>
> > >>    
> > >>
> > >>>a thumb
> > >>>
> > >>>      
> > >>>
> > >>>>instruction at a non-2-byte location. This might raise a 
prefetch
> > >>>>        
> > >>>>
> > >>abort.
> > >>
> > >>    
> > >>
> > >>>>>You can run into this when mixing Thumb with ARM code. When
> > >>>>>          
> > >>>>>
> > >>interrupt
> > >>
> > >>    
> > >>
> > >>>>>routines are entered, the processor is in ARM mode, either
> > >>>>>          
> > >>>>>
> > >>write your
> > >>
> > >>    
> > >>
> > >>>>>handlers in ARM or switch to THUMB mode, process the 
interrupt,
> > >>>>>          
> > >>>>>
> > >>then
> > >>
> > >>    
> > >>
> > >>>>>exit THUMB mode and return from interrupt.
> > >>>>>          
> > >>>>>
> > >>>>Yes, this is possible since thumb addresses are marked by 
setting
> > >>>>        
> > >>>>
> > >>>the least
> > >>>
> > >>>      
> > >>>
> > >>>>significant bit.  If you try executing the address by using a
> > >>>>        
> > >>>>
> > >>>regular branch
> > >>>
> > >>>      
> > >>>
> > >>>>or bl then this will break. You need to use a bx.
> > >>>>
> > >>>>        
> > >>>>
> > >>>>>FWIW, Thumb, and thumb-internetworking, is too much trouble 
to
> > >>>>>          
> > >>>>>
> > >>deal
> > >>
> > >>    
> > >>
> > >>>>>with, I run strictly ARM mode.
> > >>>>>          
> > >>>>>
> > >>>>To each their own, but I strongly disagree. I use thumb and
> > >>>>        
> > >>>>
> > >>>interworking a
> > >>>
> > >>>      
> > >>>
> > >>>>lot. gcc support for this is great.
> > >>>>
> > >>>>I always write all my assembly with interworking (ie using bx)
> > >>>>        
> > >>>>
> > >>>regardless.
> > >>>
> > >>>I'm using all ARM code, with the interworking option enabled 
in the
> > >>>compiler/linker.
> > >>>
> > >>>      
> > >>>
> > >>>>For an example you might look at the example stuff I posted 
on the
> > >>>>        
> > >>>>
> > >>>AT91SAM7
> > >>>
> > >>>      
> > >>>
> > >>>>group.
> > >>>>        
> > >>>>
> > >>
> > >>Yahoo! Groups Links
> > >>
> > >>
> > >>
> > >>    
> > >>
> > >
> > >
> > >
> > > 
> > >Yahoo! Groups Links
> > >
> > >
> > >
> > > 
> > >
> > >
> > >  
> > >
> > 
> > 
> > -- 
> > Tom Walsh - WN3L - Embedded Systems Consultant
> > http://openhardware.net, http://cyberiansoftware.com
> > "Windows? No thanks, I have work to do..."
> > ----------------------------------------------------
> >
>

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.