Vývojové nástroje jazyka C pro procesory ARM
Projekt GNU zaštiťuje veškeré nástroje pro vývoj aplikací
pro procesory ARM. Jako první je nutné zvolit si knihovnu jazyka C, kterou
budu používat. Dále je nutné vytvořit nástroje sloužící pro práci
s binárními soubory. Následuje vytvoření samotného kompilátoru pro
procesor ARM a celý proces přípravy je ukončen kompilací knihovny
jazyka C.
Jako základní knihovnu jsem zvolil knihovnu jazyka C glibc, protože je
kompatibilní se všemi programy, které jsou dostupné pro Linux. Dále volím
novější aplikační binární rozhraní (ABI) jádra a knihovny C, které je
upraveno speciálně pro vestavná zařízení a které zrychluje práci
s čísly v plovoucí řádové čárce na procesorech, na kterých není
k dispozici jednotka pro výpočty v plovoucí řádové čárce. Pro
vývojové účely je jednodušší používat kompletní nástroje a po
vyvinutí programů použít optimalizace pro malá zařízení jako je
například záměna za knihovnu uCLibc.
Před samotným započetím práce jsem se rozhodl pro použití distribuce Embedded Gentoo. V této distribuci jsou všechny balíčky distribuovány ve zdrojových souborech. Obsahuje také podporu pro křížovou kompilaci. Kompilace samotná probíhá na silnějším stroji, obvykle osobním počítači, a výsledná aplikace se do cílového zařízení zkopíruje již v binárním tvaru.
Celý proces začíná přípravou prostředí pomocí nástroje crossdev, podle
zadaného řetězce vytvoří nástroje pro křížovou kompilaci.
~ # crossdev arm-softfloat-linux-gnueabi
Podle zvoleného procesoru a použité knihovny vytvořím textový
řetězec, který bude nadále používán pro všechny nástroje. Textový
řetězec pro nástroje pro procesor ARM s využitím knihovny
glibc a s použitím nového binárního rozhraní (EABI)
arm-softfloat-linux-gnueabi dále říká, že výsledné nástroje
budou vytvářet aplikace pro Linux. Podobně by tento řetězec vypadal
například pro použití knihovny uCLibc
arm-softfloat-linux-uclibcgnueabi.
Balík nástrojů, který se stará o statické linkování a vytváření
knihoven, se jmenuje binutils. Tento balík obsahuje skripty pro
výsledné sestavení binárních aplikací. Dále obsahuje nástroj pro
statické sestavení knihoven ar, nástroj pro statické a
dynamické sestavování výsledných binárních souborů ld,
dále je dostupný nástroj strip pro odstranění informací
z binárního souboru, které nejsou potřeba pro správný běh, ale jsou
například důležité pro ladění aplikace. Výsledné programy se jmenují
arm-softfloat-linux-gnueabi-ar,
arm-softfloat-linux-gnueabi-ld apod.
Dále je sestaven vlastní kompilátor pro jazyk C a následně i pro jazyk
C++. Nakonec je sestavena knihovna jazyka C, v tomto případě
glibc. Pro snadné sestavování vlastních aplikací a pro
sestavení jádra používám skript, který pro správně napsaný
Makefile vytvoří spustitelný soubor pro platformu ARM.
#!/bin/bash SYSROOT="/usr/arm-softfloat-linux-gnueabi/" TOOLCHAIN="arm-softfloat-linux-gnueabi-" make ARCH="arm" CROSS_COMPILE="$TOOLCHAIN" INSTALL_MOD_PATH="$SYSROOT" $*
Ladění aplikací jsem prováděl přímo v PC tím, že jsem programy
zkompiloval pro architekturu x86. Díky abstrakci hardware je pro
testování aplikací pro kameru jediný zásadní rozdíl rychlost procesoru a
velikost dostupné paměti.
Jako vývojové prostředí jsem používal IDE code::blocks,
které poskytovalo jednoduchou možnost vývoje a ladění jak aplikací pro
x86 pomocí debuggeru GDB, tak vzdálené ladění aplikace pomocí
nástroje GDBserver. Mocný nástroj na hledání problému s přístupem do
paměti je program Valgrind, který slouží k detekci přístupu do
nealokovaných míst v paměti a k detekci neuvolňované paměti
(memory leak).

