Forum: Compiler & IDEs Error 2 R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in.


von Philipp M. (lord-maricek)


Lesenswert?

Hi,

ich benutzte AVR-Studio 5 und schreibe ein Programm, um GPS Daten 
auszuwerten. Aber ich bekomme immer den Fehler:
1
Error  2  R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in c:/program files (x86)/atmel/avr studio 5.0/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_mul_sf.o)  /home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/fp_powsodd.S  59  1  Communication
2
Error  3  R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in c:/program files (x86)/atmel/avr studio 5.0/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_mul_sf.o)  /home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/fp_powsodd.S  69  1  Communication

Im Internet habe ich schon benutzt, und gelesen, dass es dafür keine 
Lösung gibt, ist das immer noch so?
Ich habe auch noch irgentwas über eine libm.a gefunden, die ich 
einbinden soll, wie mache ich das?

Ich hoffe ihr könnt mir helfen.

Hier der Code:
1
#include <math.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#ifndef _GPS_H_
5
#define _GPS_H_
6
7
#include "protocol.h"
8
9
#define VALIDATION_AUTONOMUS 'A'
10
#define VALIDATION_DIFFERENCIAL 'D'
11
#define VALIDATION_ESTIMATED 'E'
12
#define VALIDATION_NOT_VALID 'N'
13
#define VALIDATION_SIMULATOR 'S'
14
15
typedef struct gps{
16
    struct protocol * p_out;
17
    struct autopilot * ap;
18
    unsigned char sentence[5];
19
    unsigned char buffer[255];
20
    unsigned char indexer;
21
    unsigned char end_char_counter;
22
}gps;
23
24
extern void gps_init(gps * const _this,protocol * const pr, autopilot * const ap,unsigned char sentence[5]);
25
extern unsigned char gps_decode(gps * const _this,unsigned char inChar);
26
27
#endif //_GPS_H_
1
#include "gps.h"
2
3
void gps_init(gps * const _this,protocol * const pr, autopilot * const ap,unsigned char sentence[5])
4
{
5
    _this->p_out = pr;
6
    _this->ap = ap;
7
    for(unsigned char i=0; i<5; i++)
8
    {
9
        _this->sentence[i] = sentence[i];
10
    }
11
}
12
13
unsigned char gps_decode(gps * const _this,unsigned char inChar)
14
{
15
    _this->buffer[_this->indexer] = inChar;
16
    if(_this->buffer[_this->indexer]=='$')
17
    {
18
        for(unsigned char i=0; i<255; i++)
19
        {
20
            _this->buffer[i] = 0;
21
        }
22
        _this->indexer = 0;
23
    }
24
    if(_this->buffer[_this->indexer]=='*')
25
    {
26
        _this->end_char_counter = _this->indexer;
27
    }
28
29
    if(_this->end_char_counter+2==_this->indexer)
30
    {
31
        if((_this->buffer[1]==_this->sentence[0])&&(_this->buffer[2]==_this->sentence[1])&&(_this->buffer[3]==_this->sentence[2])&&(_this->buffer[4]==_this->sentence[3])&&(_this->buffer[5]==_this->sentence[4]))
32
        {
33
       unsigned char tmp_indexer = 6;
34
            //Zeit
35
            if(_this->buffer[tmp_indexer+1]!=',')
36
            {
37
                tmp_indexer+=1;
38
                char t[] = {_this->buffer[tmp_indexer],_this->buffer[tmp_indexer+1],'\n'};
39
                _this->p_out->data[ZEIT_1] = atoi(t);
40
                t[0] = _this->buffer[tmp_indexer+2];
41
                t[1] = _this->buffer[tmp_indexer+3];
42
        t[3] = '\n';
43
                _this->p_out->data[ZEIT_2] = atoi(t);
44
                t[0] = _this->buffer[tmp_indexer+4];
45
                t[1] = _this->buffer[tmp_indexer+5];
46
        t[3] = '\n';
47
                _this->p_out->data[ZEIT_3] = atoi(t);
48
                tmp_indexer += 6;
49
                _this->p_out->check_byte[ZEIT_1] = 0x01;
50
            }
51
            else
52
            {
53
                tmp_indexer++;
54
            }
55
56
            //Status der Bestimmung
57
            if(_this->buffer[tmp_indexer+1]!=',')
58
            {
59
                //
60
                tmp_indexer+=2;
61
            }
62
            else
63
            {
64
                tmp_indexer++;
65
            }
66
67
            //Breite
68
            if(_this->buffer[tmp_indexer+1]!=',')
69
            {
70
                tmp_indexer++;
71
                char t1[] = {_this->buffer[tmp_indexer],_this->buffer[tmp_indexer+1],'\n'};
72
                char t2[] = {_this->buffer[tmp_indexer+2],_this->buffer[tmp_indexer+3],_this->buffer[tmp_indexer+4],_this->buffer[tmp_indexer+5],_this->buffer[tmp_indexer+6],_this->buffer[tmp_indexer+7],_this->buffer[tmp_indexer+8],'0','0','\n'};
73
                tmp_indexer+=9;
74
                _this->ap->lon = atof(t2)/60.0 + (double)atoi(t1);
75
            }
76
            else
77
            {
78
                tmp_indexer++;
79
            }
80
81
            //Nord / Süd
82
            if(_this->buffer[tmp_indexer+1]!=',')
83
            {
84
                tmp_indexer+=2;
85
            }
86
            else
87
            {
88
                tmp_indexer++;
89
            }
90
91
            //Länge
92
            if(_this->buffer[tmp_indexer+1]!=',')
93
            {
94
                tmp_indexer++;
95
                char t1[] = {_this->buffer[tmp_indexer],_this->buffer[tmp_indexer+1],'\n'};
96
                char t2[] = {_this->buffer[tmp_indexer+2],_this->buffer[tmp_indexer+3],_this->buffer[tmp_indexer+4],_this->buffer[tmp_indexer+5],_this->buffer[tmp_indexer+6],_this->buffer[tmp_indexer+7],_this->buffer[tmp_indexer+8],'0','0','\n'};
97
                tmp_indexer+=9;
98
                _this->ap->lat = atof(t2)/60.0 + (float)atoi(t1);
99
            }
100
            else
101
            {
102
                tmp_indexer++;
103
            }
104
105
            //East / West
106
            if(_this->buffer[tmp_indexer+1]!=',')
107
            {
108
                tmp_indexer+=2;
109
            }
110
            else
111
            {
112
                tmp_indexer++;
113
            }
114
115
            //GS
116
            if(_this->buffer[tmp_indexer+1]!=',')
117
            {
118
                char t[10];
119
                unsigned char tmp = 0;
120
                tmp_indexer++;
121
                while((_this->buffer[tmp_indexer]!=',')&&(_this->buffer[tmp_indexer]!='*'))
122
                {
123
                    t[tmp] = _this->buffer[tmp_indexer];
124
                    tmp++;
125
                    tmp_indexer++;
126
                }
127
            }
128
            else
129
            {
130
                tmp_indexer++;
131
            }
132
133
            return 0xff;
134
        }
135
    }
136
137
    _this->indexer++;
138
    return 0x00;
139
}

MfG
Philipp

von g457 (Gast)


Lesenswert?

> Ich habe auch noch irgentwas über eine libm.a gefunden, die ich
> einbinden soll, wie mache ich das?

Wenns nur das ist dann irgendwo(tm) bei den ∗Linker∗optionen angeben - 
da ich kein AvrStudio nutze kann ich Dir leider nicht sagen wo genau, 
sollte sich mit Tante Gugl aber leicht lösen lassen.

> Hier der Code:

..der sich nicht compilieren (und schon gar nicht linken) lässt weil 
essentielle Dateien fehlen (mindestens protocol.h (und zum linken eine 
Datei in der main() definiert ist)). Das Problem lässt sich also nicht 
reproduzieren.

HTH

von Philipp M. (lord-maricek)


Angehängte Dateien:

Lesenswert?

Ok,

hier im Anhang habe ich einmal alle Dateien reingepackt.

Das Projekt ist in 12 Dateien aufgeteilt, und alles ist irgenwie 
voneinander abhängig.

Wenn ich das ganze übrigends mit Codeblocks compiliere, bekomm ich diese 
Meldung:
1
||=== test, Debug ===|
2
c:\winavr-20100110\lib\gcc\..\..\avr\include\util\delay.h|90|warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"|
3
c:\winavr-20100110\bin\..\lib\gcc\avr\4.3.3\..\..\..\..\avr\lib\avr51\libc.a(cmpsf2.o)||In function `__lesf2':|
4
c:\winavr-20100110\bin\..\lib\gcc\avr\4.3.3\avr51\libgcc.a(_lt_sf.o):c:\avrdev\gcc\build-avr\avr\avr51\libgcc\..\..\..\.\gcc\fp-bit.c|1287|first defined here|
5
||=== Build finished: 1 errors, 1 warnings ===|

Mfg
Philipp

Achja, wenn ich das Projekt ohne die GPS.h/.c compiliere geht alles ohne 
Probleme.

von g457 (Gast)


Lesenswert?

Ok, jetzt kann ichs reproduzieren. Lösung: libm dazulinken ('-lm'):
1
$ ls
2
Comm.rar         fifo.c       functions.h  protocol.c  uart.h
3
Communication.c  fifo.h       gps.c        protocol.h
4
defines.h        functions.c  gps.h        uart.c
5
$ avr-gcc -Wall -DF_CPU=8000000UL -Os -mmcu=atmega644p --std=c99 -o main *.c
6
gps.c: In function ‘gps_decode’:
7
gps.c:42: warning: array subscript is above array bounds
8
gps.c:46: warning: array subscript is above array bounds
9
[..]/x-chains/avr/bin/../lib/gcc/avr/4.4.4/../../../../avr/lib/avr5/libc.a(fp_powsodd.o):../../../libm/fplib/fp_powsodd.S:59: relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in [..]/x-chains/avr/bin/../lib/gcc/avr/4.4.4/avr5/libgcc.a(_mul_sf.o)
10
[..]/x-chains/avr/bin/../lib/gcc/avr/4.4.4/../../../../avr/lib/avr5/libc.a(fp_powsodd.o):../../../libm/fplib/fp_powsodd.S:69: relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in [..]/x-chains/avr/bin/../lib/gcc/avr/4.4.4/avr5/libgcc.a(_mul_sf.o)
11
$ avr-gcc -Wall -DF_CPU=8000000UL -Os -mmcu=atmega644p --std=c99 -o main *.c -lm
12
gps.c: In function ‘gps_decode’:
13
gps.c:42: warning: array subscript is above array bounds
14
gps.c:46: warning: array subscript is above array bounds
15
$ file main 
16
main: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped

Den m644p hab ich jetzt einfach mal in Übereinstimmung mit den genutzen 
PIN-Definitionen angenommen.

Jetzt musst Du nur noch(tm) die richtige(tm) Einstellung für Dein 
AvrStudio suchen :-)

HTH

von Klaus (Gast)


Lesenswert?

Philipp Maricek schrieb:
1
void gps_init(gps * const _this,protocol * const pr, autopilot * const ap,unsigned char sentence[5])

Weder das 'const', noch die '5' machen das, was Du willst.

von g457 (Gast)


Lesenswert?

So, hab spaßeshalber das AvrStudio5 installiert (maaan war das ein 
K[r]ampf..) in der wirrtuellen Maschine und Deine Dateien importiert.

Lösung für das Problem: in Project -> Properties -> Toolchain -> 
'AVR/GNU C Linker' -> Libraries 'm' (für libm.a) hinzufügen. (Bei der 
Gelegenheit auch gleich noch F_CPU definieren und Optimierung 
einschalten so nicht schon geschehen). Die Warning von oben
1
gps.c: In function ‘gps_decode’:
2
gps.c:42: warning: array subscript is above array bounds
3
gps.c:46: warning: array subscript is above array bounds
..solltest Du übrigens ernst nehmen, da hat der Compiler wie üblich 
recht (und wie wir alle wissen sind Warnings entgegen landläufiger 
Meinung nicht dazu da um ignoriert zu werden ;-)

HF

von g457 (Gast)


Lesenswert?

> Weder das 'const', noch die '5' machen das, was Du willst.

Was hast Du gegen die 'const' einzuwenden? (oder anders gefraggt: was 
'will' 'er' denn anderes?)

von Philipp M. (lord-maricek)


Lesenswert?

Moin,

danke jetzt gehts. Die Warnung ist jetzt weg, ich habe ausversehen statt 
array[2] , array[3] geschrieben.

Von Zeigern habe ich nicht nicht soviel Ahnung, und das mit dem const 
habe ich aus einem anderen Code so übernommen. 
http://www.gjlay.de/pub/c-code/fifo.html Dort habe ich auch den FIFO 
her.

MfG
Philipp

von Klaus (Gast)


Lesenswert?

g457 schrieb:
> Was hast Du gegen die 'const' einzuwenden? (oder anders gefraggt: was
> 'will' 'er' denn anderes?)

Nix. Ich hab mich wohl geirrt; reine Reflexhandlung. Es gibt nicht viele 
Beispiele, wo ein
1
foo * const bar
 richtig ist. Meistens will man ein
1
const foo * bar
 Aber, hier scheints tatsächlich doch zu stimmen :-).

von g457 (Gast)


Lesenswert?

Als Ergänzung:
1
> foo * const bar
'bar' ist ein ∗konstanter Zeiger∗ auf einen foo
1
> const foo * bar
'bar' ist ein Zeiger auf einen ∗konstanten foo∗
..und der Vollständigkeit wegen:
1
const foo * const bar
'bar' ist ein ∗konstanter Zeiger∗ auf einen ∗konstanten foo∗

Ein einziges 'richtig' gibts nicht, kommt immer auf die angedachte 
Semantik an. Bei des TOs Code ist der konstante Zeiger durchaus sinnvoll 
- schließlich will man sich in der Funktion nicht versehentlich z.B. 
'_this' verbiegen (sieht mir sehr nach einer Nachbildung von 'this' aus 
diversen oop-Sprachen aus).

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.