Forum: Mikrocontroller und Digitale Elektronik sprintf reentrant? ARM C library


von claus (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

claus schrieb:
> However, if you change locale in mid-session

Machst Du das denn?

von Star K. (starkeeper)


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.

von Udo S. (urschmitt)


Lesenswert?

Star Keeper schrieb:
> Sie mündet in eine von dir zu implementierende write-Funktion.
sprintf()??????

claus schrieb:
> - dadurch massive Probleme

Woher weisst du daß die Probleme von sprintf kommen?

Rufus Τ. Firefly schrieb:
> claus schrieb:
>> However, if you change locale in mid-session
>
> Machst Du das denn?

Eben.

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.