Programmgröße

Gast #1187703
Hallo,

ich habe folgendes Programm:
1
#include <avr/io.h>        // Pins
2
#include <util/delay.h>    // Verzögerung
3
int main()
4
{
5
  DDRB |= (1 << DDB4);     // PortB Pin4 als Ausgang einstellen
6

7
        char brightness = 100;
8
  while (1)
9
  {
10
    PORTB |=  (1 << PB4);
11
          _delay_us(brightness);
12
          PORTB &= ~(1 << PB4);
13
          _delay_us(255 - brightness);
14
  }
15
}

dann hat das Programm folgende Größe:
1
avr-size --format=berkeley -t eiscube.elf
2
   text     data      bss      dec      hex  filename
3
    100        0        0      100       64  eiscube.elf
4
    100        0        0      100       64  (TOTALS)

Wenn ich allerdings die PWM-Funktion auslagere:
1
#include <avr/io.h>        // Pins
2
#include <util/delay.h>    // Verzögerung
3

4
void pwm(char brightness)  // PWM
5
{
6
  PORTB |=  (1 << PB4);
7
  _delay_us(brightness);
8
  PORTB &= ~(1 << PB4);
9
  _delay_us(255 - brightness);
10
}
11

12
int main()
13
{
14
  DDRB |= (1 << DDB4);     // PortB Pin4 als Ausgang einstellen
15

16
  while (1)
17
  {
18
    pwm(100)
19
  }
20
}

hat das Programm folgende Größe:
1
avr-size --format=berkeley -t eiscube.elf
2
   text     data      bss      dec      hex  filename
3
   4186      264        0     4450     1162  eiscube.elf
4
   4186      264        0     4450     1162  (TOTALS)

was bereits zu groß für meine ATtiny13 ist. Was kann ich machen, um die 
Programmgröße kleinzuhalten und trotzdem nicht auf Funktionen verzichten 
zu müssen?
Gast #1187706
Es wär ein Anfang, die Anleitung zur C-Bibliothek zu lesen. Da steht zum 
Beispiel drinne, dass man _delay_us und _delay_ms nur mit konstanten 
Werten benutzen soll.

Ansonsten empfiehlt sich für PWM ganz ungemein die Verwendung der 
PWM-Module des Prozessors.
Gast #1187715
Alles klar, vielen Dank!

ist hieran etwas auszusetzen?
1
void delay_ms(int time)
2
{
3
    char i;
4
    for (i = 0; i < time; i++)
5
    {
6
        _delay_ms(1);
7
    }
8
}
Gast #1187842
Ok... also vielleicht mit einem Switch vorher prüfen in welcher 
Größenordnung das Delay liegt, solange warten und dann noch ein paar 
1ms-Delays hintendran. Damit könnte ich die Genauigkeit doch steigern, 
oder?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.