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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren