sprintf funktioniert bei Tasks nicht??

OP #6158584
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
Gast #6158614
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.
Gast #6158638
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.
Gast #6158661
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.

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.