Forum: Mikrocontroller und Digitale Elektronik [AVR Studio 6.1] Bug mit -nostartfiles?


von Dosmo (Gast)


Lesenswert?

Hallo zusammen,

ich hab einen Bootloader, der funktioniert, wenn ich ihn ohne 
"-nostartfiles" baue. Wenn "-nostartfiles" aktiv ist, läuft er nicht 
immer.
Ich konnte das Problem darauf zurückführen, daß das RAM nicht immer 
sauber gelöscht wird.

Nun hab ich ein wenig den erzeugten Code verglichen und dabei fällt mir 
folgendes auf:

1. Ohne "-nostartfiles":
1
   7f000:  71 c0         rjmp  .+226      ; 0x7f0e4 <__ctors_end>
2
   ...
3
0007f0e4 <__ctors_end>:
4
   7f0e4:  11 24         eor  r1, r1
5
   7f0e6:  1f be         out  0x3f, r1  ; 63
6
   7f0e8:  cf ef         ldi  r28, 0xFF  ; 255
7
   7f0ea:  d1 e2         ldi  r29, 0x21  ; 33
8
   7f0ec:  de bf         out  0x3e, r29  ; 62
9
   7f0ee:  cd bf         out  0x3d, r28  ; 61
10
   7f0f0:  03 e0         ldi  r16, 0x03  ; 3
11
   7f0f2:  0c bf         out  0x3c, r16  ; 60
12
0007f0f4 <__do_clear_bss>:
13
   7f0f4:  22 e0         ldi  r18, 0x02  ; 2
14
   7f0f6:  a0 e0         ldi  r26, 0x00  ; 0
15
   7f0f8:  b2 e0         ldi  r27, 0x02  ; 2
16
   7f0fa:  01 c0         rjmp  .+2        ; 0x7f0fe <.do_clear_bss_start>
17
0007f0fc <.do_clear_bss_loop>:
18
   7f0fc:  1d 92         st  X+, r1
19
0007f0fe <.do_clear_bss_start>:
20
   7f0fe:  a2 30         cpi  r26, 0x02  ; 2
21
   7f100:  b2 07         cpc  r27, r18
22
   7f102:  e1 f7         brne  .-8        ; 0x7f0fc <.do_clear_bss_loop>

2. Mit "-nostartfiles":
1
0007f000 <__ctors_end>:
2
   7f000:  22 e0         ldi  r18, 0x02  ; 2
3
   7f002:  a0 e0         ldi  r26, 0x00  ; 0
4
   7f004:  b2 e0         ldi  r27, 0x02  ; 2
5
   7f006:  01 c0         rjmp  .+2        ; 0x7f00a <.do_clear_bss_start>
6
0007f008 <.do_clear_bss_loop>:
7
   7f008:  1d 92         st  X+, r1
8
0007f00a <.do_clear_bss_start>:
9
   7f00a:  a2 30         cpi  r26, 0x02  ; 2
10
   7f00c:  b2 07         cpc  r27, r18
11
   7f00e:  e1 f7         brne  .-8        ; 0x7f008 <.do_clear_bss_loop>
12
0007f010 <_jumpMain>:
13
   7f010:  cf ef         ldi  r28, 0xFF  ; 255
14
   7f012:  d1 e2         ldi  r29, 0x21  ; 33
15
   7f014:  de bf         out  0x3e, r29  ; 62
16
   7f016:  cd bf         out  0x3d, r28  ; 61
17
   7f018:  11 24         eor  r1, r1
18
   7f01a:  1f be         out  0x3f, r1  ; 63

Im 2. Code meine ich, folgenden Bug zu sehen:
Das RAM wird mit dem Inhalt von R1 beschrieben, aber R1 wird zuvor nicht 
gelöscht. Dies würde mein Problem erklären.

Was meint Ihr?

von spess53 (Gast)


Lesenswert?

Hi

>Das RAM wird mit dem Inhalt von R1 beschrieben, aber R1 wird zuvor nicht
>gelöscht. Dies würde mein Problem erklären.

Was denkst du denn, was

eor  r1, r1

macht?

MfG Spess

von Stefan E. (sternst)


Lesenswert?

spess53 schrieb:
> Was denkst du denn, was
>
> eor  r1, r1
>
> macht?

Jedenfalls löscht es r1 nicht "rückwirkend". ;-)

von Stefan E. (sternst)


Lesenswert?

Dosmo schrieb:
> Was meint Ihr?

Dass es mich nicht verwundert, denn schließlich sagst du ihm mit 
-nostartfiles ja explizit, dass er den Startup-Code weglassen soll (zu 
dem auch das Ausnullen des Zero-Reg gehört).

Und was ist _jumpMain? Das sieht nach was "eigenem" aus. Das ist dann 
schlicht falsch platziert.

: Bearbeitet durch User
von Dosmo (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Dosmo schrieb:
>> Was meint Ihr?
>
> Dass es mich nicht verwundert, denn schließlich sagst du ihm mit
> -nostartfiles ja explizit, dass er den Startup-Code weglassen soll (zu
> dem auch das Ausnullen des Zero-Reg gehört).

Also mich verwundert es schon, daß das do_bss_clear vorhanden ist, 
welches voraussetzt, daß R1 zuvor gelöscht wurde, aber eben dieses 
Löschen des R1 fehlt.

> Und was ist _jumpMain? Das sieht nach was "eigenem" aus. Das ist dann
> schlicht falsch platziert.

Ja, ist es eigenes (aber der Bootloader ist nicht von mir, ich darf nur 
die Fehler suchen).

von Stefan E. (sternst)


Lesenswert?

Dosmo schrieb:
> Also mich verwundert es schon, daß das do_bss_clear vorhanden ist,
> welches voraussetzt, daß R1 zuvor gelöscht wurde, aber eben dieses
> Löschen des R1 fehlt.

Das ist eine Funktion, die aus der Library hinzugelinkt wird. Und wie 
sämtlicher Library-Code, geht sie von einer korrekt aufgesetzten 
Umgebung aus. Wenn du -nostartfiles verwendest, bist du halt selbst 
dafür verantwortlich, die Grundlagen zu schaffen, und zwar vorher.

von Dosmo (Gast)


Lesenswert?

Okay, verstanden.
Also kein Toolchain-Bug (beruhigt mich), sondern falsch verwendet.
Danke Dir.

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.