mikrocontroller.net

Forum: Compiler & IDEs FreeRtos/Newlib nano /Printf /mutex


Autor: Root (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss eine bestehende Software portieren. Verwendet wird jetzt der 
GCC Compiler und ein STM32L431. Es laufen zwei Tasks die gelegentlich 
per Printf ausgaben machen.
Jetzt sehen aber die Ausgaben auf der Schnittstelle aus wie ein Mix aus 
beiden Tasks.
Die Frage ist nun wie ich den Printf bei der NewLib Nano dahin bekomme 
einen zusätzlichen mutex zu verwenden.
Sowas in der Art:
void __printf_lock()
   {
   xSemaphoreTake(xSemaphorePrintf, PRINTF_TIMEOUT);  
   }
void __printf_unlock()
   {
   xSemaphoreGive(xSemaphorePrintf);
   }


: Verschoben durch Admin
Autor: Emma (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Wo ist nun die Frage?

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Root schrieb:

> Die Frage ist nun wie ich den Printf bei der NewLib Nano dahin bekomme
> einen zusätzlichen mutex zu verwenden.

Indem Du das beim printf der nanolib einbaust und sie neu compilierst. 
Einfacher und wahrscheinlich auch sinnvoller wäre es aber wohl, das bei 
den Tasks zu machen.

Autor: Root (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich wollte eher an einer zentralen Stelle eingreifen und auch nicht 
die min neu combilieren. Gibt es denn da keine Lösung oder eine 
Alternative zur Newlib nano die sowas bietet? Die min von crossworks 
haben sowas eingebaut. Aber von denen will man weg portieren

Autor: Root (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... die Lib neu ....

Autor: Felix F. (wiesel8)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib dir einen Wrapper.
void My_printf(...)
{
    Get_mutex();
    printf(...);
    Release_mutex();
}

mfg

Autor: Johannes S. (jojos)
Datum:

Bewertung
4 lesenswert
nicht lesenswert
Der gcc hat einen Mechanismus um Libfunktionen durch Wrapper zu 
ersetzen, dazu gibt es eine Linkeroption und die heisst sogar so wie man 
es vermuten könnte: '--wrap=printf'.
Dazu gibt es eine Aufrufkonvention um an die originale Funktion zu 
kommen.

Hier ist ein Beispiel aus der mbed lib für malloc wrapper:
https://github.com/ARMmbed/mbed-os/blob/master/pla...

Umgebogen werden die mit den Linkeroptionen:
--wrap=_malloc_r
--wrap=_free_r
--wrap=_realloc_r
--wrap=_memalign_r
--wrap=_calloc_r

Bei den Unterstrichen muss man genau zählen, das basiert alles auf 
Konventionen. Und die Aufrufreihenfolge der Libs und objs beim Linker 
ist wichtig, da bekommt man schnell unresolved Fehler. Aber wenn man es 
richtig macht funktioniert es :-)

: Bearbeitet durch User
Autor: Chlorotroll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist schon schlechtes Design zwei Tasks printen zu lassen...

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chlorotroll schrieb:
> Es ist schon schlechtes Design zwei Tasks printen zu lassen...

Nö, eigentlich nicht. Für Debug-Ausgaben ist das ganz OK. Ist halt nur 
doof, wenn der Scheduler einen unterbricht.

Eventuell wär's ja auch schon ausreichend, printf auf unbuffered zu 
stellen.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Per MSG Daten an einen Ausgabe Threat senden und der ist dann der 
einzige der die SIO benutzt, gilt auch für die andere Richtung.
Das ist dann eine saubere Sache und man kann dann unentlich viele Task 
als sender einbauen.
Nur irgentwann ist die Queue halt voll und auch 115.200 können nicht 
zaubern.

Autor: Root (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Vorschläge. Sind sicher auch brauchbar. Aber im 1. 
Schritt soll die SW halt "nur" portiert werden.

Und gerade dabei sind Debug Ausgaben via Printf nicht schlecht ....

Deshalb werd ich mir das mit dem "wrap"pen mal anschauen.

Theoritisch müsste ich ja puts auch entsprechend nachbearbeiten oder 
gibt es eine Funktion die von beiden (printf, puts) gemeinsam benutzt 
wird?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.