GCC für ARM Cortex M3

Da Ubuntu 22.04 nach den GCC11 hat, bootstrapen wir erst den GCC12.2.0-GCC

Wir gehen nach Johannes Bauer vor, müssen aber modifizieren:

binutils

cd ~/bautc12.20
mkdir buildutilsarm-elf
cd buildutilsarm-elf
../binutils-2.39/configure --prefix=/opt/tc-12.2.0-arm-cortex-m3 --target=arm-none-eabi --disable-werror \
--disable-interwork 
make -j4
make install

The Compiler gcc/g++

cd ~/bautc12.2.0
mkdir buildgccarmm3 ; cd buildgccarmm3
export PATH=/opt/tc-12.2.0-arm-cortex-m3/bin:$PATH
../gcc-12.2.0/configure --prefix=/opt/tc-12.2.0-arm-cortex-m3 --target=arm-none-eabi --disable-nls --disable-shared \ 
--disable-threads --with-gnu-ld --with-gnu-as --disable-multilib \
--disable-libspp --disable-libmud-flap --disable-libgomp --with-dwarf2 \
--with-newlib --disable-werror --with-cpu=cortex-m3 \
--with-mode=thumb --enable-target-optspace --with-float=soft \
--enable-languages=c,c++ --disable-interwork
make -j4 all-gcc
make install-gcc

Nun übersetzt auch das example:

cd ~/test
wget https://www.johannes-bauer.com/mcus/cortex/example.c
arm-none-eabi-gcc -o example -nostdlib -mtune=cortex-m3  example.c
export CROSS=arm-none-eabi-
${CROSS}objdump -d example
ergibt:

example:     Dateiformat elf32-littlearm


Disassembly of section .text:

00008000 
: 8000: b480 push {r7} 8002: b083 sub sp, #12 8004: af00 add r7, sp, #0 8006: 2300 movs r3, #0 8008: 607b str r3, [r7, #4] 800a: e00b b.n 8024 800c: 4a11 ldr r2, [pc, #68] ; (8054 ) 800e: 687b ldr r3, [r7, #4] 8010: 6013 str r3, [r2, #0] 8012: 687b ldr r3, [r7, #4] 8014: 43db mvns r3, r3 8016: 4a10 ldr r2, [pc, #64] ; (8058 ) 8018: f003 03c3 and.w r3, r3, #195 ; 0xc3 801c: 6013 str r3, [r2, #0] 801e: 687b ldr r3, [r7, #4] 8020: 3301 adds r3, #1 8022: 607b str r3, [r7, #4] 8024: 687b ldr r3, [r7, #4] 8026: 2b7f cmp r3, #127 ; 0x7f 8028: ddf0 ble.n 800c 802a: 4b0a ldr r3, [pc, #40] ; (8054 ) 802c: 681a ldr r2, [r3, #0] 802e: 4b0a ldr r3, [pc, #40] ; (8058 ) 8030: 681b ldr r3, [r3, #0] 8032: 4013 ands r3, r2 8034: 2b00 cmp r3, #0 8036: d003 beq.n 8040 8038: 4b06 ldr r3, [pc, #24] ; (8054 ) 803a: 2277 movs r2, #119 ; 0x77 803c: 601a str r2, [r3, #0] 803e: e002 b.n 8046 8040: 4b05 ldr r3, [pc, #20] ; (8058 ) 8042: 2299 movs r2, #153 ; 0x99 8044: 601a str r2, [r3, #0] 8046: 2300 movs r3, #0 8048: 4618 mov r0, r3 804a: 370c adds r7, #12 804c: 46bd mov sp, r7 804e: bc80 pop {r7} 8050: 4770 bx lr 8052: bf00 nop 8054: 11223344 .word 0x11223344 8058: 00c0ffee .word 0x00c0ffee

der Code ist anders, aber die Übersetzung und Linking hat funktioniert.

newlib als libc

cd ~/Downloads
wget ftp://sourceware.org/pub/newlib/newlib-4.2.0.20211231.tar.gz
cd /halde/tc-12.2.0/
tar -zxvf ~/Downloads/newlib-4.2.0.20211231.tar.gz
mkdir buildnewlib ; cd buildnewlib
../configure --prefix=/opt/tc-12.2.0-arm-cortex-m3 --target=arm-none-eabi --disable-multilib --disable-newlib-supplied-syscalls --disable-interwork
make
make install

Offene Fragen:

Hinweis: libc_nano soll Teil von newlib sein

git clone  git://sourceware.org/git/newlib-cygwin.git
mkdir buildnewlib4.3 ; cd buildnewlib4.3/
../newlib-cygwin/configure --prefix=/opt/tc-12.2.0-arm-cortex-m3 --target=arm-none-eabi --disable-multilib --disable-newlib-supplied-syscalls --disable-interwork
make

Informatik- und Netzwerkverein Ravensburg e.V Rudolf Weber