.. _arm-gcc:

GCC for Maple
=============

This document provides notes on using ``arm-none-eabi-gcc``, the
`CodeSourcery <http://www.codesourcery.com/>`_ version of the GNU `GCC
<http://gcc.gnu.org/>`_ compilers used for the Maple boards.  It is
not intended as a reference manual for GCC; such manuals are available
`elsewhere <http://gcc.gnu.org/>`_.

.. contents:: Contents
   :local:

Obtaining ``arm-none-eabi-gcc``
-------------------------------

Recent versions of ``arm-none-eabi-gcc`` and associated tools are
included with the :ref:`Maple IDE <ide>`.

Users who wish to use ``arm-none-eabi-gcc`` directly, along with a
standard Unix Make-based toolchain, should read the
:ref:`unix-toolchain`, which describes how to set up such an
environment.

LeafLabs maintains `mirrors
<http://static.leaflabs.com/pub/codesourcery/>`_ 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 :ref:`Maple IDE <ide>` and the default Makefile provided with the
:ref:`Unix toolchain <unix-toolchain>`.  The information in this
section is subject to change between :ref:`libmaple <libmaple>`
releases.

.. highlight:: sh

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

.. highlight:: cpp

.. _arm-gcc-avr-gcc:

Using the C Standard Library
----------------------------

By default (under both the :ref:`Maple IDE <ide>` and the :ref:`Unix
toolchain <unix-toolchain>`), ``arm-none-eabi-gcc`` is configured to
link against `newlib <http://sourceware.org/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.

.. _arm-gcc-attribute-flash:

- 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)