Forum: Mikrocontroller und Digitale Elektronik WINAVR GCC Optimierungs Problem


von Peter P. (micropirate)


Lesenswert?

Hallo
Ich bin neu im Forum und versuch mal mein Glück, weil mit meinem Latein
bin ich definitiv am Ende. Und da ich GCC nicht aufgeben will mein
Gesuch hier an alle besser Erfahrenen...

ich verwende WINAVR mit comilper avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
sobald ich die Optimierungs option Os einschalte funktioniert diese
ausgabe nicht mehr.
Warscheinlich liegt es an dem warning welches ich in diesem fall nicht
wegbekommen denn es gibt keine vsprintf_P leider nicht.
(warning: second parameter of 'va_start' not last named argument)
1
void DisplayStringFlash(PGM_P p_flashstring, ...)
2
{
3
  va_list ap;
4
  BYTE len= strlen_P(p_flashstring);
5
  char* tempstring;
6
  len+=4;  //safty for word
7
  //Allocate new memory if memory already exist
8
  if(displaybuffer.buffer)
9
  {
10
    //buffer needs to be deleted and newly allocated
11
    while(displaybuffer.bufferlock){};
12
    free(displaybuffer.buffer);
13
    displaybuffer.buffer=(char*)malloc(len);
14
    tempstring=(char*)malloc(len);
15
  }
16
  else
17
  {
18
    //buffer does not exist an need to be allocated
19
    displaybuffer.buffer = (char*)malloc(len);    
20
    tempstring=(char*)malloc(len);
21
  }
22
  strcpy_P(tempstring,p_flashstring);
23
  va_start(ap,tempstring);
24
  while(displaybuffer.bufferlock){};
25
  vsprintf(displaybuffer.buffer,tempstring,ap);  <- Das problem sitzt hier denk ich 
26
  va_end(ap);
27
  free(tempstring);
28
  displaybuffer.direction=LEFT;
29
  displaybuffer.scroll=1;
30
  displaybuffer.startindex=0;
31
}

mein makefile mit allen options schaut so aus

CPPFLAGS = -g$(DEBUG)
CPPFLAGS += $(CPPDEFS)
CPPFLAGS += -O$(OPT)
#CPPFLAGS += -mint8
#CPPFLAGS += -mshort-calls
CPPFLAGS += -funsigned-char
CPPFLAGS += -funsigned-bitfields
CPPFLAGS += -fpack-struct
CPPFLAGS += -fshort-enums
CPPFLAGS += -fno-exceptions
#CPPFLAGS += -fno-unit-at-a-time
CPPFLAGS += -Wall
#CPPFLAGS += -Wstrict-prototypes
CFLAGS += -Wundef
#CPPFLAGS += -Wunreachable-code
#CPPFLAGS += -Wsign-compare
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
#CPPFLAGS += $(CSTANDARD)


also über hilfe jeglicher art wäre ich echt dankbar, weil sonst müsste
ich GCC wirklich aufgeben... sniff

danke mal

von Andreas K. (a-k)


Lesenswert?

In meiner Version des gleichen WinAVR existiert vsprintf_P, zumindest in 
der Doku.

Das löst aber nicht dein Problem. Das ist eher prinzipieller Natur. Denn 
aus der Länge des Formatstrings einer printf-Funktion ergibt sich nicht 
so einfach die Länge des benötigten Ausgabepuffers, schon garnicht mit 
strlen.

Was besser funktioniert, aber ganz anders arbeitet: Eine eigene 
Ausgaberoutine für ein Display-Zeichen bauen und als Devicefunktion ins 
stdio reinhängen. Schau dazu mal in die avrlibc-Doku zu stdio.h rein, 
unter "Running stdio without malloc".

Von malloc würde ich generell abraten, insbesondere von häufiger 
auftretender Reallokation. Man verliert jede Übersicht über das Ausmass 
benutzen Speichers. Und wenn's unbedingt dynamisch sein muss, dann ist 
für temporäre Zwecke innerhalb einer Funktion alloca sinnvoller.

von Peter P. (micropirate)


Lesenswert?

Hallo,

Ja ich seh es ein... mein fehler

War aber echt hilfreich der hint...

Wollte nicht stdio umleiten... wird wohl nichts nützen

Aber das löst auch viele andere stdout probleme und eröffnet neue 
möglichkeiten.


thx
pete

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.