Forum: Mikrocontroller und Digitale Elektronik sprintf funktioniert bei Tasks nicht??


von Maximilian P. (maxpis)


Lesenswert?

Guten Tag,

ich habe folgendes Problem und zwar wird alle 15 Sekunden eine Task 
aufgerufen. In der Task wird die Funktion sendeNachricht() aufgerufen 
und die Nachricht "SMS nicht aktiv" wird auf der Konsole ausgegeben. 
Wenn ich sprintf() in der Funktion sendeNachricht() verwende, hängt sich 
alles auf und der Task wird nicht mehr aufgerufen. Woran kann das 
liegen? Wenn ich sprintf in der main.c verwende funktionierts 
einwandfrei, jedoch in einer Task garnicht. Sobald ich sprintf aus der 
Funktion entferne funktioniert es wieder. Ich verwende IDE Atmel Studio 
und den Mikrocontroller ATSAMC21.
1
#include <stdio.h>
2
3
static void task_15s()
4
{
5
   while (1)
6
   {
7
        sendeNachricht();
8
        os_sleep(15000);
9
   }
10
}
11
12
void sendeNachricht( void )
13
{
14
      
15
   uint8_t SOC = 92;
16
   char text[10];  
17
   sprintf(text, "Zustand der Fahrzeugbatterie: Ladezustand(SOC) = %d %%",SOC);    
18
19
   io_write(edgb, (uint8_t *)"SMS nicht aktiv!!!\n", 19
20
}

Vielen Dank schon einmal für eure Antworten.

Grüße Max

von nktio (Gast)


Lesenswert?

Antwort steckt in diesen 2 Zeilen:
---------

   char text[10];
   sprintf(text, "Zustand der Fahrzeugbatterie: Ladezustand(SOC) = %d 
%%",SOC);

---------

von jo mei (Gast)


Lesenswert?

Maximilian P. schrieb:
> char text[10];
>    sprintf(text, "Zustand der Fahrzeugbatterie: Ladezustand(SOC) = %d
> %%",SOC);

Soviel ich weiss hat sprintf keine Datenkompression implemeniert.

von leo (Gast)


Lesenswert?

Maximilian P. schrieb:
> char text[10];
>    sprintf(text, "Zustand der Fahrzeugbatterie: Ladezustand(SOC) = %d
> %%",SOC);

Das sind sicher weitaus mehr als 10 Zeichen und overflowed daher massiv.

snprintf hilft da.

leo

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

leo schrieb:
> Das sind sicher weitaus mehr als 10 Zeichen und overflowed daher massiv.
>
> snprintf hilft da.

Naja, es hilft auch, einfach den Buffer zu vergrössern. Und ob 
snprintf() überhaupt implementiert ist, wissen wir ja nicht.

von Stefan F. (Gast)


Lesenswert?

Matthias S. schrieb:
> ob snprintf() überhaupt implementiert ist, wissen wir ja nicht.

Für wie wahrscheinlich hältst du den Fall, dass snprintf() fehlt?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan ⛄ F. schrieb:
> Für wie wahrscheinlich hältst du den Fall, dass snprintf() fehlt?

50:50, da wir nichts über die Programmierumgebung wissen. Für winzige 
Controller gibt es auch winzige Libs.

Aber kurieren am Symptom bringt eh nix, also doch den Buffer 
vergrössern.

von Stefan F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Stefan ⛄ F. schrieb:
>> Für wie wahrscheinlich hältst du den Fall, dass snprintf() fehlt?
>
> 50:50

Ich plädiere für maximal 1% Wahrscheinlichkeit. snprintf() gehört 
nämlich zum Standard C99 und wurde von allen mir bekannten C Compilern 
sogar sehr viel früher implementiert.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Naja, es hilft auch, einfach den Buffer zu vergrössern.

Eben. snprintf() mit Argument 10 hilft hier nicht viel weiter. ;-)

von Hmmm (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich plädiere für maximal 1% Wahrscheinlichkeit. snprintf() gehört
> nämlich zum Standard C99 und wurde von allen mir bekannten C Compilern
> sogar sehr viel früher implementiert.

Dann hattest Du offenbar noch nicht viel mit Windows zu tun.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan ⛄ F. schrieb:
> wurde von allen mir bekannten C Compilern
> sogar sehr viel früher implementiert.

Ich weiss was du meinst, aber das hat mit den Compilern nichts zu tun. 
Das ist eine Frage der Libraries.

von Stefan F. (Gast)


Lesenswert?

Hmmm schrieb:
> Dann hattest Du offenbar noch nicht viel mit Windows zu tun.

Ich habe mit DOS und Windows 3.0 angefangen.

von Stefan F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Ich weiss was du meinst, aber das hat mit den Compilern nichts zu tun.
> Das ist eine Frage der Libraries.

Ja, du hast recht. Ich meinte die natürlich die Libraries.

von Hmmm (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich habe mit DOS und Windows 3.0 angefangen.

Unter Windows gibt es ein C99-snprintf() erst seit Visual Studio 2015 
und der CRT von Windows 10.

Davor gab es nur ein kaputtes _snprintf() und das MS-eigene *_s()-Zeug.

von Stefan F. (Gast)


Lesenswert?

Hmmm schrieb:
> Unter Windows gibt es ein C99-snprintf() erst seit Visual Studio 2015
> und der CRT von Windows 10.
> Davor gab es nur ein kaputtes _snprintf() und das MS-eigene *_s()-Zeug.

Was für ein Käse, echt? Ich hatte damals mit Borland Pascal, später 
Turbo Pascal programmiert.

von leo (Gast)


Lesenswert?

Frank M. schrieb:
> Eben. snprintf() mit Argument 10 hilft hier nicht viel weiter. ;-)

Klar, aber der Fehler faellt doch eher auf, zumindest wenn man die selbe 
Puffergroesse (defined) fuer Puffer und snprintf verwendet.

leo

von Stefan F. (Gast)


Lesenswert?

Zumindest der gcc von Linux spuckt da eine dicke fette Warnung aus:
1
sfrings@stefanpc:~/Downloads$ gcc test.c
2
test.c: In function ‘main’:
3
test.c:8:24: warning: ‘Dieser Text ist zu lang’ directive writing 23 bytes into a region of size 10 [-Wformat-overflow=]
4
    8 |   sprintf(a,"Dieser Text ist zu lang");
5
      |              ~~~~~~~~~~^~~~~~~~~~~~~
6
test.c:8:3: note: ‘sprintf’ output 24 bytes into a destination of size 10
7
    8 |   sprintf(a,"Dieser Text ist zu lang");
8
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1
sfrings@stefanpc:~/Downloads$ gcc test.c
2
test.c: In function ‘main’:
3
test.c:8:35: warning: ‘Dieser Text ist zu lang’ directive output truncated writing 23 bytes into a region of size 10 [-Wformat-truncation=]
4
    8 |   snprintf(a,sizeof(a),"Dieser Text ist zu lang");
5
      |                         ~~~~~~~~~~^~~~~~~~~~~~~
6
test.c:8:3: note: ‘snprintf’ output 24 bytes into a destination of size 10
7
    8 |   snprintf(a,sizeof(a),"Dieser Text ist zu lang");
8
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sogar in bunt - neuerdings.

von leo (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Zumindest der gcc von Linux spuckt da eine dicke fette Warnung aus

Yep, das werden wohl die meisten modernen Compiler so machen, genau wie 
die meisten Anfaenger Warnungen ignorieren, nicht sehen, nicht 
einschalten, Fehl interpretieren, usw.

leo

von leo (Gast)


Lesenswert?

leo schrieb:
> die meisten Anfaenger Warnungen ignorieren, nicht sehen, nicht
> einschalten, Fehl interpretieren,

BTW mein Ex-Chef schaltete diese "sinnlosen" Warnungen immer aus, es hat 
ca. 2 Jahre gekostet, ihn vom Gegenteil zu ueberzeugen ...

leo

von Maximilian P. (maxpis)


Lesenswert?

Also mit snprintf funktionierts einwandfrei!

Vielen Dank für Eure Antworten und Hilfe!

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.