mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik WINAVR GCC Optimierungs Problem


Autor: Peter Pan (micropirate)
Datum:

Bewertung
0 lesenswert
nicht 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)
void DisplayStringFlash(PGM_P p_flashstring, ...)
{
  va_list ap;
  BYTE len= strlen_P(p_flashstring);
  char* tempstring;
  len+=4;  //safty for word
  //Allocate new memory if memory already exist
  if(displaybuffer.buffer)
  {
    //buffer needs to be deleted and newly allocated
    while(displaybuffer.bufferlock){};
    free(displaybuffer.buffer);
    displaybuffer.buffer=(char*)malloc(len);
    tempstring=(char*)malloc(len);
  }
  else
  {
    //buffer does not exist an need to be allocated
    displaybuffer.buffer = (char*)malloc(len);    
    tempstring=(char*)malloc(len);
  }
  strcpy_P(tempstring,p_flashstring);
  va_start(ap,tempstring);
  while(displaybuffer.bufferlock){};
  vsprintf(displaybuffer.buffer,tempstring,ap);  <- Das problem sitzt hier denk ich 
  va_end(ap);
  free(tempstring);
  displaybuffer.direction=LEFT;
  displaybuffer.scroll=1;
  displaybuffer.startindex=0;
}

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Pan (micropirate)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.