Hallo Leute
ich hab da eine Frage zu C auf STM32. Ich habe mir da vor Jahren ein
Makefile zusammenkopiert, und ein minimalistisches Linkerscript und
einen Startupcode für STM32 geschrieben. Ich habe versucht, so viel wie
nur geht weg zu lassen.
Startupcode, Linkerscript und Makefile scheinen wunderbar zusammen zu
funktionieren für C. Was ich noch nicht getestet habe, ist malloc(),
dafür müsste man wohl noch ein spezielles Symbol im Linkescript
definieren (ist das richtig?).
Dazu 2 Fragen.
1) für malloc() und free() muss die Funktion sbrk definiert sein. Sollte
nicht die Standardlibrary die beinhalten? ich habe ehrlich gesagt
absolut keinen Schimmer, welche Library ich verwende, ich habe nur
gcc-arm-none-eabi in der neuesten verfügbaren Version installiert:
1 | $ arm-none-eabi-gcc -v
|
2 | Using built-in specs.
|
3 | COLLECT_GCC=arm-none-eabi-gcc
|
4 | COLLECT_LTO_WRAPPER=/usr/libexec/gcc/arm-none-eabi/9.2.0/lto-wrapper
|
5 | Target: arm-none-eabi
|
6 | Configured with: ../gcc-9.2.0/configure --prefix=/usr --mandir=/usr/share/man --with-pkgversion='Fedora 9.2.0-1.fc31' --with-bugurl=https://bugzilla.redhat.com/ --infodir=/usr/share/info --target=arm-none-eabi --enable-interwork --enable-multilib --with-python-dir=share/arm-none-eabi/gcc-9.2.0/python --with-multilib-list=rmprofile --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-newlib --disable-nls --disable-shared --disable-threads --with-gnu-as --with-gnu-ld --with-gmp --with-mpfr --with-mpc --with-headers=yes --with-system-zlib --with-sysroot=/usr/arm-none-eabi
|
7 | Thread model: single
|
8 | gcc version 9.2.0
|
eventuell ist es die newlib, die benutzt wird?
Jedenfalls, was muss ich noch ändern, damit malloc funktioniert?
2) eventuell würde ich auch gern C++ verwenden, dazu bin ich aber nicht
sicher, ob ich im Linkerscript die Sektionen .ctors/.dtors benötige,
ODER das __preinit_array und __init_array. Man findet beide Varianten im
Netz.
Und was muss im Startupcode noch hinzugefügt werden? ich dachte immer,
dass der Startupcode auch beim GCC beiliegt, aber das scheint nicht der
Fall zu sein.