mikrocontroller.net

Forum: Compiler & IDEs Kürzungsmöglichkeiten?


Autor: Steffen T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein "Progrämmchen" ist etwas zu groß geworden, vllt findet einer von 
euch noch eine Möglichkeit etwas zu kürzen... Ich habe schon Stunde in h 
abgekürzt, damit es etwas weniger Speicher frisst, aber es reicht noch 
nicht... (also eine abgespeckte Version, wenn z.B. wieder von 0,0,0 
anstatt von der aktuellen Uhrzeit gestellt wird habe ich schon)

Bevor ich es vergesse... das Programm steuert eine LCD Anzeige an und 
frägt zu Beginn die aktuelle Uhrzeit ab, danach läuft die Uhr und man 
kann sie wieder stellen, wenn man nochmals den Taster drückt...

Vielleciht findet auch noch einer eine Verbesserung, denn im Moment ist 
es ja so, dass die Uhrzeit nicht ununterbrochen läuft sondern, imer 
wieder aussetzt, wenn Daten an das LCD-Display geschickt werden...

Hier der Code:
#include "lcd.c"
#include <avr/interrupt.h>

volatile unsigned char time_ist; 
unsigned char Buffer[20];
unsigned int std=0;
unsigned int min=0;
unsigned int sek=0;

ISR (TIMER1_COMPA_vect  ) {
  time_ist++;
}

void timer (unsigned long time_soll) {
  time_ist = 0;
  TCCR1A = 0;      
  TCCR1B = 1 <<CS10;   
  TCCR1B |= 1 <<WGM12;
  OCR1A = 64000 ;     
  TIMSK = 1 << OCIE1A;   
  sei();
  while (time_soll >= time_ist) {}
}

int zeit (int einheit, int umbruch,const char* worte){
  lcd_clrscr ();
  lcd_puts (worte);
  itoa( einheit, Buffer, 10 );
  lcd_puts (Buffer);
  timer(50);
  while(PIND & (1<<PIND4) )
    if(!(PIND & (1<<PIND3) )) {  
    if(++einheit == umbruch) einheit = 0; 
    lcd_clrscr ();
    lcd_puts (worte);
      itoa( einheit, Buffer, 10 );
    lcd_puts (Buffer);
    timer(50);
  }
  return einheit;
};

void stellen(){
  std = zeit(std,24,"h: ");
  min = zeit(min,60,"min: "); 
  sek = zeit(sek,60,"s: ");
}

int main (void) {

  PORTD= 0x18;
  DDRD = 0x18; 
  lcd_init (LCD_DISP_ON);
  stellen();
    
  for (;;){  
    timer (250);
  if(++sek == 60){
  sek = 0;
      if(++min == 60){
      min = 0;
        if(++std == 24){ 
    std = 0;
    }
      }
    }
    lcd_clrscr ();
  lcd_puts ("    ");
    if(std < 10) lcd_puts("0");
    itoa( std, Buffer, 10 );
  lcd_puts (Buffer);
  lcd_puts(":");
    if(min < 10) lcd_puts("0");
    itoa( min, Buffer, 10 );
  lcd_puts (Buffer);
  lcd_puts(":");
  if(sek < 10) lcd_puts("0");
    itoa( sek, Buffer, 10 );
  lcd_puts (Buffer);
    if(!(PIND & (1<<PIND4))) stellen();
  };
}

Vielen Dank schon einmal :)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Stück Code, was du gepostet hast, ist so kurz, dass es auch von
einem kleineren AVR nur einen Bruchteil des Flash-Speichers füllt. Es
bringt also nicht allzu viel, hier etwas zu optimieren. Wenn es nur um
ein paar Bytes geht, kannst du folgendes probieren:

- Compiler-Option -Os, falls du das noch nicht hast

- alle Funktionen mit Ausnahme des Interrupthandlers und main als
  static deklarieren, dies führt bei aktivierter Optimierung dazu,
  dass sie geinlinet wedren

- 16-Bit-Variablen, wo es der Wertebereich erlaubt, durch
  8-Bit-variablen ersetzen

- evtl. brint es etwas itoa durch eine eigene Funktion zu ersetzen,
  die auf Basis 10 und zwei Ziffern beschränkt ist

Ansonsten gibt es vielleicht in lcd.c noch etwas zu tun.

Aber es wundert mich dennoch, wie du mit diesem kleinen Programm 1 KB
vollbekommst, es sei denn, du hast die Optimierung deaktiviert und
lcd.c verwendet Dinge wie die Delays aus delay.h. Dann sollte -Os
auf jeden Fall die Lösung sein.

Autor: Steffen T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke :)

Der gesamte Speicher war zumindest voll...

Wo kann ich im AVR Studio diese Compiler Option -0s auswählen?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Oh Ess", nicht "Null Ess"

Spätestens im Makefile.

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Project"->"Configuration Options"->"General" "Optimization" (zum 
aufklappen: O0,O1,O2,O3,Os)

Autor: Steffen T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön :)

Was bewirkt dieses Os genau?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optimierung nach (Code)Größe

Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.