Forum: Mikrocontroller und Digitale Elektronik [AVR-GCC - AtTiny2313] Schwierigkeiten mit modularer programmierung


von Marcel A. (peter_lustig)


Angehängte Dateien:

Lesenswert?

Hallo!
Für ein aktuelles Projekt würde ich gerne ein eigenes µC-Board mit einem 
AtTiny2313 verwenden. Allerdings bring mich der Controller seit tagen 
zur Verzweiflung.

Kurze Infos im Voraus:
  - Ich arbeite unter Linux (eOS Freya - Ubuntukern 14.04)
  - gcc version 4.8.2 (GCC)
  - Ich verwende zum kompilieren ein eigenes makefile (siehe Anhang)
    das hier angebotene diente als Vorlage und wurde auch getestet.
  - Ich besitze keinen ISP Adapter. Hierfür wird mein Arduino Uno
    verwendet schein meiner Meinung nach aber nicht des Fehlers
    Uhrsache zu sein.
  - Fuses: 1.8432 MHz - ext. crystal: LF=0xDA | HF=0x99 | EF=0xFF
    (Mit den Standard Fuses für 1MHz zeigt sich das selbe Problem)


Das Problem erklärt sich am besten an folgendem Beispielcode:

Das eigentliche Blinkprogramm funktioniert tadellos, füge ich jedoch 
über oder unter der main() eine Funktion oder Funktionsdefinition ein, 
macht der Controller nichts mehr.
Der gleich Effekt zeigt sich auch beim inkludieren eigene Headerfiles, 
was natürlich denkbar unpraktisch ist.
Im Simulator lauft jedoch alles wie am Schnürchen. Wo ist mein Fehler?
1
#include <avr/io.h>
2
3
#define F_CPU 1000000UL  // 1 MHz
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
    DDRD |= _BV(PD6); 
9
    while (1){
10
        PORTD &= ~_BV(PD6);   //PD6 = low -> LED an
11
        _delay_ms(500);
12
        PORTD |= _BV(PD6);    //PD6 = high -> LED aus
13
        _delay_ms(500);
14
    };
15
    return 0;
16
};
17
18
void f( void ){}  // Mit dieser Zeile funktioniert nichts mehr


Ich hoffe jemand kann mir bei diesem verwirrenden Problem weiterhelfen.

Liebe Grüße
Marcel

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

Marcel A. schrieb:
> Ich hoffe jemand kann mir bei diesem verwirrenden Problem weiterhelfen.

hast du mal die lss Datei verglichen? Da sollte sich nichts ändern.

von Marcel A. (peter_lustig)


Angehängte Dateien:

Lesenswert?

Das ist anscheinen nicht der Fall.
Allerdings hab ich etwas Schwierigkeiten die Ursache dafür auszumachen.

Hier der vergleich der beiden Dateien die einzel Files finden sich im 
anhang.

Danke für die schnelle Antwort!
1
--- /home/marcel/Arduino/Projekte/TEST/blink test ISP 2313/test/ohne/main.lss
2
+++ /home/marcel/Arduino/Projekte/TEST/blink test ISP 2313/test/mit/main.lss
3
@@ -3,29 +3,29 @@
4
 
5
 Sections:
6
 Idx Name          Size      VMA       LMA       File off  Algn
7
-  0 .text         00000064  00000000  00000000  00000074  2**1
8
+  0 .text         00000066  00000000  00000000  00000074  2**1
9
                   CONTENTS, ALLOC, LOAD, READONLY, CODE
10
-  1 .data         00000000  00800060  00000064  000000d8  2**0
11
+  1 .data         00000000  00800060  00000066  000000da  2**0
12
                   CONTENTS, ALLOC, LOAD, DATA
13
-  2 .stab         000006b4  00000000  00000000  000000d8  2**2
14
+  2 .stab         000006b4  00000000  00000000  000000dc  2**2
15
                   CONTENTS, READONLY, DEBUGGING
16
-  3 .stabstr      00000054  00000000  00000000  0000078c  2**0
17
+  3 .stabstr      00000054  00000000  00000000  00000790  2**0
18
                   CONTENTS, READONLY, DEBUGGING
19
-  4 .comment      00000011  00000000  00000000  000007e0  2**0
20
+  4 .comment      00000011  00000000  00000000  000007e4  2**0
21
                   CONTENTS, READONLY
22
-  5 .debug_aranges 00000020  00000000  00000000  000007f1  2**0
23
+  5 .debug_aranges 00000028  00000000  00000000  000007f5  2**0
24
                   CONTENTS, READONLY, DEBUGGING
25
-  6 .debug_info   00000165  00000000  00000000  00000811  2**0
26
+  6 .debug_info   00000179  00000000  00000000  0000081d  2**0
27
                   CONTENTS, READONLY, DEBUGGING
28
-  7 .debug_abbrev 000000da  00000000  00000000  00000976  2**0
29
+  7 .debug_abbrev 000000f2  00000000  00000000  00000996  2**0
30
                   CONTENTS, READONLY, DEBUGGING
31
-  8 .debug_line   0000009c  00000000  00000000  00000a50  2**0
32
+  8 .debug_line   000000a9  00000000  00000000  00000a88  2**0
33
                   CONTENTS, READONLY, DEBUGGING
34
-  9 .debug_frame  00000024  00000000  00000000  00000aec  2**2
35
+  9 .debug_frame  00000034  00000000  00000000  00000b34  2**2
36
                   CONTENTS, READONLY, DEBUGGING
37
- 10 .debug_str    00000160  00000000  00000000  00000b10  2**0
38
+ 10 .debug_str    0000015f  00000000  00000000  00000b68  2**0
39
                   CONTENTS, READONLY, DEBUGGING
40
- 11 .debug_ranges 00000010  00000000  00000000  00000c70  2**0
41
+ 11 .debug_ranges 00000018  00000000  00000000  00000cc7  2**0
42
                   CONTENTS, READONLY, DEBUGGING
43
 
44
 Disassembly of section .text:
45
@@ -56,55 +56,62 @@
46
   28:  1f be         out  0x3f, r1  ; 63
47
   2a:  cf ed         ldi  r28, 0xDF  ; 223
48
   2c:  cd bf         out  0x3d, r28  ; 61
49
-  2e:  02 d0         rcall  .+4        ; 0x34 <main>
50
-  30:  17 c0         rjmp  .+46       ; 0x60 <_exit>
51
+  2e:  03 d0         rcall  .+6        ; 0x36 <main>
52
+  30:  18 c0         rjmp  .+48       ; 0x62 <_exit>
53
 
54
 00000032 <__bad_interrupt>:
55
   32:  e6 cf         rjmp  .-52       ; 0x0 <__vectors>
56
 
57
-00000034 <main>:
58
+00000034 <f>:
59
+//#define F_CPU 1000000UL  // 1 MHz
60
+#define F_CPU  1843200UL  // CPU Frq.: 1.8432MHz
61
 
62
-//void f( void ){}
63
+#include <util/delay.h>
64
+
65
+void f( void ){}
66
+  34:  08 95         ret
67
+
68
+00000036 <main>:
69
 
70
 int main(void)
71
 {
72
     DDRD |= _BV(PD6); // Make PD6 Output
73
-  34:  8e 9a         sbi  0x11, 6  ; 17
74
+  36:  8e 9a         sbi  0x11, 6  ; 17
75
     //blink, blink:
76
     while (1){
77
         PORTD &= ~_BV(PD6);     //PD6 = low -> LED an
78
-  36:  96 98         cbi  0x12, 6  ; 18
79
+  38:  96 98         cbi  0x12, 6  ; 18
80
   #else
81
     //round up by default
82
     __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
83
   #endif
84
 
85
   __builtin_avr_delay_cycles(__ticks_dc);
86
-  38:  2f ef         ldi  r18, 0xFF  ; 255
87
-  3a:  8f e9         ldi  r24, 0x9F  ; 159
88
-  3c:  95 e0         ldi  r25, 0x05  ; 5
89
-  3e:  21 50         subi  r18, 0x01  ; 1
90
-  40:  80 40         sbci  r24, 0x00  ; 0
91
-  42:  90 40         sbci  r25, 0x00  ; 0
92
-  44:  e1 f7         brne  .-8        ; 0x3e <__SP_L__+0x1>
93
-  46:  00 c0         rjmp  .+0        ; 0x48 <__SREG__+0x9>
94
-  48:  00 00         nop
95
+  3a:  2f ef         ldi  r18, 0xFF  ; 255
96
+  3c:  8f e9         ldi  r24, 0x9F  ; 159
97
+  3e:  95 e0         ldi  r25, 0x05  ; 5
98
+  40:  21 50         subi  r18, 0x01  ; 1
99
+  42:  80 40         sbci  r24, 0x00  ; 0
100
+  44:  90 40         sbci  r25, 0x00  ; 0
101
+  46:  e1 f7         brne  .-8        ; 0x40 <__SREG__+0x1>
102
+  48:  00 c0         rjmp  .+0        ; 0x4a <__SREG__+0xb>
103
+  4a:  00 00         nop
104
         _delay_ms(1000);         //1000 ms warten
105
         PORTD |= _BV(PD6);      //PD6 = high -> LED aus
106
-  4a:  96 9a         sbi  0x12, 6  ; 18
107
-  4c:  2f ef         ldi  r18, 0xFF  ; 255
108
-  4e:  8f e9         ldi  r24, 0x9F  ; 159
109
-  50:  95 e0         ldi  r25, 0x05  ; 5
110
-  52:  21 50         subi  r18, 0x01  ; 1
111
-  54:  80 40         sbci  r24, 0x00  ; 0
112
-  56:  90 40         sbci  r25, 0x00  ; 0
113
-  58:  e1 f7         brne  .-8        ; 0x52 <__SREG__+0x13>
114
-  5a:  00 c0         rjmp  .+0        ; 0x5c <__SREG__+0x1d>
115
-  5c:  00 00         nop
116
-  5e:  eb cf         rjmp  .-42       ; 0x36 <main+0x2>
117
+  4c:  96 9a         sbi  0x12, 6  ; 18
118
+  4e:  2f ef         ldi  r18, 0xFF  ; 255
119
+  50:  8f e9         ldi  r24, 0x9F  ; 159
120
+  52:  95 e0         ldi  r25, 0x05  ; 5
121
+  54:  21 50         subi  r18, 0x01  ; 1
122
+  56:  80 40         sbci  r24, 0x00  ; 0
123
+  58:  90 40         sbci  r25, 0x00  ; 0
124
+  5a:  e1 f7         brne  .-8        ; 0x54 <__SREG__+0x15>
125
+  5c:  00 c0         rjmp  .+0        ; 0x5e <__SREG__+0x1f>
126
+  5e:  00 00         nop
127
+  60:  eb cf         rjmp  .-42       ; 0x38 <main+0x2>
128
 
129
-00000060 <_exit>:
130
-  60:  f8 94         cli
131
+00000062 <_exit>:
132
+  62:  f8 94         cli
133
 
134
-00000062 <__stop_program>:
135
-  62:  ff cf         rjmp  .-2        ; 0x62 <__stop_program>
136
+00000064 <__stop_program>:
137
+  64:  ff cf         rjmp  .-2        ; 0x64 <__stop_program>

von Peter II (Gast)


Lesenswert?

merkwürdig, es ist nur ein Versatz um 2 Byte vorhanden. Das sollte am 
Verhalten aber nicht ändern.

Der Optimiere hätte die Funktion auch rausschmeißen können, keine Ahnung 
warum er das nicht macht.

Kann leider nicht weiterhelfen.

von Stefan E. (sternst)


Lesenswert?

Marcel A. schrieb:
> - Ich verwende zum kompilieren ein eigenes makefile (siehe Anhang)

Welches fehlerhaft ist und dazu führt, dass der Code für den falschen 
Controller gelinkt wird.

von Marcel A. (peter_lustig)


Lesenswert?

Stefan E. schrieb:
> Welches fehlerhaft ist und dazu führt, dass der Code für den falschen
> Controller gelinkt wird.

Tatsächlich ist das der Fehler! Vielen Danke.
All meine Probleme lagen bisher am Makefile, aber so langsam steig ich 
durch :D

Vielen Dank für die schnelle Hilfe!

von Bastler (Gast)


Lesenswert?

> Der Optimiere hätte die Funktion auch rausschmeißen können, keine Ahnung warum 
er das nicht macht.

Er kann nicht, denn er optimiert eine Compilation-Unit, sprich ein 
C-File. Und f() ist nicht static, also implizit global. Nur mit LTO kann 
er das. Jede CompUnit wird "Vorübersetzt" und die eigentliche 
Optimierung/Codegenerierung findet im Linker statt. Der kennt ALLES zu 
dem Programm, kann also das unbenutzte f() rausschmeisen.

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.