GCC and libc¶
This document provides notes on using arm-none-eabi-gcc
, the
CodeSourcery version of the GNU GCC compilers used for the Maple boards. It is
not intended as a reference manual for GCC; such manuals are available
elsewhere.
Contents
Obtaining arm-none-eabi-gcc
¶
Users who wish to use arm-none-eabi-gcc
directly, along with a
standard Unix Make-based toolchain, should read the
Unix Toolchain Quickstart, which describes how to set up such an
environment.
LeafLabs maintains mirrors for some of the more recent versions of the compiler, including versions for OS X, Win32, and 32-bit Linux.
Compiler Flags Used by libmaple¶
This section documents the flags passed to arm-none-eabi-gcc
by
the default Makefile provided with the Unix toolchain.
The information in this section is subject to change between libmaple releases.
The following flags are among those passed to the C compiler:
-Os -g -mcpu=cortex-m3 -mthumb -march=armv7-m -nostdlib
-ffunction-sections -fdata-sections -Wl,--gc-sections
In addition to those flags just given for the C compiler, the following flags are among those passed to the C++ compiler:
-fno-rtti -fno-exceptions -Wall
The following flags are among those passed to the assembler:
-mcpu=cortex-m3 -march=armv7-m -mthumb
Using the C Standard Library¶
By default, arm-none-eabi-gcc
is configured to
link against newlib, a C standard
library intended for use with embedded applications. You are free to
include of any of its headers.
Be advised, however, that a variety of syscalls may only be partially implemented, if at all. See the libmaple file syscalls.c and the newlib documentation for more details.
Switching from AVR-GCC¶
This section, which is expected to grow over time, describes techniques for porting code which uses AVR-GCC features (AVR-GCC is the compiler used by many Atmel AVR-based microcontroller boards, including Arduino) for use on the Maple.
Replacing
PROGMEM
: If you need to store a lot of constant data, you can store variables in Flash (instead of RAM) by using the libmaple macro__FLASH__
. Here’s an example:uint32 array[] __FLASH__ = {0, 1, 2};
This will help you save RAM when you need to store large amounts of data, like look-up tables.
You can only store values which are compile-time constants (like numbers and strings, and arrays of numbers and strings) in this way. Also, if you try to change a variable stored in Flash, your program will crash.
If you need to port over AVR/Arduino code that uses pgmspace.h, these declarations may help you:
typedef const unsigned char prog_uchar; #define pgm_read_byte_near(x) (*(prog_uchar*)x) #define pgm_read_byte(x) (*(prog_uchar*)x)