Compiling hello world program with the ZPU GCC toolchain
The ZPU comes with a standard GCC toolchain and an instruction set simulator. This allows compiling, running & debugging simple test programs. The Simulator has
some very basic peripherals defined: counter, timer interrupt and a debug output port.
Installation
- Install Cygwin. http://www.cygwin.com
- Start Cygwin bash
- unzip zputoolchain.zip
- Add install/bin from zputoolchain.zip to PATH.
export PATH=$PATH:/install/bin
Hello world example
The ZPU toolchain comes with newlib & libstdc++ support which means that many C/C++ programs can be compiled without modification.
zpu-elf-gcc -Os -zeta hello.c -o hello.elf -Wl,--relax -Wl,--gc-sections
zpu-elf-size hello.elf
Optimizing for size
The ZPU toolchain produces highly compact code.
- Since the ZPU GCC toolchain supports standard ANSI C, it is easy to stumble across
functionality that takes up a lot of space. E.g. the standard printf() function is a beast. Some compilers drop e.g. floating point support
from the printf() function and thus boast a "smaller" printf() when in fact they have a non-standard printf(). newlib has a standard printf() function
and an alternative iprintf() function that works only on integers.
- The ZPU ships with default startup code that works across various configurations of the ZPU, so be warned that there is some overhead that will
not occurr in the final application(anywhere between 1-4kBytes).
- Compilation and linker options matter. The ZPU benefits greatly from the "-Wl,--relax -Wl,--gc-sections" options which is not used by
all architectures(e.g. GCC ARM does not implement/need -Wl,--relax).
Small code example
zpu-elf-gcc -Os -abel smallstd.c -o smallstd.elf -Wl,--relax -Wl,--gc-sections
zpu-elf-size small.elf
$ zpu-elf-size small.elf
text data bss dec hex filename
2845 952 36 3833 ef9 small.elf
Even smaller code example
If the ZPU implements the optional instructions, the RAM overhead can be reduced significantly.
zpu-elf-gcc -Os -abel crt0_phi.S small.c -o small.elf -Wl,--relax -Wl,--gc-sections -nostdlib
zpu-elf-size small.elf
$ zpu-elf-size small.elf
text data bss dec hex filename
56 8 0 64 40 small.elf