Forum: Compiler & IDEs sprintf feuer ISR


von Martin S. (sirnails)


Lesenswert?

Guten Tag,

ich arbeite gerade an einem M3. Ich habe folgenden Code, der mir jedes 
Mal beim sprintf einen Fault-Interrupt feuert:
1
void
2
DebugShowCoordinates(signed int sx, signed int sy) {
3
  char OutBuffer[30] = {0};
4
5
  sprintf(OutBuffer, "FROM %i TO %i", sx, sy);
6
  SetErrorMessage(OutBuffer, 3, true);
7
};

Wo liegt da der Unterschied zum funktionierenden Code:
1
char txt[20];
2
unsigned short PixelBuffer[0];
3
4
retval = EdgeDetection(120, true, 320, 240);
5
CameraImageDataGet(false, (NEWPOS.x * 2), 120, 1, false, PixelBuffer);
6
7
sprintf(txt, "x=%i, y=%i, BRGHT=%u", retval.x, retval.y, (BLUEFROM565(PixelBuffer[0]) + GREENFROM565(PixelBuffer[0]) + REDFROM565(PixelBuffer[0])) / 3);
8
SetErrorMessage(txt, 1, true);

Hab ich Tomaten auf den Augen? Ich sehe da keinen Unterschied?!

Danke, Grüße
M. Schwaikert

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Verwende sicherheitshalber snprintf, auch wenn es eher 
unwahrscheinlich ist, daß Dein 30 Zeichen großer Puffer überschrieben 
wird.

Hast Du denn noch genügend Platz auf dem Stack? Als automatische 
Variable landet OutputBuffer natürlich dort.

Ansonsten:

  signed int sx

Das signed hier ist völlig überflüssig.

Anders als bei der heiligen Dreifaltigkeit char, unsigned char und 
signed char gibt es nur zwei Varianten beim int :

int und unsigned int.

von Martin S. (sirnails)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Verwende sicherheitshalber snprintf, auch wenn es eher
> unwahrscheinlich ist, daß Dein 30 Zeichen großer Puffer überschrieben
> wird.

Mach ich mal - nope, fliegt auch auseinander.

> Hast Du denn noch genügend Platz auf dem Stack? Als automatische
> Variable landet OutputBuffer natürlich dort.

Ja, der ist 2048 Byte groß. Das sollte reichen :)

>
> Ansonsten:
>
>   signed int sx
>
> Das signed hier ist völlig überflüssig.

Ich weiß. Es war nur zur Verdeutlichung, dass es sich eben um einen 
Signed handelt, und ich das nicht beim groben drüberfliegen übersehe.

von Martin S. (sirnails)


Lesenswert?

Hmm... also irgendwas überschreibt mir die Rücksprungadresse. Selbst 
wenn ich das snprinft auskommentiere, so zerlegt es mir das Programm 
beim SetErrorMessage.

EDIT: Kommando zurück, ich hab tatsächlich 2kB Stack verbraten. Hab ihn 
jetzt auf 4kB vergrößert und der Fehler ist weg.

Danke :)

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.