Frequently Asked Questions (FAQ)

How can I use atoi()?

The CodeSourcery GCC compiler used to compile your programs is configured to link against the newlib C library, and allows the use of any of its headers.

How can I use malloc()/new?

For malloc(), just #include <stdlib.h>, and everything should work fine. Be careful, though! This isn’t like C programming on a PC. You’re on the bare metal, and probably shouldn’t be using dynamic memory unless you know what you’re doing.

new should work out of the box (the warning about knowing what you’re doing applies here as well). If you find that new (or new[], delete, etc.) is broken in some way, that’s a bug; please let us know in the forum.

Some information on the heap: on boards with an external SRAM chip (like Maple Native), the heap is located on external SRAM by default. For other boards, the heap is located immediately after .bss, and grows towards the stack. (In all cases, statically allocated variables and the stack are located on internal SRAM, for performance reasons).

How do I write to a pin at high speed?

Sometimes, digitalWrite() just isn’t fast enough. If that’s your situation, you should first try using fast GPIO writes using the low-level gpio.h interface. This FAQ entry explains how.

You’ll need to look up the GPIO port and bit which correspond to the pin you want to write to. If you don’t know what that means, don’t worry. We’ll go through an example here.

Let’s say you want to write to pin 4 on the Maple. In order to find out the port and bit number, take look at the Maple’s master pin map next to “D4”. You’ll see that in the “GPIO” column, there’s “PB5”. That’s short for “Port B, bit 5”. So the GPIO port is “B”, and the bit is “5”. (If you’re not on the Maple, you can find your board’s pin map from here).

That’s all you need to know. Now you can use the function gpio_write_bit() to quickly write to the pin. The way you call it is by writing gpio_write_bit(GPIO<port>, <bit>, HIGH/LOW), where <port> is the GPIO port, <bit> is the bit, and HIGH or LOW is the level you want to write to the pin. Here’s an example program which writes pin 4 (GPIOB, bit 5) HIGH and then LOW several times in a row each time it loop()s:

/*
   Fast pin writing example, for Maple.

   This example works for pin 4 (PB5 on Maple).  If you want to
   use another pin (or are on another board), just change PIN,
   PIN_PORT, and PIN_BIT as described above.
*/

#define PIN 4
#define PIN_PORT GPIOB
#define PIN_BIT 5

void setup() {
    pinMode(PIN, OUTPUT);
}

void loop() {
    gpio_write_bit(PIN_PORT, PIN_BIT, HIGH);
    gpio_write_bit(PIN_PORT, PIN_BIT, LOW);
    gpio_write_bit(PIN_PORT, PIN_BIT, HIGH);
    gpio_write_bit(PIN_PORT, PIN_BIT, LOW);
}

Now, if you’ve already tried this and you still can’t get enough speed, there are some threads on the forum which might help you squeeze a little extra out of your board. First, a general summary of other things to try, with measurements of the speed you’ll get. Next, a thread featuring a detailed discussion on pin capability, with a focus on writes. And finally, another thread on the subject which summarizes a variety of other threads on doing I/O quickly.