Embedded Programming
with the GNU Toolchain
Vijay Kumar B.
vijaykumar@[Link]
Zilogic Systems 1
What?
C Application
OS C Application
Hardware Hardware
Conventional C Programs Our Case
Zilogic Systems 2
Why?
● Embedded Firmware Development
● RTOS development – eCOS, RTEMS, ...
● Bootloader development – U-Boot, ...
● Programming DSPs
● Testing Microprocessors cores
implemented in ASICs / FPGAs
Zilogic Systems 3
How?
● 3 Example Scenarios
● Hello Embedded World – Add 2 numbers
in registers in assembly
● Add 2 numbers from memory in assembly
● Add 2 numbers from memory in C
Zilogic Systems 4
Scenario I - Overview
● Cortex-M3 Processor
● Writing Assembly Programs
● Emulating Cortex-M3 with Qemu
Zilogic Systems 5
ARMv7
● Latest revision of ARM architecture –
ARMv7
● Cortex Processor – ARMv7
implementation
● Profiles
– A Profile – GPOS and applications
– R Profile – optimized for realtime systems
– M Profile – optimized for low cost embedded
systems
Zilogic Systems 6
Cortex-M3 Features
● Thumb-2 Instruction Set
● Bit Banding
● Integrated Peripherals
– NVIC
– Memory Protection Unit
(MPU)
– Debug Peripherals
Zilogic Systems 7
CM3 SoCs
● SoC vendors license CM3 from ARM
● SoC vendors use it as building block
● Licensees
– TI – Stellaris processors
– Atmel – ATSAM3U series
– STMicroelectronics – STM32
– NXP - LPC1700
Zilogic Systems 8
LM3S811
● Cortex-M3 core
● Memory
– 64KB Flash
– 8KB RAM
● Peripherals
– 10 bit ADCs
– I2C, SPI, UARTs, PWM
– 32 GPIOs
Zilogic Systems 9
Registers
● Load Store
Architecture
● Data processing
instructions –
register operands
● Large register file –
16 32-bit registers
Zilogic Systems 10
Registers (Contd.)
R0 R8
● R0 – R12
R1 R9 – General Purpose
R2 R10
R3 R11 ● R13
R4 R12
R5 R13 (SP)
– Stack Pointer
R6
R7
R14 (LR)
R15 (PC)
● R14
– Link Register
PSR PRIMASK
FAULTMASK
● R15
CONTROL BASEPRI
– Program Counter
Zilogic Systems 11
Memory Map
● CM3 has a fixed
memory map
● Easy to port
software
Peripherals
0x4000_0000
● 4GB Address Space
SRAM
● LM3S811
0x2000_0000
– 64KB Flash
Flash
0x0000_0000
– 8KB SRAM
Zilogic Systems 12
Reset
● SP from address 0x0
● PC from address 0x4
● Address is mapped
to Flash
Reset Vec.
0x0004
Initial SP
0x0000
Zilogic Systems 13
Assembly
label: instruction @comment
● label: convenient way to refer to the
memory location
● instruction: ARM instruction or assembler
directive
● comment: starts with @
Zilogic Systems 14
Hello Embedded World
.thumb
.syntax unified
sp: .word 0x100
reset: .word start+1
start:
mov r0, #5
mov r1, #4
add r2, r1, r0
stop: b stop
Zilogic Systems 15
Toolchain
Assembler Source (.s)
Assembler (as)
Object File (.o)
Linker (ld)
Executable (.elf)
Zilogic Systems 16
Toolchain (Contd.)
$ arm-none-eabi-as -mcpu=cortex-m3 -o add.o add.s
● Cross toolchain prefix - arm-none-eabi-
● -mcpu=cortex-m3 Specifies the CPU
● -o Specifies the output file
Zilogic Systems 17
Toolchain (Contd.)
$ arm-none-eabi-ld -Ttext=0x0 -o [Link] add.o
● Cross toolchain prefix - arm-none-eabi-
● -Ttext=0x0 Addresses should be
assigned to instructions starting from 0.
● -o Specifies the output file
Zilogic Systems 18
Toolchain (Contd.)
$ arm-none-eabi-nm [Link]
...
00000004 t reset
00000000 t sp
00000008 t start
00000014 t stop
● List symbols from object file
● Verify initial SP and reset vector are
located at required address
Zilogic Systems 19
Toolchain (Contd.)
● ELF file format contains meta information
for OS
● Binary format contains consecutive bytes
starting from an address
● Convenient for flashing tools
Zilogic Systems 20
Toolchain (Contd.)
$ arm-none-eabi-objcopy -O binary [Link] [Link]
● objcopy – converts between different
executable file formats
● -O specifies that output file format
Zilogic Systems 21
Qemu
● Open source machine emulator - the
processor and the peripherals
● Architectures – i386, ARM, MIPS, SPARC ...
● Used by various open source projects
– OLPC
– OpenMoko
– Linux Kernel Testing
Zilogic Systems 22
Emulating in Qemu
$ qemu-system-arm -M lm3s811evb -kernel [Link]
● -M lm3s811evb specifies the machine to
be emulated
● -kernel specifies data to be loaded in
Flash from address 0x0
● monitor interface – control and status
● can be used to view the registers
Zilogic Systems 23
Review
● Writing simple assembly programs
● Building and linking them using GNU
Toolchain
● Emulating Cortex-M3 processor using
Qemu
Zilogic Systems 24
Scenario II - Overview
● Role of Linker
● Linker Scripts
● Placing data in RAM
Zilogic Systems 25
Linker
a.s assembler a.o
linker abc.o
b.s assembler b.o
c.s assembler c.o
● In multi-file programs – combines multiple
object files to form executable
Zilogic Systems 26
Linker (Contd.)
Linker
Symbol
Relocation
Resolution
Section Section
Merging Placement
Zilogic Systems 27
Linker (Contd.)
Linker
Symbol
Relocation
Resolution
Section Section
Merging Placement
Zilogic Systems 28
Symbol Resolution
● Functions are
defined in one file
● Referenced in
another file
● References are
marked unresolved
by the compiler
● Linker patches the
references
Zilogic Systems 29
Linker
Linker
Symbol
Relocation
Resolution
Section Section
Merging Placement
Zilogic Systems 30
Relocation
● Code generated
assuming it starts
from address X
● Code should start
from address Y
● Change addresses
assigned to labels
● Patch label
references
Zilogic Systems 31
Sections
● Placing related bytes at a particular
location.
● Example:
– instructions in Flash
– data in RAM
● Related bytes are grouped together using
sections
● Placement of sections can be specified
Zilogic Systems 32
Sections (Contd.)
● Most programs have atleast two sections,
.text and .data
● Data or instructions can be placed in a
section using directives
● Directives
– .text
– .data
– .section
Zilogic Systems 33
Sections (Contd.)
● Source – sections can be interleaved
● Bytes of a section – contiguous addresses
Zilogic Systems 34
Linker
Linker
Symbol
Relocation
Resolution
Section Section
Merging Placement
Zilogic Systems 35
Section Merging
● Linker merges sections in the input files
into sections in the output file
● Default merging – sections of same name
● Symbols get new addresses, and
references are patched
● Section merging can be controlled by
linker script files
Zilogic Systems 36
Linker
Linker
Symbol
Relocation
Resolution
Section Section
Merging Placement
Zilogic Systems 37
Section Placement
● Bytes in each section is given addresses
starting from 0x0
● Labels get addresses relative to the start
of section
● Linker places section at a particular
address
● Labels get new address, label references
are patched
Zilogic Systems 38
strlen
Linker Script
Linker
Symbol
Relocation
Resolution
Can be controlled
through Linker scripts.
Section Section
Merging Placement
Zilogic Systems 42
Simple Linker Script
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
} 0xFFFF
SECTIONS {
.text : {
abc.o (.text);
def.o (.text);
} > FLASH def.o (.text)
}
abc.o (.text)
0x0
Zilogic Systems 43
Simple Linker Script
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS {
.text : { Section Merging
abc.o (.text);
def.o (.text);
} > FLASH
}
Zilogic Systems 44
Simple Linker Script
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS {
.text : {
abc.o (.text);
def.o (.text);
} > FLASH Section Placement
}
Zilogic Systems 45
Making it Generic
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS {
.text : {
* (.text); Wildcards to represent .text
} > FLASH form all input files
}
Zilogic Systems 46
Multiple Sections
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
}
0xFFFF
SECTIONS {
.text : { Dealing with
* (.text); mutiple sections
} > FLASH
.rodata : { .rodata
* (.rodata);
} > FLASH .text
0x0
}
Zilogic Systems 47
Data in RAM
● Add two numbers from memory
● Assembly source
● Linker Script
Zilogic Systems 48
RAM is Volatile!
● RAM is volatile
● Data cannot be made available in RAM at
power-up
● All code and data should be in Flash at
power-up
● Startup code – copies data from Flash to
RAM
Zilogic Systems 49
RAM is Volatile! (Contd.)
● .data section should be present in Flash at
power-up
● Section has two addresses
– load address (aka LMA)
– run-time address (aka VMA)
● So far only run-time address – actual
address assigned to labels
● Load address defaults to run-time address
Zilogic Systems 50
Linker Script Revisited
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
} 0x20001FFF
SECTIONS { SRAM
.text : { .data
0x20000000
* (.text);
} > FLASH
0x0000FFFF
.data : {
Flash
* (.data);
} > SRAM .text
0x00000000
}
Zilogic Systems 51
Linker Script Revisited
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
} 0x20001FFF
SECTIONS { SRAM
.text : { .data
0x20000000
* (.text);
} > FLASH
0x0000FFFF
.data : {
Flash .data
* (.data);
} > SRAM AT> FLASH .text
0x00000000
}
Zilogic Systems 52
Linker Script Revisited
MEMORY {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS {
.text : {
edata
* (.text); .data
etext = .; sdata
} > FLASH
.data : {
sdata = .;
* (.data); .data
edata = .; etext
.text
} > SRAM AT> FLASH
}
Zilogic Systems 53
Data in RAM
● Copy .data from Flash to RAM
start:
ldr r0, =sdata @ Load the address of sdata
ldr r1, =edata @ Load the address of edata
ldr r2, =etext @ Load the address of etext
copy: ldrb r3, [r2] @ Load the value from Flash
strb r3, [r0] @ Store the value in RAM
add r2, r2, #1 @ Increment Flash pointer
add r0, r0, #1 @ Increment RAM pointer
cmp r0, r1 @ Check if end of data
bne copy @ Branch if not end of data
Zilogic Systems 54
Review
● Linker Script can control
– Section Merging
– Section Placement
● .data placed in RAM, .text in Flash
● RAM is volatile
● at load time .data is in Flash
● at startup .data is copied from Flash to
RAM
Zilogic Systems 55
Scenario III - Overview
● C Environment Requirements
● C Sections
● C Source Code
● Linker Script
Zilogic Systems 56
Doing it in C
● Environment has to
be setup
– Stack pointer
– Non-initalized
global variables,
initialized to zero
– Initialized global
variables must
have their initial
value
Zilogic Systems 57
C Sections
● Sections created by GCC
– .text – for functions
– .data – for initialized global data
– .bss – for uninitialized global data
– .rodata – for strings and global variables
defined as const
Zilogic Systems 58
Credits
● Cash Register – Nikola Smolenski
● Cerebral Cortex - [Link]
● Reset Button – flattop341
[Link]
● Church Relocation – Fletcher6
[Link]
● Rope Image - Markus Bärlocher
[Link]
Zilogic Systems 59
Further Reading
● Embedded Programming using the GNU
Toolchain -
[Link]
● GNU Linker Manual
● GNU Assembler Manual
Zilogic Systems 60