sprintf reentrant? ARM C library

Gast #3131800
Lesenswert?
• ▲
▼
Hallo,

aus der Dokumentation der ARM C Libraries geht nicht eindeutig hervor, 
ob sprintf thread-safe ist oder nicht:

spintf, sscanf, ... :
When using these functions, the string-based functions read the locale 
settings. TYPICALLY, they are thread-safe. However, if you change locale 
in mid-session, you must ensure that these functions are not affected. 
The string-based functions, such as sprintf() and sscanf(), do not 
depend on the stdio library.

Implementierung in meinem Projekt:
- Cortex M3, STM32F105..
- Call von sprintf in main
- Call von sprintf in ISR USART3
- dadurch massive Probleme

(M)ein Lösungsansatz:
- zwei memory regions
- main ist region-1 zugeordnet
- ISR ist region-2 zugeordnet
- jetzt keine Probleme

- Warum ist bei mir sprintf NICHT thread-safe?
- Wann genau ist sprintf 'ATYPICAL' thread-UNSAFE?

Gruß Claus
#3131829
Lesenswert?
• ▲
▼
Um das zu beantworten muss man wissen was z.B. printf macht. Die 
Library-Funktion mündet am ende ja nicht automaisch in eine Hardware-, 
oder eine Speicher-Operation. Sie mündet in eine von dir zu 
implementierende write-Funktion.

Wenn du an dieser Stelle nun auf globalen Speicher oder eine Peripherie 
zugreifst, dann musst du dich um die sicherheit kümmern und diesen 
Programmcode reentrant auslegen. Damit hat also die Library-Funktion 
nichts zu tun.

Nehmen wir als weiteres Beispiel die Fuktion sprintf. Dieser Funktion 
gibst du einen Speicherebereich mit, in dem die Funktion arbeitet. Wenn 
dieser Speicherbereich global deklariert ist und von meheren Tasks oder 
Interrupts genutzt wirds, dann musst du den Aufrufer der Funktion 
sprintf entsprechend gegen reentranz sichern.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.