Forum: Mikrocontroller und Digitale Elektronik AVR Atiny2313


von Paul E. (paul_e)


Lesenswert?

Hallo,
ich bin auf der Suche nach einem Rechenintensiven Beispielprogramm für 
den kleinen Atiny2313 in C oder ASM.
Am liebsten wäre mir was ohne externe Hardware also keine Display 
Ansteuerung zum Beispiel. Probiert habe ich selber schon Fibonacci in C, 
bin mir aber sicher das der Kleine auch noch mehr kann.
Gibt es irgendwelche Hash-Wert Implementierungen z.B.? Ich bin sehr 
gespannt auf eure Anregungen und was Ihr schon so schönes damit gemacht 
habt.
Gruß
eac

von Pi. Lot (Gast)


Lesenswert?

Paul E. schrieb:
> ich bin auf der Suche nach einem Rechenintensiven Beispielprogramm für
> den kleinen Atiny2313 in C oder ASM.

Pi auf 1000 Stellen. Was Sinnvolles soll es ja nicht sein.
Oder willst Du nur etwas zum Abschreiben haben?

von pFFTh (Gast)


Lesenswert?

"Ohne externe Hardware" macht m.E. wenig Sinn, dann kannst du das ja 
gleich am PC machen...
Leider hat dein Tiny keinen ADC, sonst wär FFT oder Görtzel ein 
Paradebeispiel.

Wenn's dir nur um's Verbraten von Rechenzeit geht:

while(1) i++;

Nach Beendigung der Schleife enthält i die "Antwort auf die Frage".
Kann nur ein wenig dauern.

Wenn's halbwegs sinnvoll sein soll: Versuch eine AES-Implementierung mit 
V-USB zu verheiraten, mach dir deinen eigenen "Crypto-Coprozessor" ;)

von Paul E. (paul_e)


Lesenswert?

Ich wollte eigentlich verschiedene Debugger damit testen und vergleichen 
und while(1) gibt mir da nicht so viel Aussage.
Die Zahl Pi auf 1000 Stellen mit einem 8bit µController geht das?
Gruß
eac

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Paul E. schrieb:
> Die Zahl Pi auf 1000 Stellen mit einem 8bit µController geht das?

Klar. Das Ergebnis ist 3.0 ;)

von Fibonacci (Gast)


Lesenswert?

Also mit den Fibonaccizahlen per RS232 ausgeben kannste den kleinen wohl 
kaum belasten.

Ich hab schon die Fibonaccizahlen auf einem Basic Stamp BS1 (in der 
Schule) sowie auf dem GTR (Casio CFX 9850GC+) programmiert. Selbst für 
die beiden war das keine große Aufgabe.

von Peter D. (peda)


Lesenswert?

Paul E. schrieb:
> ich bin auf der Suche nach einem Rechenintensiven Beispielprogramm für
> den kleinen Atiny2313 in C oder ASM.
1
int main()
2
{
3
  uint64_t i, j;
4
5
  DDRB = 0xFF;
6
  for( j = 0; j; j++ )
7
    for( i = 0; i; i++ )
8
      PORTB = i;
9
  PORTB = 0xA5;   
10
}

Das ist so rechenintensiv, daß keiner von uns das Ergebnis erleben wird.
Man könnte nachrechnen, ob die Erde dann noch existiert.


Peter

von Paul E. (paul_e)


Lesenswert?

Jo so ungefähr war mein Gedankengang auch. Obwohl ich eine Festkommazahl 
genommen hätte. Dann wären es immerhin 5 Nachkommabits ;-D
Noch andere Vorschläge? Gibt es keine Verfahren mit denen man Daten für 
die Übertragung per Usart z.B. verschlüsselt?
eac

11001000=3.125

von pFFTh (Gast)


Lesenswert?

Paul E. schrieb:
> Ich wollte eigentlich verschiedene Debugger damit testen und vergleichen
> und while(1) gibt mir da nicht so viel Aussage.

Klar. Dann sollest du aber den Debugger richtig fordern, reines Rechnen 
ist eher ein Test für den Compiler (und der funktioniert...)
Also: Interrupts verwenden, Daten hin- und herverschieben, Variablen am 
Stack etc.

Soft-PWM wär dafür z.B. ein schönes Testprogramm...

Zum Spaß kannst du ja mal ein "volatile" entfernen, und schauen, ob dir 
dein Debugger beim Suchen hilft ;)

Mein bevorzugter Debugger besteht übrigens aus ner LED und einem 
Widerstand. Reicht in gefühlt 99% der Fälle.

von Paul E. (paul_e)


Lesenswert?

Ich weiß schon das die Herausforderung eines Debbugers eher in der 
Peripherie besteht also z.B. Usart mit Stimuli. Dazu sollte aber erst 
mal der innere Kern zu 100% funktionieren. Man könnte sich jetzt  einen 
Testcase aus den Fingern saugen der alle Befehle benutzt, aber ich 
dachte das ein kleines sinnvolles C-Programm mit irgendwelchen 
Berechnungen. Siehe Fibonacci. Das ist dann Realitätsnäher und sinnvoll.
Gruß
eac

von pFFTh (Gast)


Lesenswert?

Timer-IRQs reichen völlig um den Debugger zu fordern, deshalb mein 
Soft-PWM Vorschlag. Musst ja noch nichtmal die LEDs anschliessen, 
das läuft auch auf dem nackten Tiny.

fib hingegen kann dir höchstens zeigen, wie man mit dem Debugger einen 
Stack-Überlauf feststellt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du könntest zum Beispiel Laufzeit-Tests aus GCCs testsuite [1] 
durchnudeln wie zum Beispiel [2] oder [3] falls die Programme nicht 
bereits zu groß für einen ATtiny2313 sind.

Interrupts finden sich in der Testsuite natürlich nicht.

[1]
http://gcc.gnu.org/viewcvs/trunk/gcc/testsuite/gcc.c-torture/execute/

[2]
http://gcc.gnu.org/viewcvs/trunk/gcc/testsuite/gcc.c-torture/execute/arith-rand.c?revision=138078&content-type=text%2Fplain&view=co

[3]
http://gcc.gnu.org/viewcvs/trunk/gcc/testsuite/gcc.c-torture/execute/arith-rand-ll.c?revision=138078&content-type=text%2Fplain&view=co

von pFFTh (Gast)


Lesenswert?

Johann L. schrieb:
> Interrupts finden sich in der Testsuite natürlich nicht.

Womit diese zum Debugger-Auswählen auch nicht so wirklich taugen.

Das ist als wenn man sich ein Fahrrad für eine Alpenüberquerung danach 
aussucht, ob man damit ohne Platten zum Aldi und zurück kommt.

Fehler in den Algorithmen debuggt man am Einfachsten, indem man den 
Sourcecode einfach am PC übersetzt und dort ausführt.
Den Debugger am µC brauchst du eigentlich nur wenn es um µC-Eigenheiten 
oder Hardware-Interaktion geht, Hardware will der TE möglichst nicht, 
also sollte er wenigstens ein paar Timer-IRQs in seinem Testprogramm 
haben.

Schließlich will er den Debugger testen, und nicht kontrollieren, ob der 
GCC auch korrekten Code erzeugt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

pFFTh schrieb:
> Johann L. schrieb:
>> Interrupts finden sich in der Testsuite natürlich nicht.
>
> Womit diese zum Debugger-Auswählen auch nicht so wirklich taugen.
>
> Das ist als wenn man sich ein Fahrrad für eine Alpenüberquerung danach
> aussucht, ob man damit ohne Platten zum Aldi und zurück kommt.

Nicht ganz. Ein Programm besteht ja nicht nur aus ISRs...
Für nen Debugger ist ja auch die allgemeine Usability wichtig:

• Wie werden rekursive/komplexe Strukturen und Unions dargestellt?
• Wie sieht's mit rekursiven Funktionen aus?
• Und Werten in drunterliegenden Call-Frames?
• Wie werden geinlinte Funktionen dargestellt?
• Wie werden expandierte Makros dargestellt?
• Werden Funktions-Prologe richtig erkannt?
• Auch mit -mcall-prologues? auch mit -maccumulate-args?
• Funktioniert Step-Over auch bei geinlinten Funktionen?
• Wie sieht's mit Function Clonig aus?
• Werden weg-optimierte Variablen angezeigt?
• Welche Debug-Formate werden unterstützt? dwarf-2? dwarf-3? dwarf-4?
• Kommt der Debugger auch mit den Prologen von avr-gcc 4.7 zurecht?
• Wie sieht's mit Plattformunabhängigkeit aus?
• Ist der Debigger skriptbar?
• Hat er einen integrierten Simulator?
• Oder bietet zumindest anbindung an einen Simulator?
• Kann man Programme damit nachladen?
• Hat er eine Socket-Anbindung?
• ...

> Fehler in den Algorithmen debuggt man am Einfachsten, indem man den
> Sourcecode einfach am PC übersetzt und dort ausführt.

Bezüglich der GCC-Testsuite ist jetzt ein Scherz, oder?
Die GCC-Testsuite gehört zur Qualitätssicherung des Compilers.
Was bringt es für einen avr-gcc, den Code für einen PC zu übersetzen
und dort laufen zu lassen?

von Paul E. (paul_e)


Lesenswert?

Ok ich seeh schon, Es gibt viel zu beachten. Außerdem scheint der kleine 
tiny nicht so geeignet zu sein mathematisch anspruchsvolle Dinge zu 
machen.
Der beschränkte Zahlenbereich von 8 bit und der fehlende Hardware 
Multtplizierer erschweren die Sache ungemein.
Gruß
eac

von µC-Bastler (Gast)


Lesenswert?

Paul E. schrieb:
> Der beschränkte Zahlenbereich von 8 bit und der fehlende Hardware
> Multtplizierer erschweren die Sache ungemein.

Wenn du was rechenintensives suchst, kann es dir doch nur recht sein, 
wenn die Multiplikationen zu fuß gemacht werden mußt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Eben mal angetestet:
1
#include <math.h>
2
3
int volatile A, B, C, D;
4
5
float rezi (float a, float b, float c, float d)
6
{
7
    return a/b - c*d + a > b;
8
}
9
10
int __attribute__((OS_main))
11
main (void)
12
{
13
    return rezi ((long) A / B, B, C, (long) C*D);
14
}
Das saugt einiges an Code aus den Libs:

• Vektortabelle
• Startup-Code
• 32-Bit integer * und /
• float +, -, * und /
• float Vergleich
• float → int und int → float Konvertierung

Das belegt ca. 1800 Bytes, und für "einfache" arithmetische Berechnungen 
ist man damit gut gerüstet. Die Codegröße wächst nicht mehr sooo viel 
wenn man das Zeug lediglich verwendet und sich keine weiteren Routinen 
reinzieht.

Man hat also noch ≈250 Bytes für eine Berechnung von π auf 1000 Stellen. 
Das ist zwar sehr ambitioniert, scheint mir aber durchaus im Rahmen des 
möglichen; vor allem weil man keine 32-Bit Arithmetik dazu braucht.

von pFFTh (Gast)


Lesenswert?

Johann L. schrieb:
> Bezüglich der GCC-Testsuite ist jetzt ein Scherz, oder?
> Die GCC-Testsuite gehört zur Qualitätssicherung des Compilers.

Eben. Sag ich doch.

> Was bringt es für einen avr-gcc, den Code für einen PC zu übersetzen
> und dort laufen zu lassen?

Für den avr-gcc? Nichts. Garnichts. Aber der TE ist keiner der 
Entwickler des AVR-GCC und will seinen Debugger auch sicher nicht dafür 
verwenden, Fehler im AVR-Backend der GCC zu finden.

Wenn ich aber Fehler in meinem eigenen Quelltext suche, kann ich 
durchaus die Zielplattform wechseln, zumindest solang ich davon ausgehe, 
dass sowohl das i386-Backend als auch das avr-Backend des GCC korrekten 
Code generieren.

Nachdem es hier um einen Debugger für einen Einsteiger/Anfänger geht, 
würde ich den Focus auf die häufigsten Anfängerfehler legen. Das sind 
hier im Forumsquerschnitt wohl IRQ-Problemchen, wenn man die ganzen 
Fehler aussenvorläßt, die der GCC von sich aus schon mit -Wall 
ankreidet.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

pFFTh schrieb:

> Aber der TE ist keiner der Entwickler des AVR-GCC und will seinen
> Debugger auch sicher nicht dafür verwenden, Fehler im AVR-Backend
> der GCC zu finden.

Oh mann ist das soooo schwer zu verstehen?

1) Der TE fragte nach "Rechenintensiven Beispielprogramm"
2) Ich habe ihm einen Link auf ein Verzeichnis gennannt, das viele
   ausführbare C-Programme enthält, die out-of-the-Box funktionieren.

Nicht mehr und nicht weniger.

Die Programme machen keine Voraussetzungen wie "dieses LCD muss hier und 
so angeschlossen werden" oder "das geht aber nur mit ATmega weil 
Assembler" oder "dafür sind's zu wenig Ports" etc.

Wo die Programme stehen und zu welchem Projekt die gehören ist doch 
sowas von Wurscht, also überlies diese Meta-Info einfach.

Daß die Programme keinen ISR-Code enthalten schrieb ich bereits. Der TO 
wird die Information für sich auszuwerten wissen — irgendwas von "das 
stört überhaupt nicht" bis hin zu "damit ist das uninteressant fü meine 
Zwecke".

von Paul E. (paul_e)


Lesenswert?

Johann L. schrieb:
> Eben mal angetestet:
>
>
1
#include <math.h>
2
> 
3
> int volatile A, B, C, D;
4
> 
5
> float rezi (float a, float b, float c, float d)
6
> {
7
>     return a/b - c*d + a > b;
8
> }
9
> 
10
> int __attribute__((OS_main))
11
> main (void)
12
> {
13
>     return rezi ((long) A / B, B, C, (long) C*D);
14
> }


Nicht schlecht, danke!
Mit der math.h rechnet er meine Fibonacci Folge auch gleich mal viel 
länger:
1
0000000
2
0000001
3
0000001
4
0000002
5
0000003
6
0000005
7
0000008
8
000000D
9
0000015
10
0000022
11
0000037
12
0000059
13
0000090
14
00000E9
15
0000179
16
0000262
17
00003DB
18
000063D
19
0000A18
20
0001055
21
0001A6D
22
0002AC2
23
000452F
24
0006FF1
25
000B520
26
0012511
27
001DA31
28
002FF42
29
004D973
30
007D8B5
31
00CB228
32
0148ADD
33
0213D05
34
035C7E2
35
05704E7
36
08CCCC9
37
0E3D1B0
38
1709E79
39
2547029
40
...

Hier der auch noch der Quellcode zur Vollständigkeit:
1
/*
2
 * AVRGCC1.c
3
 *
4
 * Created: 10.02.2012 14:10:37
5
 *  Author: Paul E.
6
 */ 
7
8
#include <avr/io.h>
9
#include <math.h>
10
int volatile long a,b,sum;
11
int main ()
12
{
13
  DDRB=255;
14
  PORTB=a;
15
  int n;
16
  n=50;
17
  fibonacci(n);
18
  return 0;
19
}
20
21
22
int fibonacci(int n)
23
{
24
  a = 0;
25
  b = 1;
26
  sum;
27
  int i;
28
29
  for (i=0;i<n;i++)
30
  {
31
  //PORTB=a;
32
    sum = a + b;
33
    a = b;
34
    b = sum;
35
  }
36
  return 0;
37
}

von Ben _. (burning_silicon)


Lesenswert?

ohne externe Beschaltung verhält sich jedes Programm genauso wie ein
while(1) {}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Paul E. schrieb:

> Mit der math.h rechnet er meine Fibonacci Folge auch gleich mal
> viel länger

Hmmm. Dein Code verwendet die math.h überhaupt nicht.

Mein Schnipsel übrigens auch nicht — my bad. Ich hatte vorher was mit 
pow() versucht, aber das ELF wurde schon viel zu groß für einen 
ATtiny2313. Daher hab ich pow() wieder entfernt und das math.h aber 
drinne gelassen.

Eine aufwändige Berechnung von Fibonacci geht über deren explizite 
Darstellung, die auch verwendet werden kann, um die "rekursiven" 
Ergebnisse zu testen:
mit dem Goldenen Schnitt
Der zweite Summand in fib(n) get rasch gegen 0 und es ergibt sich

Das führt zu folgendem kleinen C-Programm:
1
#include <math.h>
2
#include <stdio.h>
3
4
float phi;
5
6
static unsigned long fib (int n)
7
{
8
    return round (pow (phi, n) / sqrt (5));
9
}
10
11
int main (void)
12
{
13
    int i;
14
    
15
    phi = (sqrt (5) + 1) / 2;
16
    
17
    for (i = 0; i < 15; i++)
18
    {
19
        printf ("f[%d] = %lu\n", i, fib (i));
20
    }
21
    
22
    return 0;
23
}
Die Wurzel-Konstanten werden übrigens bereits vom Compiler ausgewertet.

Auf einem ATmega88 ausgeführt (und mit etwas Magie in anderen Modulen, 
um printf transparent funktionsfähig zu machen) erhält man folgende 
Ausgabe:
1
f[0] = 0
2
f[1] = 1
3
f[2] = 1
4
f[3] = 2
5
f[4] = 3
6
f[5] = 5
7
f[6] = 8
8
f[7] = 13
9
f[8] = 21
10
f[9] = 34
11
f[10] = 55
12
f[11] = 89
13
f[12] = 144
14
f[13] = 233
15
f[14] = 377
Wie gesagt ist pow() berweits zu groß für einen tiny2313; das obige 
Programm verschlingt ca 4500 Bytes.

pow() brauch man hier aber nicht unbedingt, denn die Exponenten sind 
ganzzahlig. Man könnte das x^n also auch händlisch implementieren und 
braucht dann nur Multiplikation anstatt pow().

von Walter S. (avatar)


Lesenswert?

Peter D. schrieb:
> int main()
> {
>   uint64_t i, j;
>
>   DDRB = 0xFF;
>   for( j = 0; j; j++ )
>     for( i = 0; i; i++ )
>       PORTB = i;
>   PORTB = 0xA5;
> }
>
> Das ist so rechenintensiv, daß keiner von uns das Ergebnis erleben wird.

die zwei Takte die das Programm braucht erlebe ich hoffentlich noch :-)
wenn ich nicht ganz blind bin ist das doch nur
DDRB = 0xff
PORTB = 0xa5

von Peter D. (peda)


Lesenswert?

Walter S. schrieb:
> die zwei Takte die das Programm braucht erlebe ich hoffentlich noch :-)

Man muß naürlich mit 1 initialisieren.
Wie findet man bloß solche 7 Jahre alten Threads?

von Suchet und ihr werdet finden (Gast)


Lesenswert?

Peter D. schrieb:
> Walter S. schrieb:
>> die zwei Takte die das Programm braucht erlebe ich hoffentlich noch :-)
>
> Man muß naürlich mit 1 initialisieren.
> Wie findet man bloß solche 7 Jahre alten Threads?

Über die vielgepriesene Suchfunktion.

SCNR

von Frank D. (Firma: Spezialeinheit) (feuerstein7)


Lesenswert?

Also pro Takt 3,5 Jahre :)

von OhWeia (Gast)


Lesenswert?

Walter S. schrieb:
> die zwei Takte die das Programm braucht erlebe ich hoffentlich noch :-)
> wenn ich nicht ganz blind bin ist das doch nur
> DDRB = 0xff
> PORTB = 0xa5

Bis 64bit^64bit durchgelaufen sind, ist das Silizium im Chip schon 
verrottet.

von Tom (Gast)


Lesenswert?

@OhWeia: Dann hätte Peter aber die Schleifen mit 1 initialiersen 
müssen...

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.