View detail for AT91 Assembler Code Startup Sequence for C Code Applications Software

AT91 Assembler Code Startup Sequence for C
Code Applications Software
Introduction
For reasons of modularity and portability most application code for the AT91 ARMbased microcontrollers is written in C. However, the startup sequence required to initialize the ARM processor and certain key peripherals is heavily dependent on the
register architecture and memory mapping processor, and the memory remap operation. For this reason the C startup sequence is written in assembler.
This Application Note describes an example of the AT91 C startup sequence. It is
based on the C startup sequence for the AT91 Evaluation Board working with the
ARM ADS V1.1 Development Tools. Further examples of C startup sequences are
available in the AT91 Library. The C startup sequence is activated on power-up and
after a reset.
AT91
ARM® Thumb®
Microcontrollers
Application
Note
Rev. 2644A–ATARM–06/02
1
C-Startup Sequence
A major consideration in the design of an embedded ARM application is the layout of the
memory map, in particular the memory that is situated at address 0x0. Following reset,
the processor starts to fetch instructions from 0x0, therefore there must be some executable code accessible from that address. In an embedded system, this requires NVM to
be present, at least initially, at address 0x0.
The simplest layout is accomplished by locating the application in ROM at address 0 in
the memory map. The application can then branch to the real entry point when it executes its first instruction at the reset vector at address 0x0. But, there are disadvantages
with this layout. ROM is typically narrow (8 or 16 bits) and slow compared to RAM,
requiring more wait states to access it. This slows down the handling of processor
exceptions, especially interrupts, through the vector table. Moreover, if the vector table
is in ROM, it cannot be modified by the code.
Since RAM is normally faster and wider than ROM, it is better for the vector table and
interrupt handlers if the memory at 0x0 is RAM. Although It is necessary that RAM be
located at 0x0 during normal execution, if RAM is located at address 0x0 on power-up,
there is not a valid instruction in the reset vector entry. Therefore, ROM must be located
at 0x0 at power-up to assure that there is a valid reset vector. The changeover from
reset to the normal memory map is normally accomplished by performing the remap
command.
Many applications written for ARM-based systems are embedded applications that are
contained in ROM and execute on reset. There are a number of factors that must be
considered when writing embedded operating systems, or embedded applications that
execute from reset without an operating system, including:
•
Remapping ROM to RAM, to improve execution speed.
•
Initializing the execution environment, such as exception vectors, stacks, I/Os.
•
Initializing the application.
–
•
For example, copying initialization values for initialized variables from ROM
to RAM and resetting all other variables to zero.
Linking an embedded executable image to place code and data in specific locations
in memory.
For an embedded application without an operating system, the code in ROM must provide a way for the application to initialize itself and start executing. No automatic
initialization takes place on reset, therefore the application entry point must perform
some initialization before it can call any C code.
The initialization code, located at address zero after reset, must:
•
Mark the entry point for the initialization code.
•
Set up exception vectors.
•
Initialize the memory system.
•
Initialize the stack pointer registers.
•
Initialize any critical I/O devices.
•
Initialize any RAM variables required by the interrupt system.
•
Enable interrupts (if handled by the initialization code).
•
Change processor mode if necessary.
•
Change processor state if necessary.
After the environment has been initialized, the sequence continues with the application
initialization and should enter the C code.
2
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
The C-startup file is the first file executed at power on and performs initialization of the
microcontroller from the reset vector up to the calling of the application main routine.
The main program should be a closed loop and should not return.
The ARM core begins executing instructions from address 0 at reset. For an embedded
system, this means that there must be ROM at address 0 when the system is reset.
Because of ROM limitations, the speed of exception handling is affected and the exception vectors cannot be modified. A common strategy is to remap ROM to RAM and copy
the exception vectors from ROM to RAM after startup.
C - Startup Example
A generic start-up file is included within this Application Note and others are available in
the AT91 software library. The example described is based on the AT91 Evaluation
Board C-startup sequence working with ARM ADS V1.1 Development Tool and debugging in external Flash Memory. This file must be modified in order to fit the needs of the
user application.
Each AT91 Evaluation Board is described in the AT91 Library inside a subdirectory of
the directory\software\targets. Each of these subdirectories contains the following files:
•
The <target>.h file, defines the components of the boards in C.
•
The <target>.inc file, defines the components of the boards in assembly.
•
One or more cstartup.s files, define standard boot for the boards according to the
software development tools used: ARM SDT, ARM ADS and Green Hills MULTI®
2000 for example.
The AT91 Library provides C-Startup files that explain how to boot an AT91 part and
how to branch on the main C function. The C-Startup file provides an example of how to
boot an AT91 part, taking into account the part specific features, the board specific characteristics and the debug level required.
Note:
The software example is delivered "As Is" without warranty or condition of any kind, either
express, implied or statutory. This includes without limitation any warranty or condition
with respect to merchantability or fitness for any particular purpose, or against the
infringements of intellectual property rights of others.
Area Definition and Entry In an ARM assembly language source file, the start of a section is marked by the AREA
Point for the Initialization directive. This directive names the section and sets its attributes. The attributes are
placed after the name, separated by commas. The code example referenced above
Code
defines a read-only code section named reset.
An executable image must have an entry point. An embedded image that can be placed
in ROM usually has an entry point at 0x0. An entry point can be defined in the initialization code by using the assembler directive ENTRY.
;--------------------------------------------------------------------------;- Area Definition
;--------------------------------------------------------------------------AREA
reset, CODE, READONLY
;--------------------------------------------------------------------------;- Define the entry point
;--------------------------------------------------------------------------ENTRY
3
2644A–ATARM–06/02
Setup Exception Vectors
Exception Vectors are setup sequentially through the address space with branches to
nearby labels or branches and links to subroutines. During the normal flow of execution
through a program, the program counter increases enable the processor to handle
events generated by internal or external sources. Processor exceptions occur when the
normal flow of execution is diverted. Examples of such events are:
•
Externally generated interrupts.
•
An attempt by the processor to execute an Undefined Instruction.
It is necessary to preserve the previous processor status when handling such exceptions, so that execution of the program that was running when the exception occurred
can resume when the appropriate exception routine has completed.
The initialization code must set up the required exception vectors (see Table 1). If the
ROM is located at address 0, the vectors consist of a sequence of hard-coded instructions to branch to the handler for each exception. These vectors are mapped at address
0 before remap. They must be in relative addressing mode in order to guarantee a valid
jump. After remap, these vectors are mapped at address 0x01000000 and can only be
changed back by an internal reset or NRST assertion.
Table 1. Exception Vectors
4
Exception
Description
Reset
Occurs when the processor reset pin is asserted. This exception
is only expected to occur for signalling power-up, or for resetting
as if the processor has just powered up. A soft reset can be
done by branching to the reset vector (0x0000).
Undefined Instruction
Occurs if neither the processor, or any attached coprocessor,
recognizes the currently executing instruction.
Software Interrupt (SWI)
This is a user-defined synchronous interrupt instruction. It
allows a program running in User mode, for example, to request
privileged operations that run in Supervisor mode, such as an
RTOS function.
Prefetch Abort
Occurs when the processor attempts to execute an instruction
that has prefetched from an illegal address.
Data Abort
Occurs when a data transfer instruction attempts to load or store
data at an illegal address.
IRQ
Occurs when the processor external interrupt request pin is
asserted (LOW) and the I bit in the CPSR is clear.
FIQ
Occurs when the processor external fast interrupt request pin is
asserted (LOW) and the F bit in the CPSR is clear.
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
Processor exception handling is controlled by a vector table. The vector table is a
reserved area of 32 bytes, usually at the bottom of the memory map. It has one word of
space allocated to each exception type, and one word that is currently reserved as
shown in Figure 1. Because there is not enough space to contain the full code for a handler, the vector entry for each exception type contains a branch instruction or load pc
instruction to continue execution with the appropriate handler.
;--------------------------------------------------------------------------;- Exception vectors ( before Remap )
;--------------------------------------------------------------------------B
InitReset
; reset
undefvec
B
undefvec
; Undefined Instruction
swivec
; Software Interrupt
pabtvec
; Prefetch Abort
dabtvec
; Data Abort
rsvdvec
; reserved
irqvec
; reserved
fiqvec
; reserved
swivec
B
pabtvec
B
dabtvec
B
rsvdvec
B
irqvec
B
fiqvec
B
Figure 1. Exception Vectors Mapping
0x00000000
B InitReset
0x00000004
B undefvec
0x00000008
B swivec
0x0000000C
B pabtvec
0x00000010
B dabtvec
0x00000014
B rsvdvec
0x00000018
B irqvec
0x0000001C
B fiqvec
0x00000020
0x00000038
InitReset
(linked @ 0x01000038)
0x00300000
Internal RAM
5
2644A–ATARM–06/02
External Bus Interface
Initialization Table
The EBI Table is used to configure the memory controller. The EBI values depend on
target, clock and external memory access time. These values are defined in an “include
file” corresponding to the target, for example eb55.inc for AT91EB55 Evaluation Board.
;--------------------------------------------------------------------------;- EBI Initialization Data
;--------------------------------------------------------------------------InitTableEBI
DCD
EBI_CSR_0
DCD
EBI_CSR_1
DCD
EBI_CSR_2
DCD
EBI_CSR_3
DCD
EBI_CSR_4
DCD
EBI_CSR_5
DCD
EBI_CSR_6
DCD
EBI_CSR_7
DCD
0x00000001
; REMAP command
DCD
0x00000006
; 6 memory regions, standard read
PtEBIBase
DCDEBI_BASE; EBI Base Address
Reset Handler
From here, the code is executed from address 0. Caution should be taken, as it is linked
to 0x100 0000.
;--------------------------------------------------------------------------;- Reset Handler before Remap
;--------------------------------------------------------------------------InitReset
Speed Up the Boot
Sequence
After reset, the External Bus Interface is not configured apart from the chip select 0 and
the number of wait states on chip select 0 is 8. Before the remap command, the chip
select 0 configuration can be modified by programming the EBI_CSR0 with exact boot
memory characteristics. The base address becomes effective after the remap command, but the new number of wait states can be changed immediately. This is desirable
if a boot sequence needs to be faster.
;--------------------------------------------------------------------------;- Speed up the Boot sequence
;--------------------------------------------------------------------------;- Load System EBI Base address and CSR0 Init Value
ldr
r0,
PtEBIBase
ldr
r1,
InitTableEBI
; values (relative)
;- Speed up code execution by disabling wait state on Chip Select 0
str
6
r1,
[r0]
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
Low Level Initialization
Peripherals that must be initialized before enabling interrupts should be considered as
critical. If these peripherals are not initialized at this point, they might cause spurious
interrupts when interrupts are enabled.
;--------------------------------------------------------------------------;- Low level init
;--------------------------------------------------------------------------bl
__low_level_init
Example: Start PLL on the AT91EB55 Evaluation Board.
At reset, the AT91M55800A microcontroller starts with the slow clock oscillator (32.768
kHz) to minimize the power required to start up the system and the main oscillator is disabled. The PLL can be started by configuring the Advanced Power Management
Controller to run with the main oscillator to speed up the startup sequence.
The __low_level_init function is defined in the assembly file from the AT91 software
library associated to the corresponding evaluation board.
7
2644A–ATARM–06/02
Advanced Interrupt
Controller Configuration
After reset, the Advanced Interrupt Controller (AIC) is not configured. The C-startup file
initializes the AIC by setting up the default interrupt vectors. The default Interrupt handler functions are defined in the AT91 library. These functions can be redefined in the
application code. To view interrupt default handler initialization, see Figure 2 on page 9.
;--------------------------------------------------------------------------;- Advanced Interrupt Controller configuration
;--------------------------------------------------------------------------;- Set up the default vectors
;--------------------------------------------------------------------------;- Load the AIC Base Address and the default handler addresses
add
ldmia
r0, pc,#-(8+.-AicData)
; @ where to read values (relative)
r0, {r1-r4}
;- Setup the Spurious Vector
str
r4, [r1, #AIC_SPU]
; r4 =spurious handler
;- Set up the default interrupt handler vectors
str
r2, [r1, #AIC_SVR]; SVR[0] for FIQ
add
r1, r1, #AIC_SVR
mov
r0, #31
; counter
LoopAic1
str
r3, [r1, r0, LSL #2]; SVRs for IRQs
subs
r0, r0, #1
bhi
LoopAic1
b
EndInitAic
; do not save FIQ
;--------------------------------------------------------------------------;- Default Interrupt Handler
;--------------------------------------------------------------------------AicData
DCD
AIC_BASE; AIC Base Address
IMPORT
at91_default_fiq_handler
IMPORT
at91_default_irq_handler
IMPORT
at91_spurious_handler
PtDefaultHandler
DCD
at91_default_fiq_handler
DCD
at91_default_irq_handler
DCD
at91_spurious_handler
EndInitAic
8
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
Figure 2. Interrupt Default Handler Initialization
Advanced Interupt Controller
0xFFFFF080
0xFFFFF084
0xFFFFF088
0xFFFFF08C
0xFFFFF090
0xFFFFF094
at91_default_fiq_handler
AIC_SVR0
at91_default_irq_handler
at91_default_irq_handler
AIC_SVR1
AIC_SVR2
at91_default_irq_handler
AIC_SVR3
at91_default_irq_handler
at91_default_irq_handler
at91_default_irq_handler
0xFFFFF0FC
0xFFFFF100
0xFFFFF134
at91_default_irq_handler
at91_spurious_handler
AIC_SVR31
AIC_SPU
9
2644A–ATARM–06/02
Copy Exception Vectors
in Internal RAM
The exception vectors must be copied into internal RAM. It is important to perform this
operation before remap in order to guarantee that the core is provided valid vectors during the remap operation. There are only five offsets as the vectoring is used. See Figure
3 on page 11
;--------------------------------------------------------------------------;-Setup Exception Vectors in Internal RAM before Remap
;--------------------------------------------------------------------------b
SetupRamVectors
VectorTable
ldr
pc, [pc, #&18]
; SoftReset
ldr
pc, [pc, #&18]
; UndefHandler
ldr
pc, [pc, #&18]
; SWIHandler
ldr
pc, [pc, #&18]
; PrefetchAbortHandler
ldr
pc, [pc, #&18]
nop
; DataAbortHandler
; Reserved
ldr
pc, [pc,#-0xF20]
; IRQ : read the AIC
ldr
pc, [pc,#-0xF20]
; FIQ : read the AIC
;- There are only 5 offsets as the vectoring is used.
DCD
SoftReset
DCD
UndefHandler
DCD
SWIHandler
DCD
PrefetchAbortHandler
DCD
DataAbortHandler
;- Vectoring Execution function run at absolute address
SoftReset
b
SoftReset
UndefHandler
b
UndefHandler
SWIHandler
b
SWIHandler
PrefetchAbortHandler
b
PrefetchAbortHandler
DataAbortHandler
b
DataAbortHandler
SetupRamVectors
mov
10
r8, #RAM_BASE_BOOT
; @ of the hard vector in RAM 0x300000
add
r9, pc,#-(8+.-VectorTable) ; @ where to read values (relative)
ldmia
r9!, {r0-r7}
; read 8 vectors
stmia
r8!, {r0-r7}
; store them on RAM
ldmia
r9!, {r0-r4}
; read 5 absolute handler addresses
stmia
r8!, {r0-r4}
; store them on RAM
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
Figure 3. Map to Copy Exception Vectors in Internal RAM
0x00000000
B InitReset
0x00000004
B undefvec
0x00000008
0x00000070
Ldr pc, [pc, #&18]
0x00000074
Ldr pc, [pc, #&18]
0x00000078
Ldr pc, [pc, #&18]
0x0000007C
0x00000090
0x00000094
0x00000098
Jump to
Absolute @
Ldr pc, [pc, #&18]
DCD SoftReset
@0x01005348
DCD UndefHandler
@0x01005634
DCD SWIHandler
@0x01005694
0x00300000
Ldr pc, [pc, #&18]
Ldr pc, [pc, #&18]
Internal RAM
Ldr pc, [pc, #&18]
DCD SoftReset
@0x01005348
Memory Controller
Initialization and Remap
Command
External Flash
After a reset the internal RAM of the AT91 is mapped at address 0x00300000. The
memory connected to the Chip Select line 0 is mapped at address 0. When the Remap
command is performed, the external memory is mapped at the address defined by the
user in the Chip Select Register 0. The Internal RAM is then mapped at address 0 allowing ARM7TDMI exception vectors between 0x0 and 0x20 to be modified by the
software.
;--------------------------------------------------------------------------;- Memory Controller Initialization
;--------------------------------------------------------------------------;- Copy the Image of the Memory Controller
sub
r10, pc,#(8+.-InitTableEBI)
; get the address of the chip
; select register image
ldr
r12, PtInitRemap
; get the real jump address
; ( after remap )
;- Copy Chip Select Register Image to Memory Controller and command remap
ldmia
r10!, {r0-r9,r11}
; load the complete image and the
stmia
r11!, {r0-r9}
; store the complete image with
; EBI base
; the remap command
11
2644A–ATARM–06/02
;- Jump to ROM at its new address
mov
pc, r12
; jump and break the pipeline
PtInitRemap
DCD
InitRemap
; address where to jump after REMAP
;--------------------------------------------------------------------------;- From here, the code is executed from its link address, ie. 0x100 0000.
;--------------------------------------------------------------------------InitRemap
The ARM Processor Pipeline assures that the instruction "mov pc, r12" will be read
before remap is executed. After remap, the next instruction is fetched in internal RAM
and the instruction "mov pc, r12" is executed to perform jump in ROM at the previously
loaded address in r12 (0x0100011C) thus simultaneously breaking the pipeline as
shown in Figure 4. The subsequent “new” memory mapping after remap is described in
Figure 5 on page 13.
Figure 4. ARM Core Pipeline During Remap Command
After Remap
Before Remap
Fetch
Pipeline
Idmia
Decode
stmia
mov PC
InitRemap
RAM@11C
ldr r0
Idmia
stmia
mov PC
InitRemap
break
stmia
0x118
mov PC
0x11C
break
0x110
Idmia
0x114
Execute
PC
0x10C
After mov PC, r12
NCSO select @ 0x00000000
Internal RAM
@ 0x0000
Internal
SRAM
0x100011C
Msr CPSR_c
ldr r0
break
0x1000120
NCSO select @ 0x01000000
Flash
NCSO
Flash
NCSO
PC
0x01000000
0x00300000
0x01000000
Memory
Flash
NCSO
PC
0x00000000
12
Internal
SRAM
Internal
SRAM
PC
0x00000000
0x00000000
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
Figure 5. Memory Map After Remap
0x00000000
0x00000004
0x00000008
0x0000000C
0x00000010
Internal RAM
0x00000014
0x00000018
0x0000001C
Ldr pc, [pc,#&18]
Ldr pc, [pc,#&18]
Ldr pc, [pc,#&18]
Ldr pc, [pc,#&18]
Ldr pc, [pc,#&18]
NOP
New ARM Vectors
Ldr pc, [pc,#-0xF20]
Ldr pc, [pc,#-0xF20]
0x00000020
SoftReset
UndefHandler
0x01000000
0x01 000004
B InitReset
Previous ARM Vectors
B undefyec
(Not Used)
B swiyec
External Memory
Selected by CSR0
0x01000110
0x01000114
PC
0x01000118
0x0100011C
Initialize Stack Registers
stmia
mov
r11, (r0-r9)
pc, r12
InitRemap
Ldr r0, =TOP_..._STACK
Fast Interrupt, Interrupt, Abort, Undefined and Supervisor Stack are located at the top of
internal memory in order to speed up the exception handling context. User (Application,
C) Stack is located at the top of the external memory.
The initialization code initializes the stack pointer registers. Depending on the interrupts
and exceptions desired, some or all of the following stack pointers may require
initialization:
•
Supervisor stack must always be initialized.
•
IRQ stack must be initialized if IRQ interrupts are used. It must be initialized before
interrupts are enabled.
•
FIQ stack must be initialized if FIQ interrupts are used. It must be initialized before
interrupts are enabled.
•
Abort-status stack must be initialized for Data and Prefetch Abort handling.
•
Undefined Instruction stack must be initialized for Undefined Instruction handling.
Generally, Abort-status and Undefined Instruction stacks are not used in a simple
embedded system. However, it might be preferable to initialize them for debugging
purposes.
13
2644A–ATARM–06/02
The user stack pointer can be set up when changing to User mode to start executing the
application.
;--------------------------------------------------------------------------;- Stack sizes definition
;--------------------------------------------------------------------------IRQ_STACK_SIZE
EQU
(3*8*4)
; 3 words
FIQ_STACK_SIZE
EQU
(3*4)
; 3 words
ABT_STACK_SIZE
EQU
(1*4)
; 1 word
UND_STACK_SIZE
EQU
(1*4)
; 1 word
Assuming that the IRQ_ENTRY/IRQ_EXIT macro is used, Interrupt Stack requires 3
words x 8 priority level x 4 bytes when using the vectoring. The Interrupt Stack must be
adjusted depending on the interrupt handlers. Fast Interrupt requires 3 words x 4 bytes
without priority level. Other stacks are defined by default to save one word each. The
system stack size is not defined and is limited by the free internal SRAM. User stack
size is not defined and is limited by the free external SRAM.
;--------------------------------------------------------------------------;- Top of Stack Definition
;--------------------------------------------------------------------------TOP_EXCEPTION_STACK
EQU
RAM_LIMIT
; Defined in part
TOP_APPLICATION_STACK
EQU
EXT_SRAM_LIMIT
; Defined in Target
;--------------------------------------------------------------------------;- Setup stack for each mode
;--------------------------------------------------------------------------ldr
r0, =TOP_EXCEPTION_STACK
;- Set up Fast Interrupt Mode and set FIQ Mode Stack
msr
CPSR_c,
mov
r13, r0
sub
r0,
#ARM_MODE_FIQ:OR:I_BIT:OR:F_BIT
; Init stack FIQ
r0, #FIQ_STACK_SIZE
;- Set up Interrupt Mode and set IRQ Mode Stack
msr
CPSR_c,
mov
r13, r0
sub
r0,
#ARM_MODE_IRQ:OR:I_BIT:OR:F_BIT
; Init stack IRQ
r0, #IRQ_STACK_SIZE
;- Set up Abort Mode and set Abort Mode Stack
msr
CPSR_c,
mov
r13, r0
sub
r0,
#ARM_MODE_ABORT:OR:I_BIT:OR:F_BIT
; Init stack Abort
r0, #ABT_STACK_SIZE
;- Set up Undefined Instruction Mode and set Undef Mode Stack
msr
CPSR_c,
mov
r13, r0
#ARM_MODE_UNDEF:OR:I_BIT:OR:F_BIT
; Init stack Undef
sub r0, r0, #UND_STACK_SIZE
;- Set up Supervisor Mode and set Supervisor Mode Stack
14
msr
CPSR_c,
mov
r13, r0
#ARM_MODE_SVC:OR:I_BIT:OR:F_BIT
; Init stack Sup
AT91 ARM Thumb
2644A–ATARM–06/02
AT91 ARM Thumb
Change Processor Mode
and Enable Interrupts
The initialization code can now enable interrupts if necessary, by clearing the interrupt
disable bits in the CPSR. This is the earliest point that it is safe to enable interrupts. At
this stage the processor is still in Supervisor mode. If the application runs in User mode,
change to User mode and initialize the User mode stack.
;--------------------------------------------------------------------------;- Setup Application Operating Mode and Enable the interrupts
;---------------------------------------------------------------------------
Initialize Software
Variable and Branch to
Main Function
msr
CPSR_c, #ARM_MODE_USER
; set User mode
ldr
r13, =TOP_APPLICATION_STACK
; Init stack User
The next task is to initialize the data memory by entering a loop that writes zeroes into
allocations used for data storage. This may seem superfluous, but there are two reasons for this:
1. In C language, any non-initialized variable is supposed to contain zero as an initial value.
2. This makes the program behavior reproducible, even if not all variables are initialized explicitly.
–
The table of initial values for the initialized variable (in the C language sense)
is copied to the location in RAM where the variables are positioned.
–
The linker puts the initial values in the same order as the variables in RAM,
so a mere block copy is sufficient for this initialization.
The initial values for any initialized variables must be copied from ROM to RAM. All
other variables must be initialized to zero.
When the compiler compiles a function called main(), it generates a reference to the
symbol __main to force the linker to include the basic C run-time system from the ANSI
C library.The library initialization code called at __main performs the copying and initialization. The function main() should be a closed loop and should not return.
;--------------------------------------------------------------------------;- Branch on C code Main function (with interworking)
;--------------------------------------------------------------------------IMPORT
__main
ldr
r0, =__main
bx
r0
END
15
2644A–ATARM–06/02
Atmel Headquarters
Atmel Operations
Corporate Headquarters
Memory
2325 Orchard Parkway
San Jose, CA 95131
TEL 1(408) 441-0311
FAX 1(408) 487-2600
Europe
Atmel Sarl
Route des Arsenaux 41
Case Postale 80
CH-1705 Fribourg
Switzerland
TEL (41) 26-426-5555
FAX (41) 26-426-5500
Asia
Room 1219
Chinachem Golden Plaza
77 Mody Road Tsimhatsui
East Kowloon
Hong Kong
TEL (852) 2721-9778
FAX (852) 2722-1369
Japan
9F, Tonetsu Shinkawa Bldg.
1-24-8 Shinkawa
Chuo-ku, Tokyo 104-0033
Japan
TEL (81) 3-3523-3551
FAX (81) 3-3523-7581
2325 Orchard Parkway
San Jose, CA 95131
TEL 1(408) 441-0311
FAX 1(408) 436-4314
RF/Automotive
Theresienstrasse 2
Postfach 3535
74025 Heilbronn, Germany
TEL (49) 71-31-67-0
FAX (49) 71-31-67-2340
Microcontrollers
2325 Orchard Parkway
San Jose, CA 95131
TEL 1(408) 441-0311
FAX 1(408) 436-4314
La Chantrerie
BP 70602
44306 Nantes Cedex 3, France
TEL (33) 2-40-18-18-18
FAX (33) 2-40-18-19-60
ASIC/ASSP/Smart Cards
1150 East Cheyenne Mtn. Blvd.
Colorado Springs, CO 80906
TEL 1(719) 576-3300
FAX 1(719) 540-1759
Biometrics/Imaging/Hi-Rel MPU/
High Speed Converters/RF Datacom
Avenue de Rochepleine
BP 123
38521 Saint-Egreve Cedex, France
TEL (33) 4-76-58-30-00
FAX (33) 4-76-58-34-80
Zone Industrielle
13106 Rousset Cedex, France
TEL (33) 4-42-53-60-00
FAX (33) 4-42-53-60-01
1150 East Cheyenne Mtn. Blvd.
Colorado Springs, CO 80906
TEL 1(719) 576-3300
FAX 1(719) 540-1759
Scottish Enterprise Technology Park
Maxwell Building
East Kilbride G75 0QR, Scotland
TEL (44) 1355-803-000
FAX (44) 1355-242-743
e-mail
[email protected]
Web Site
http://www.atmel.com
© Atmel Corporation 2002.
Atmel Corporation makes no warranty for the use of its products, other than those expressly contained in the Company’s standard warranty
which is detailed in Atmel’s Terms and Conditions located on the Company’s web site. The Company assumes no responsibility for any errors
which may appear in this document, reserves the right to change devices or specifications detailed herein at any time without notice, and does
not make any commitment to update the information contained herein. No licenses to patents or other intellectual property of Atmel are granted
by the Company in connection with the sale of Atmel products, expressly or by implication. Atmel’s products are not authorized for use as critical
components in life support devices or systems.
ATMEL ® is the registered trademark of Atmel.
ARM ®, ARM ® Thumb ® and ARM Powered ® are the registered trademarks of ARM Ltd. MULTI® 2000 is the registered trademark of Green Hills Software, Inc.
Printed on recycled paper.
2644A–ATARM–06/02
0M