GCC for Maple

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.

Obtaining arm-none-eabi-gcc

Recent versions of arm-none-eabi-gcc and associated tools are included with the Maple IDE.

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 Maple IDE and 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 (under both the Maple IDE and the Unix toolchain), 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.

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)