Forum: Mikrocontroller und Digitale Elektronik AVR ATMega 163 "überlastet" mit Programm?


von foobar (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im Rahmen meines Studium muss ich Keccak (neue SHA-3 Hashfunktion) in 
AVR Assembler programmieren und auf einer ATMega 163 Smartcard zum 
laufen bringen. Das Programm ist soweit fertig (ca. 1000 Zeilen Code und 
recht langsam, da ich wenig Wert auf Optimierung gelegt habe). Im AVR 
Studio liefert mir das Programm auch die richtigen Ergebnisse. Auf der 
Smartcard jedoch stürzt das Programm ab.

kleine Info:

Keccak besteht aus 24 Runden a 5 Funktionen (theta,rho,pi,chi,iota).

Auf der Smartcard funktionieren 4 Runden und die Smartcard liefert mir 
auch die richtigen Ergebnisse zurück. Sobald ich aber 5 Runden Keccak 
ausführen lasse, stürzt mein Java Programm (Kommunikation mit Smartcard) 
mit einer Fehlermeldung ab (siehe Anhang). Meine Vermutung ist, dass die 
Smartcard irgendwann "überlastet" ist. Um dies zu bestätigen habe ich 
nur die 1. Funktion (theta) öfter als 24 mal ausühren lassen. 130 
Ausführungen von Theta macht die Smartcard problemlos mit. Bei 140 
Ausführungen von theta bekomme ich wieder die gleiche Fehlermeldung.

Ist es denkbar, dass ich mit meiner Vermutung richtig liege? Im Anhang 
die Fehlermeldung des Java Programms.

von Thomas E. (thomase)


Lesenswert?

foobar schrieb:
> 130 Ausführungen von Theta macht die Smartcard problemlos mit. Bei 140
> Ausführungen von theta bekomme ich wieder die gleiche Fehlermeldung.
Riecht nach Stack-Überlauf.
Vielleicht irgendwo ein push zuviel und ein pop zu wenig.

mfg.

von ??? (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Vielleicht irgendwo ein push zuviel und ein pop zu wenig.
oder ein (r)jmp statt einem ret(i) oder ...

Eventuell einfach ab und zu mal den Stackpointer auslesen und ausgeben?

von foobar (Gast)


Lesenswert?

Hallo,

vielen dank für die Antworten.

push/pop Anweisungen gibt es nur am anfang und ende des ganzen 
Programmes. Die c Funktionen zum umgehen mit den APDU's usw wurden schon 
vorgegeben (Betriebssystem). Die Grundstruktur meiner bla.s Datei sieht 
ungefähr so aus:

.global  sha3_init
.type  sha3_init,@function
sha3_init:

push r0
.
.
.

push r31

Anweisungen um die 768 Byte freien SRAM (vorgegeben) auf 0 setzen

pop r31
.
.
.
pop r0

.global  sha3_hash
.type  sha3_hash,@function
sha3_hash:

push r0
.
.
.
push r32

-Labels zum umgehen mit den APDU's
-eventuell zum Padding springen
-Label keccak
   theta
   rho
   pi
   chi
   iota
   jmp keccak wenn noch nicht 24 mal ausgeführt wurde
-eventuell noch Rest der Nachricht speichern
-Label Padding

pop r0
.
.
.
pop r31

Es gibt keinerlei Unterfunktionen sondern nur Labels (ja stümperhaft 
aber egal) und wie gesagt push und pop Anweisungen nur am anfang und am 
Ende des ganzen Programmes aber nicht im Label keccak.

Ich bin für jede Hilfe dankbar, aber ich weiß es ist schwer ohne 
Sourcecode...wobei das kein Sinn macht diesen zu posten...bei so viel 
Code...da blickt eh keiner durch. :D

von Peter D. (peda)


Lesenswert?

foobar schrieb:
> Anweisungen um die 768 Byte freien SRAM (vorgegeben) auf 0 setzen

Hast Du auch Anweisungen, um Dir den RAM erstmal zuweisen zu lassen?
Du kannst nicht einfach irgendwo im RAM rumpfuschen, daß nimmt Dir C 
sehr übel.

Warum überhaupt Assembler, wenn drumrum schon alles in C ist?
Im Asssembler ist man nur in Ausnahmefällen schneller oder sparsamer und 
das auch nur als sehr erfahrener Programmierer. Dafür braucht man um den 
Faktor 10..100 länger zum Schreiben des Programms.

Hast Du mal in der Jave-Doku nachgesehen, was diese Fehlernummmer 
bedeutet?
Vielleicht ein Timeout.
Vielleicht schlägt ja der Watchdog des AVR zu.

Ist der ATmega163 nicht schon über 10 Jahre obsolet?
Studienarbeiten mit Bauteilen aus dem Museum sollte ein guter Betreuer 
nicht vergeben.
Zu meiner Zeit mußte man in der Einleitung den praktischen Nutzen 
darlegen, d.h. eine zeitgemäße Lösung mit zeitgemäßen Bauteilen.

Der ATmega163 hat ja nur 1kB RAM, da wird die Luft nach Abzug der 768 
Byte aber reichlich dünne.


Peter

von foobar (Gast)


Lesenswert?

Nunja der RAM wird ja in einer eigenen Funktion sha3_init auf 0 gesetzt 
und diese Funktion macht auch keinerlei Probleme. auch im AVR Studio 
Simulator klappt das alles wunderbar. Uns wurde gesagt, dass wir in der 
init Funktion alle Bytes auf 0 setzen sollen und das 768 KB an RAM frei 
verfügbar ist. Ich benötige von den 768 Byte 602 Byte (3x200 Byte Status 
+ 2 "Magic Bytes")

Warum Assembler? Ganz einfach, weil das so vorgegeben ist. :) Und auch 
der ATMega 163 ist nunmal vorgegeben...dagegen kann ich nichts machen.

Nach der Fehlermeldung hatte ich früher (Hatte den Fehler schonmal in 
einer Hausaufgabe, diese Aufgabe ist sozusagen die Endaufgabe, um das 
Projekt zu besehen) schon mal gegoogelt aber ncihts weiter gefunden.

Es wäre halt schade, wenn ich das Projekt nciht bestehe, da das Programm 
an sich korrekt läuft...aber die Vorgabe ist eben, dass es auf der 
Smartcard laufen soll.

Hat der ATMega 163 sowas wie einer Sicherheitsmaßnahme z.B. im Fall 
einer Endlosschleife?Kann ja sein, dass die Berechnung zu lange dauert 
bis ein Ergebenis zurückgeliefert wird und die Smartcard daher denkt, 
dass eine Endlosschleife vorhanden ist. Ist das der Watchdog?

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Nur so aus Interesse, du studierst nicht rein zufällig an der RUB?

von Hermann K. (r2d2)


Lesenswert?

Bau doch einfach mal in ein funktionierendes Programm ein relativ langes 
Delay ein. Wenn es dann zu Problemen kommt schlägt entweder der Watchdog 
zu, oder die PC-Seite läuft in einen Timeout

von foobar (Gast)


Lesenswert?

Hallo,

ja ich studiere ITS an der RUB.
1
    ldi r25,0      //setze X auf speicheradresse 0x60
2
    ldi r24,96
3
    mov xh,r25
4
    mov xl,r24
5
6
    ldi r23,212
7
    ldi r22,0
8
        
9
    ldi r19,2
10
    ldi r18,0
11
    ldi r17,4
12
    ldi r16,0
13
14
    delete:
15
        st x+,r17
16
        
17
        mul r17,r19 
18
        mov r4,r0  
19
        mov r5,r1  
20
21
        mul r16,r18  
22
        mov r2,r0  
23
        mov r3,r1  
24
25
        mul r17,r18
26
        add r3,r0
27
        adc r4,r1
28
        adc r5,r20
29
30
        mul r16,r19
31
        add r3,r0
32
        adc r4,r1
33
        adc r5,r20
34
35
       subi r22,1  
36
       sbci r23,0
37
       brne go_delete
38
       jmp nothing
39
            
40
       go_delete:
41
           jmp delete
42
43
       nothing:
44
            nop

Das Programm(In abgewandelter Form meine Schleife um den RAM auf 0 zu 
setzen + Multiplikation 2-er Zahlen damit die Schleife länger braucht) 
bringt den gleichen Fehler. Also scheint es am Watchdog oder einem 
Timeout zu liegen. Dagegen kann ich ja höchstwahrscheinlich nichts 
machen...so wie ich das seh.

Muss ich halt sehen wie ich das mit den Verantwortlichen abkläre.

danke für die kompetente Hilfe. :)

von foobar (Gast)


Lesenswert?

Hier nochmal das abgeänderte Programm, da ich ja beim 1. Speicher 
beschreiben will, der gar nicht existiert:
1
    ldi r23,212
2
    ldi r22,0
3
4
    mul:
5
        
6
           ldi r19,2
7
    ldi r18,0
8
    ldi r17,4
9
    ldi r16,0        
10
11
        mul r17,r19 
12
        mov r4,r0  
13
        mov r5,r1  
14
15
        mul r16,r18  
16
        mov r2,r0  
17
        mov r3,r1  
18
19
        mul r17,r18
20
        add r3,r0
21
        adc r4,r1
22
        adc r5,r20
23
24
        mul r16,r19
25
        add r3,r0
26
        adc r4,r1
27
        adc r5,r20
28
29
       subi r22,1  
30
       sbci r23,0
31
       brne go_mul
32
       jmp nothing
33
            
34
       go_mul:
35
           jmp mul
36
37
       nothing:
38
            nop

Ergebnis ist jedoch das gleiche.

von Hermann K. (r2d2)


Lesenswert?

Watchdog ist im Datenblatt beschrieben und lässt sich per Software 
entweder deaktivieren oder immer wieder füttern.

Du könntest dem Watchdog z.B. nach jeder Runde des 
Verschlüsselungsalgorithmus bescheid sagen, dass du noch am Leben bist.

von foobar (Gast)


Lesenswert?

Hallo,

da sehr viele eine Lösung eingereicht haben, die nur teilweise läuft 
haben wir 10 Tage verlängerung bekommen....ich bin also wahrscheinlich 
nicht der einzige dem das so geht. Ich werde das mit dem Watchdog 
ausprobieren und berichten ob es funktioniert hat.

von Stefan (Gast)


Lesenswert?

> da ich wenig Wert auf Optimierung gelegt habe

Legt denn Dein Dozent Wert darauf? In einer praktischen Anwendung kommt 
es häufig darauf an, eine Aufgabe schnell genug zu erledigen. Zum 
Beispiel darf eine Interrupt Routine meist nicht länger dauern, als der 
Zeitabstand zwischen zwei Interrupts.

Vielleicht hat der Dozent einen Watchdog eingebaut, um solch eine 
Einschränkung vorzugeben, und nun sollst Du den Code soweit optimieren, 
dass er mit der Zeitlichen Beschränkung zurecht kommt.

von foobar (Gast)


Lesenswert?

Hallo,

es wurde zwar gesagt, dass die effizienteste Lösung "ausgezeichnet" 
wird, aber es wurden keine speziellen Vorgaben bzgl. 
Ausführungsgeschwindigkeit oder Codegröße gemacht.

Ich habe nun versucht den WDT zu deaktivieren, laut:

http://www.avrbeginners.net/architecture/wdt/wdt.html

Habe jedoch statt out sts verwendet, da avr-gcc sonst meckert (number 
must be positive and less than 64)

Allerdings hilft das auch nicht oder irgendwas am Code zum Ausschalten 
des WDT ist falsch. Könnte in dem Fall jemand mal einen korrekten Code 
posten?


Ich habe übrigens folgendes herausgefunden:

Wenn einmal der Fehler 0x45d in sha3_hash aufgetreten ist und das 
Programm auf der Smartcard neu gestartet wird, dann wird sofort bei der 
sha3_init Funktion der Fehler 0x45d ausgelöst. Erst wenn ich die 
Smartcard vom Reader entferne und wieder anstecke, wird sha3_init ohne 
Fehler ausgeführt und der Fehler tritt wieder nach einiger Rechenzeit in 
sha3_hash auf. Vielleicht hilft das ja.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

foobar schrieb:

> Die c Funktionen zum umgehen mit den ...

Du folgst bei Aufrufen auch brav der C-ABI des verwendeten Compilers?

von Peter D. (peda)


Lesenswert?

Den Watchdog kannst Du doch ganz einfach triggern, notfalls im 
Timerinterrupt.

Vermutlich wird es aber ein Timeout der PC-Software sein, den man 
hochsetzen muß.

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.