Forum: Compiler & IDEs GCC-ARM, C-Library und Syscalls


von Tobias P. (hubertus)


Lesenswert?

Moin moin,

ich möchte für den STM32F4 C-Code compilieren (und natürlich auch 
debuggen). Dazu verwende ich den GCC von hier

https://launchpad.net/gcc-arm-embedded

unter 64 Bit Linux. Soweit läuft alles bestens, mein Code compiliert und 
lässt sich mit einem Segger J-Link hervorragend debuggen. Nun möchte ich 
aber noch eine String-Ausgabe per UART realisieren. Auf der Arbeit 
hatten wir IAR EWARM verwendet, dort konnte man einfach printf() 
benutzen, welches dann eine Funktion (write()) aufrief, die dann 
einzelne Bytes an den UART sandte. Ich will das hier mit diesem GCC auch 
so haben. Dazu aber ein paar Fragen:

1. wie muss ich das genau implementieren, damit am Schluss meine 
einzelnen Characters an den UART kommen? ich habe irgendwo gelesen, dass 
man ein paar Syscalls selber implementieren muss. Ich finde aber 
nirgends eine Liste, welche das genau sind.

2. Ich bin mir nicht ganz sicher, welche C-Library der oben angegebene 
Compiler verwendet. Ich vermute aber, es ist die Newlib. Diese hat eine 
printf() (und auch sprintf()) implementierung, welche malloc() benutzt. 
Ich möchte malloc() wenn möglich vermeiden. Kann ich dem Compiler eine 
andere C-Library unterjubeln, oder wie würde man dies am geschicktesten 
realisieren?

3. Ich habe Elm Chans FATFS auf meinem Target laufen. Kann man dieses 
unter Umständen über die Syscalls mit den normalen C-Aufrufen für 
Filehandling verheiraten?


Vielen Dank für eure Tipps.

Grüsse
Tobias

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Tobias Plüss schrieb:
> ich habe irgendwo gelesen, dass
> man ein paar Syscalls selber implementieren muss. Ich finde aber
> nirgends eine Liste, welche das genau sind.

Schau mal hier rein:
Beitrag "Re: ARM - Probleme mit sprintf (Linkerfehler)"
> _ssize_t _write(int fd, const void *buf, size_t count)
> int _close(int fd)
> int _fstat(int fd, struct stat *sb)
> int _isatty(int fd)
> off_t _lseek(int fd, off_t offset, int whence)
> _ssize_t _read(int fd, void *buf, size_t count)
> void _exit(int status)
> int _kill(int pid, int signal)
> int _getpid(void)
>
> Teilweise sind es natürlich nur stubs oder dummies.

Gruesse

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.