EmbeddedRelated.com
Forums
The 2024 Embedded Online Conference

LPC 2119 ISR not working

Started by niti...@gmail.com June 22, 2007
Hi
I m using GCC GNUARM version 4 in linux for LPC-2119 processor.The program is getting compiled but the ISR is not getting called.
The program is pretty simple,shown below :

#include"LPC21xx.h"

void init_pll()
{
PLLCFG=0x40;
PLLCON=0x01;
PLLFEED=0xAA;
PLLFEED=0x55;

while(!(PLLSTAT & 0x400))
{}
PLLCON=0x03;
PLLFEED=0xAA;
PLLFEED=0x55;
VPBDIV=0x00000002;
}
void init_pins()
{
PINSEL0=0x00000000;
IODIR0=0xFFFFFFFF;
}
void init_interrupt()
{
VICIntEnable=0x10;
VICIntSelect=0x00;
}

void init_timer0()
{
T0MCR=0x09;
T0MR0P0;
T0PR=0x00;
}
void __attribute__((interrupt ("IRQ"))) Ihandler(void)
{
IOCLR0=0x01;
T0IR=0x02;
VICDefVectAddr = 0;
}
int main()
{
init_pll();
init_pins();
init_timer0();
init_interrupt();
VICDefVectAddr=(unsigned)Ihandler;
T0MR1%0;
IOSET0=0x01;
T0TCR=0x01;
while(T0TC < 500)
{}
T0IR=0x01;
T0TCR=0x02;

}

Please help me fix up the problem.
Thanks.

An Engineer's Guide to the LPC2100 Series

--- In l..., nitinkothari@... wrote:
>
> Hi
> I m using GCC GNUARM version 4 in linux for LPC-2119 processor.The
program is getting compiled but the ISR is not getting called.

**************************SNIP*************************************
> Please help me fix up the problem.
> Thanks.
>
Have you enabled interrupts in your startup assembly language code?

--Dave
@DAVE

Thanks Dave.
I guess yes....I have enabled it.Posting the startup code crt0.S.Please verify it.
Thanks again.

CRT0.S
/*
crt0.S for LPC2xxx
- based on examples from R O Software
- based on examples from newlib-lpc
- based on an example from Anglia Designs

collected and modified by Martin Thomas
*/
.global main
.global _etext // -> .data initial values in ROM
.global _data // -> .data area in RAM
.global _edata // end of .data area
.global __bss_start // -> .bss area in RAM
.global __bss_end__ // end of .bss area
.global _stack // top of stack
.global _start, start, _mainCRTStartup

// Stack Sizes
.set UND_STACK_SIZE, 0x00000004
.set ABT_STACK_SIZE, 0x00000004
.set FIQ_STACK_SIZE, 0x00000004
.set IRQ_STACK_SIZE, 0X00000080
.set SVC_STACK_SIZE, 0x00000004

// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
.set MODE_USR, 0x10 // User Mode
.set MODE_FIQ, 0x11 // FIQ Mode
.set MODE_IRQ, 0x12 // IRQ Mode
.set MODE_SVC, 0x13 // Supervisor Mode
.set MODE_ABT, 0x17 // Abort Mode
.set MODE_UND, 0x1B // Undefined Mode
.set MODE_SYS, 0x1F // System Mode

.equ I_BIT, 0x80 // when I bit is set, IRQ is disabled
.equ F_BIT, 0x40 // when F bit is set, FIQ is disabled

.text
.code 32
.align 2

.func _start

_start:
start:
// Runtime Interrupt Vectors
// -------------------------
Vectors:
ldr pc,_startup // 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
_start: .word _reset
_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

_startup: .word _mainCRTStartup
_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
// Setup the operating mode & stack.
// ---------------------------------
_mainCRTStartup:
// Initialize Interrupt System
// - Set stack location for each mode
// - Leave in System Mode with Interrupts Disabled
// -----------
ldr r0,=_stack
msr CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
mov sp,r0
sub r0,r0,#UND_STACK_SIZE
msr CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
mov sp,r0
sub r0,r0,#ABT_STACK_SIZE
msr CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
mov sp,r0
sub r0,r0,#FIQ_STACK_SIZE
msr CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
mov sp,r0
sub r0,r0,#IRQ_STACK_SIZE
msr CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
mov sp,r0
sub r0,r0,#SVC_STACK_SIZE
msr CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
mov sp,r0

// Copy initialized data to its execution address in RAM
// -----------------
#ifdef ROM_RUN
ldr r1,=_etext // -> ROM data start
ldr r2,=_data // -> data start
ldr r3,=_edata // -> end of data
1: cmp r2,r3 // check if data to move
ldrlo r0,[r1],#4 // copy it
strlo r0,[r2],#4
blo 1b // loop until done
#endif
// Clear .bss
// ----------
mov r0,#0 // get a zero
ldr r1,=__bss_start // -> bss start
ldr r2,=__bss_end__ // -> bss end
2: cmp r1,r2 // check if data to clear
strlo r0,[r1],#4 // clear 4 bytes
blo 2b // loop until done

// Call main program: main(0)
// --------------------------
mov r0,#0 // no arguments (argc = 0)
mov r1,r0
mov r2,r0
mov fp,r0 // null frame pointer
mov r7,r0 // null frame pointer for thumb
ldr r10,=main
mov lr,pc

/* Enter the C code, use BX instruction so as to never return */
/* use BLX (?) main if you want to use c++ destructors below */

bx r10 // enter main()
.size _start, . - _start

.global _reset, reset, exit, abort
.func _reset
_reset:
reset:
exit:
abort:
.size _reset, . - _reset
.endfunc

.end
@DAVE
Thanks dave.
I guess I have enabled it in my crt0.s.
Posting the crt0.s. Please check and verify it.
Thanks.
/*
crt0.S for LPC2xxx
- based on examples from R O Software
- based on examples from newlib-lpc
- based on an example from Anglia Designs

collected and modified by Martin Thomas
*/
.global main
.global _etext // -> .data initial values in ROM
.global _data // -> .data area in RAM
.global _edata // end of .data area
.global __bss_start // -> .bss area in RAM
.global __bss_end__ // end of .bss area
.global _stack // top of stack
.global _start, start, _mainCRTStartup

// Stack Sizes
.set UND_STACK_SIZE, 0x00000004
.set ABT_STACK_SIZE, 0x00000004
.set FIQ_STACK_SIZE, 0x00000004
.set IRQ_STACK_SIZE, 0X00000080
.set SVC_STACK_SIZE, 0x00000004

// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
.set MODE_USR, 0x10 // User Mode
.set MODE_FIQ, 0x11 // FIQ Mode
.set MODE_IRQ, 0x12 // IRQ Mode
.set MODE_SVC, 0x13 // Supervisor Mode
.set MODE_ABT, 0x17 // Abort Mode
.set MODE_UND, 0x1B // Undefined Mode
.set MODE_SYS, 0x1F // System Mode

.equ I_BIT, 0x80 // when I bit is set, IRQ is disabled
.equ F_BIT, 0x40 // when F bit is set, FIQ is disabled

.text
.code 32
.align 2

.func _start

_start:
start:
// Runtime Interrupt Vectors
// -------------------------
Vectors:
ldr pc,_startup // 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
_start: .word _reset
_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

_startup: .word _mainCRTStartup
_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
// Setup the operating mode & stack.
// ---------------------------------
_mainCRTStartup:
// Initialize Interrupt System
// - Set stack location for each mode
// - Leave in System Mode with Interrupts Disabled
// -----------
ldr r0,=_stack
msr CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
mov sp,r0
sub r0,r0,#UND_STACK_SIZE
msr CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
mov sp,r0
sub r0,r0,#ABT_STACK_SIZE
msr CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
mov sp,r0
sub r0,r0,#FIQ_STACK_SIZE
msr CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
mov sp,r0
sub r0,r0,#IRQ_STACK_SIZE
msr CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
mov sp,r0
sub r0,r0,#SVC_STACK_SIZE
msr CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
mov sp,r0

// Copy initialized data to its execution address in RAM
// -----------------
#ifdef ROM_RUN
ldr r1,=_etext // -> ROM data start
ldr r2,=_data // -> data start
ldr r3,=_edata // -> end of data
1: cmp r2,r3 // check if data to move
ldrlo r0,[r1],#4 // copy it
strlo r0,[r2],#4
blo 1b // loop until done
#endif
// Clear .bss
// ----------
mov r0,#0 // get a zero
ldr r1,=__bss_start // -> bss start
ldr r2,=__bss_end__ // -> bss end
2: cmp r1,r2 // check if data to clear
strlo r0,[r1],#4 // clear 4 bytes
blo 2b // loop until done

// Call main program: main(0)
// --------------------------
mov r0,#0 // no arguments (argc = 0)
mov r1,r0
mov r2,r0
mov fp,r0 // null frame pointer
mov r7,r0 // null frame pointer for thumb
ldr r10,=main
mov lr,pc

/* Enter the C code, use BX instruction so as to never return */
/* use BLX (?) main if you want to use c++ destructors below */

bx r10 // enter main()
.size _start, . - _start

.global _reset, reset, exit, abort
.func _reset
_reset:
reset:
exit:
abort:
.size _reset, . - _reset
.endfunc

.end
I'd have thought:

.equ I_BIT, 0x80 // when I bit is set, IRQ is disabled
.equ F_BIT, 0x40 // when F bit is set, FIQ is disabled
...
// - Leave in System Mode with Interrupts Disabled
etc...

should have given you more than a clue?
Kindly try and fix things yourself before simply posting the default startup
files on the forum for us all to do your job for you. If you don't
understand what this file is doing then rather than getting us to fix this
one problem leaving you none the wiser as to what's really going on you
should perhaps read up on it so that you do!

-----Original Message-----
From: l... [mailto:l...]On Behalf Of
n...@gmail.com
Sent: 22 June 2007 13:18
To: l...
Subject: [lpc2000] Re: LPC 2119 ISR not working
@DAVE
Thanks dave.
I guess I have enabled it in my crt0.s.
Posting the crt0.s. Please check and verify it.
Thanks.
/*
crt0.S for LPC2xxx
- based on examples from R O Software
- based on examples from newlib-lpc
- based on an example from Anglia Designs

collected and modified by Martin Thomas
*/
.global main
.global _etext // -> .data initial values in ROM
.global _data // -> .data area in RAM
.global _edata // end of .data area
.global __bss_start // -> .bss area in RAM
.global __bss_end__ // end of .bss area
.global _stack // top of stack
.global _start, start, _mainCRTStartup

// Stack Sizes
.set UND_STACK_SIZE, 0x00000004
.set ABT_STACK_SIZE, 0x00000004
.set FIQ_STACK_SIZE, 0x00000004
.set IRQ_STACK_SIZE, 0X00000080
.set SVC_STACK_SIZE, 0x00000004

// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
.set MODE_USR, 0x10 // User Mode
.set MODE_FIQ, 0x11 // FIQ Mode
.set MODE_IRQ, 0x12 // IRQ Mode
.set MODE_SVC, 0x13 // Supervisor Mode
.set MODE_ABT, 0x17 // Abort Mode
.set MODE_UND, 0x1B // Undefined Mode
.set MODE_SYS, 0x1F // System Mode

.equ I_BIT, 0x80 // when I bit is set, IRQ is disabled
.equ F_BIT, 0x40 // when F bit is set, FIQ is disabled

.text
.code 32
.align 2

.func _start

_start:
start:

// Runtime Interrupt Vectors
// -------------------------
Vectors:
ldr pc,_startup // 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
_start: .word _reset
_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

_startup: .word _mainCRTStartup
_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

// Setup the operating mode & stack.
// ---------------------------------

_mainCRTStartup:

// Initialize Interrupt System
// - Set stack location for each mode
// - Leave in System Mode with Interrupts Disabled
// -----------
ldr r0,=_stack
msr CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
mov sp,r0
sub r0,r0,#UND_STACK_SIZE
msr CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
mov sp,r0
sub r0,r0,#ABT_STACK_SIZE
msr CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
mov sp,r0
sub r0,r0,#FIQ_STACK_SIZE
msr CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
mov sp,r0
sub r0,r0,#IRQ_STACK_SIZE
msr CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
mov sp,r0
sub r0,r0,#SVC_STACK_SIZE
msr CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
mov sp,r0

// Copy initialized data to its execution address in RAM
// -----------------
#ifdef ROM_RUN
ldr r1,=_etext // -> ROM data start
ldr r2,=_data // -> data start
ldr r3,=_edata // -> end of data
1: cmp r2,r3 // check if data to move
ldrlo r0,[r1],#4 // copy it
strlo r0,[r2],#4
blo 1b // loop until done
#endif
// Clear .bss
// ----------
mov r0,#0 // get a zero
ldr r1,=__bss_start // -> bss start
ldr r2,=__bss_end__ // -> bss end
2: cmp r1,r2 // check if data to clear
strlo r0,[r1],#4 // clear 4 bytes
blo 2b // loop until done
// Call main program: main(0)
// --------------------------
mov r0,#0 // no arguments (argc = 0)
mov r1,r0
mov r2,r0
mov fp,r0 // null frame pointer
mov r7,r0 // null frame pointer for thumb
ldr r10,=main
mov lr,pc

/* Enter the C code, use BX instruction so as to never return */
/* use BLX (?) main if you want to use c++ destructors below */

bx r10 // enter main()

.size _start, . - _start
.global _reset, reset, exit, abort
.func _reset
_reset:
reset:
exit:
abort:

.size _reset, . - _reset
.endfunc

.end
--- In l..., nitinkothari@... wrote:
>
> @DAVE
> Thanks dave.
> I guess I have enabled it in my crt0.s.
> Posting the crt0.s. Please check and verify it.
> Thanks.
Your interrupts appear to be disabled, if you posted your actual crt0.s

Even your comments say so:

// Initialize Interrupt System
// - Set stack location for each mode
// - Leave in System Mode with Interrupts Disabled

You need to change the IRQ line to enable the IRQ interrupts, because
the line as shown here disables IRQ interrupts. Just take out the
"|I_BIT" part. This does not guarantee that everything else is
correct, but it will enable ARM's IRQ interrupt.
>>>>>>> msr CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode

--Dave
The comments in your code say to leave the interrupts disabled and
that is exactly what is happening.

Just before the 'bx r10' "branch to main()" you should add something like:

MSR CPSR_c,#MODE_SYS /* enable interrupts */

This will leave you in System Mode with interrupts enabled.

There is a question in my mind about whether you want to start in
System Mode or User Mode. From my code it appears I run in User Mode
and things seem to work ok but, like you, I borrowed the startup file
from someone else and I am beginning to question it. Some of the code
doesn't match the comments and the comments are just plain wrong!

Richard

--- In l..., nitinkothari@... wrote:
>
> @DAVE
> Thanks dave.
> I guess I have enabled it in my crt0.s.
> Posting the crt0.s. Please check and verify it.
> Thanks.
> /*
> crt0.S for LPC2xxx
> - based on examples from R O Software
> - based on examples from newlib-lpc
> - based on an example from Anglia Designs
>
> collected and modified by Martin Thomas
> */
> .global main
> .global _etext // -> .data initial values
in ROM
> .global _data // -> .data area in RAM
> .global _edata // end of .data area
> .global __bss_start // -> .bss area in RAM
> .global __bss_end__ // end of .bss area
> .global _stack // top of stack
> .global _start, start, _mainCRTStartup
>
> // Stack Sizes
> .set UND_STACK_SIZE, 0x00000004
> .set ABT_STACK_SIZE, 0x00000004
> .set FIQ_STACK_SIZE, 0x00000004
> .set IRQ_STACK_SIZE, 0X00000080
> .set SVC_STACK_SIZE, 0x00000004
>
> // Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
> .set MODE_USR, 0x10 // User Mode
> .set MODE_FIQ, 0x11 // FIQ Mode
> .set MODE_IRQ, 0x12 // IRQ Mode
> .set MODE_SVC, 0x13 // Supervisor Mode
> .set MODE_ABT, 0x17 // Abort Mode
> .set MODE_UND, 0x1B // Undefined Mode
> .set MODE_SYS, 0x1F // System Mode
>
> .equ I_BIT, 0x80 // when I bit is set, IRQ is
disabled
> .equ F_BIT, 0x40 // when F bit is set, FIQ is
disabled
>
> .text
> .code 32
> .align 2
>
> .func _start
>
> _start:
> start:
> // Runtime Interrupt Vectors
> // -------------------------
> Vectors:
> ldr pc,_startup // 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
> _start: .word _reset
> _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
>
> _startup: .word _mainCRTStartup
> _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
> // Setup the operating mode & stack.
> // ---------------------------------
> _mainCRTStartup:
> // Initialize Interrupt System
> // - Set stack location for each mode
> // - Leave in System Mode with Interrupts Disabled
> // -----------
> ldr r0,=_stack
> msr CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
> mov sp,r0
> sub r0,r0,#UND_STACK_SIZE
> msr CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
> mov sp,r0
> sub r0,r0,#ABT_STACK_SIZE
> msr CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
> mov sp,r0
> sub r0,r0,#FIQ_STACK_SIZE
> msr CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
> mov sp,r0
> sub r0,r0,#IRQ_STACK_SIZE
> msr CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
> mov sp,r0
> sub r0,r0,#SVC_STACK_SIZE
> msr CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
> mov sp,r0
>
> // Copy initialized data to its execution address in RAM
> // -----------------
> #ifdef ROM_RUN
> ldr r1,=_etext // -> ROM data start
> ldr r2,=_data // -> data start
> ldr r3,=_edata // -> end of data
> 1: cmp r2,r3 // check if data to move
> ldrlo r0,[r1],#4 // copy it
> strlo r0,[r2],#4
> blo 1b // loop until done
> #endif
> // Clear .bss
> // ----------
> mov r0,#0 // get a zero
> ldr r1,=__bss_start // -> bss start
> ldr r2,=__bss_end__ // -> bss end
> 2: cmp r1,r2 // check if data to clear
> strlo r0,[r1],#4 // clear 4 bytes
> blo 2b // loop until done
>
>
> // Call main program: main(0)
> // --------------------------
> mov r0,#0 // no arguments (argc = 0)
> mov r1,r0
> mov r2,r0
> mov fp,r0 // null frame pointer
> mov r7,r0 // null frame pointer for thumb
> ldr r10,=main
> mov lr,pc
>
> /* Enter the C code, use BX instruction so as to never return */
> /* use BLX (?) main if you want to use c++ destructors below */
>
> bx r10 // enter main()
> .size _start, . - _start
>
>
> .global _reset, reset, exit, abort
> .func _reset
> _reset:
> reset:
> exit:
> abort:
> .size _reset, . - _reset
> .endfunc
>
> .end
>
Well guys....thanks for your response.That was really a dumb mistake.I should hav read the crt0.s file first.I know what that file is doin but not completely.
So....as it was suggested by you guys, I changed few things ,but still it didnt work.So again posting the modified crt0.s file.

/*
crt0.S for LPC2xxx
- based on examples from R O Software
- based on examples from newlib-lpc
- based on an example from Anglia Designs

collected and modified by Martin Thomas
*/
.global main
.global _etext // -> .data initial values in ROM
.global _data // -> .data area in RAM
.global _edata // end of .data area
.global __bss_start // -> .bss area in RAM
.global __bss_end__ // end of .bss area
.global _stack // top of stack
.global _start, start, _mainCRTStartup

// Stack Sizes
.set UND_STACK_SIZE, 0x00000004
.set ABT_STACK_SIZE, 0x00000004
.set FIQ_STACK_SIZE, 0x00000004
.set IRQ_STACK_SIZE, 0X00000080
.set SVC_STACK_SIZE, 0x00000004

// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
.set MODE_USR, 0x10 // User Mode
.set MODE_FIQ, 0x11 // FIQ Mode
.set MODE_IRQ, 0x12 // IRQ Mode
.set MODE_SVC, 0x13 // Supervisor Mode
.set MODE_ABT, 0x17 // Abort Mode
.set MODE_UND, 0x1B // Undefined Mode
.set MODE_SYS, 0x1F // System Mode

.equ I_BIT, 0x80 // when I bit is set, IRQ is disabled
.equ F_BIT, 0x00 // when F bit is set, FIQ is disabled

.text
.code 32
.align 2

.func _start

_start:
start:
// Runtime Interrupt Vectors
// -------------------------
Vectors:
ldr pc,_startup // 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
_start: .word _reset
_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

_startup: .word _mainCRTStartup
_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
// Setup the operating mode & stack.
// ---------------------------------
_mainCRTStartup:
// Initialize Interrupt System
// - Set stack location for each mode
// - Leave in System Mode with Interrupts Disabled
// -----------
ldr r0,=_stack
msr CPSR_c,#MODE_UND|I_BIT // Undefined Instruction Mode
mov sp,r0
sub r0,r0,#UND_STACK_SIZE
msr CPSR_c,#MODE_ABT|I_BIT // Abort Mode
mov sp,r0
sub r0,r0,#ABT_STACK_SIZE
msr CPSR_c,#MODE_FIQ|I_BIT // FIQ Mode
mov sp,r0
sub r0,r0,#FIQ_STACK_SIZE
msr CPSR_c,#MODE_IRQ|F_BIT // IRQ Mode
mov sp,r0
sub r0,r0,#IRQ_STACK_SIZE
msr CPSR_c,#MODE_SVC|I_BIT // Supervisor Mode
mov sp,r0
sub r0,r0,#SVC_STACK_SIZE
msr CPSR_c,#MODE_SYS|I_BIT // System Mode
mov sp,r0
msr cpsr_c, #0x1F

// Copy initialized data to its execution address in RAM
// -----------------
#ifdef ROM_RUN
ldr r1,=_etext // -> ROM data start
ldr r2,=_data // -> data start
ldr r3,=_edata // -> end of data
1: cmp r2,r3 // check if data to move
ldrlo r0,[r1],#4 // copy it
strlo r0,[r2],#4
blo 1b // loop until done
#endif
// Clear .bss
// ----------
mov r0,#0 // get a zero
ldr r1,=__bss_start // -> bss start
ldr r2,=__bss_end__ // -> bss end
2: cmp r1,r2 // check if data to clear
strlo r0,[r1],#4 // clear 4 bytes
blo 2b // loop until done

// Call main program: main(0)
// --------------------------
mov r0,#0 // no arguments (argc = 0)
mov r1,r0
mov r2,r0
mov fp,r0 // null frame pointer
mov r7,r0 // null frame pointer for thumb
ldr r10,=main
mov lr,pc

msr CPSR_c,#MODE_SYS // System Mode

/* Enter the C code, use BX instruction so as to never return */
/* use BLX (?) main if you want to use c++ destructors below */

bx r10 // enter main()
.size _start, . - _start

.global _reset, reset, exit, abort
.func _reset
_reset:
reset:
exit:
abort:
.size _reset, . - _reset
.endfunc

.end

I am trying to intialize the FIQ interrupt,for which I hav written
".equ F_BIT, 0x00 "

And i hav also removed the F_BIT.And before entering the main() function ,
I have also made it to enter system mode.
What can b the possible error ?
--- In l..., nitinkothari@... wrote:
>
> I am trying to intialize the FIQ interrupt,for which I hav written
> ".equ F_BIT, 0x00 "
>
> And i hav also removed the F_BIT.And before entering the main()
function ,
> I have also made it to enter system mode.
> What can b the possible error ?
>

1. Your FIQ handler ( __fiq ) does nothing, so you essentially do not
have an FIQ handler. If you want something to happen when you get an
FIQ interrupt, you will need an FIQ handler that does what you want.

2. At only 4 bytes, your FIQ stack is probably too small for a useable
FIQ handler.

3. At 0x80 bytes, your IRQ stack is much bigger than it needs to be,
since you are not using IRQ interrupts. Maybe you should consider
swapping those two stack sizes?

--Dave

The 2024 Embedded Online Conference