WINAVR GCC Optimierungs Problem

OP #698490
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
#698510
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.

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