Linker Problem lpc2138

Guest #1172520
Rate this post
• ▲ useful
▼ not useful
Hello,
I use the WinIDEA software and make a new projekt with the
lpc2138_uart0_irq projektfiles. I use the external make
\winarm\utils\bin\make.exe from the WinARM download files.
Now the Problem:
the linker doesn' t work in a correct way.
The funktions do not have the right adresses.
Where mußt I serge the problem? In the crt0.S, LPC2138-ROM.ld or in the
makefile?
Is it a problem of the linker?
Or is it a problem of the address room in the crt0.s file?

Thanks for your answers.
Moderator #1172521
Rate this post
• ▲ useful
▼ not useful
Sebastian wrote:
> Hello,
> I use the WinIDEA software and make a new projekt with the
> lpc2138_uart0_irq projektfiles. I use the external make
> \winarm\utils\bin\make.exe from the WinARM download files.

I have never used this IDE so I can only provide some hints.  I suggest
to ask the iSystems support.

> Now the Problem:
> the linker doesn' t work in a correct way.
> The funktions do not have the right adresses.
> Where mußt I serge the problem? In the crt0.S, LPC2138-ROM.ld or in the
> makefile?
> Is it a problem of the linker?
> Or is it a problem of the address room in the crt0.s file?

Can you build the project correctly from the command-line? Are you sure
the the correct makefile is used? Is there any output of the build
process shown? Which toolchain is used?
Guest #1172522
Rate this post
• ▲ useful
▼ not useful
Hi,
if I programm the code with your ISP Files it works great.
If I program your code in the IDEA with the external makefile it works
great too.( I do not wrote it before, sorry)
But if I modify the code and Init timer2 and start a Interrupt service
routine, the programm does not work any longer. I mean the problem is by
activating the ISR.
Now I think the problem is anyway in the crt0.s file.
The programm stopped in the last 6 lines in this part of the code:
(undefined, data abort, programm abort)

// Runtime Interrupt Vectors
// -------------------------
Vectors:
        b     _start                    // reset - _start
        ldr   pc,_undf                  // undefined - _undf
        ldr   pc,_swi                   // SWI - _swi
        ldr   pc,_pabt                  // program abort - _pabt
        ldr   pc,_dabt                  // data abort - _dabt
        nop                             // reserved
        ldr   pc,[pc,#-0xFF0]           // IRQ - read the VIC
        ldr   pc,_fiq                   // FIQ - _fiq

#if 0
// Use this group for production
_undf:  .word _reset                    // undefined - _reset
_swi:   .word _reset                    // SWI - _reset
_pabt:  .word _reset                    // program abort - _reset
_dabt:  .word _reset                    // data abort - _reset
_irq:   .word _reset                    // IRQ - _reset
_fiq:   .word _reset                    // FIQ - _reset

#else
// Use this group for development
_undf:  .word __undf                    // undefined
_swi:   .word __swi                     // SWI
_pabt:  .word __pabt                    // program abort
_dabt:  .word __dabt                    // data abort
_irq:   .word __irq                     // IRQ
_fiq:   .word __fiq                     // FIQ

__undf: b     .                         // undefined
__swi:  b     .                         // SWI
__pabt: b     .                         // program abort
__dabt: b     .                         // data abort
__irq:  b     .                         // IRQ
__fiq:  b     .                         // FIQ
#endif
        .size _boot, . - _boot
        .endfunc

What could it be?
Thanks a lot and a nice weekend.
Sebastian
Moderator #1172523
Rate this post
• ▲ useful
▼ not useful
Sebastian wrote:
> if I programm the code with your ISP Files it works great.
> If I program your code in the IDEA with the external makefile it works
> great too.( I do not wrote it before, sorry)
> But if I modify the code and Init timer2 and start a Interrupt service
> routine, the programm does not work any longer. I mean the problem is by
> activating the ISR.

In the default setup of the mentioned example UART0 is used in
"interrupt-mode". So if the UART ist working as expected the interrupt
setup in "core-level" should be correct.

I expect the problem is caused by your modifications and additional
functions (timer-init, timer-ISR). Difficult to help without looking at
your code. Make sure to follow the scheme of creating an ISR with
"exit/entry"-macros and "nacked"-attribut since this is the method used
in this example (see uartISR.h/.c armVIC.h/.c).

> Now I think the problem is anyway in the crt0.s file.

I don't think so but more information on you modifications is needed
first.

> The programm stopped in the last 6 lines in this part of the code:
> (undefined, data abort, programm abort)

In which of the "endless loops"?

>...

Martin Thomas
Guest #1172524
Rate this post
• ▲ useful
▼ not useful
Hello Martin Thomas,
hier der Code für den Timer:

// Setup für Timer1 Initialisierung
void Setup_Timer1(void)
   {
     T1IR = 0x000000FF;      // Interrupt Register
     T1TCR = 0x00000011;     // Timer Control Register
     T1TCR = 0x00000001;
     T1CTCR = 0x00000000;    // Count Control Register
     T1PR = 0x0000000E;      //Timer1 prescale   0x00000800 origin
     T1MR0 = 0x03E8;         //Timer1 match Reg 0
     T1MCR = 0x00000003;     //Reset and interrupt match
     T1EMR &= 0x00000000;
   }


// Setup für Timer Interrupts
void Setup_Timer1_Int(void)
   {
     VICSoftIntClear  = 0x00000020;
     VICSoftIntClear  = 0x00000000;

     VICIntSelect &= ~VIC_BIT(VIC_TIMER1);       // IRQ to timer1
     VICIntEnable = VIC_BIT(VIC_TIMER1);         //Timer0 interrupt
enable
     VICVectCntl3 = VIC_ENABLE | VIC_TIMER1;     //Interrupt source
5(Timer1)
     VICVectAddr3 = (unsigned)Int_Irq_Timer1;    // Address of the ISR
   }


and here the ISR:

 // Timer Interrupt Funktion
 void Int_Irq_Timer1(void)
   {

    ISR_ENTRY();   // armVIC.c

     T1IR = 0xFF;
     T1IR = 0;
     toggle++;

     time_counter++;        // interrupt counter

     VICVectAddr = 0x00000000;   //reset VIC
     ISR_EXIT();   // armVIC.c       // recover registers and return

   }

this Code is from an example from winIDEA. there it works without a
problem.
I didn't touch your code in any way.

>> The programm stopped in the last 6 lines in this part of the code:
>> (undefined, data abort, programm abort)
>
> In which of the "endless loops"?

The loop is:
__dabt: b     .     // data abort

I hope you can help me now.
Guest #1172525
Rate this post
• ▲ useful
▼ not useful
Hello,
I looked again and the programm stopped in several endless loops:

 In which of the "endless loops"?

 The loop is:
 __dabt: b     .     // data abort
 __undf: b     .      // undefined
__pabt: b     .      // program abort

MfG
Sebastian
Guest #1172527
Rate this post
• ▲ useful
▼ not useful
Hello Martin Thomas,

thanks for your help, now it works.

what a little mistake.....

Sebastian

Thanks a lot!!!!

Martin Thomas wrote:
> add the "naked" function-attribute and give it a try:
>
> void Int_Irq_Timer1(void) __attribute__((naked));
> void Int_Irq_Timer1(void)
> {
>   ...

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.