mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Philipp M. (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich benutzte AVR-Studio 5 und schreibe ein Programm, um GPS Daten 
auszuwerten. Aber ich bekomme immer den Fehler:
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
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:
#include <math.h>
#include <stdlib.h>
#include <string.h>
#ifndef _GPS_H_
#define _GPS_H_

#include "protocol.h"

#define VALIDATION_AUTONOMUS 'A'
#define VALIDATION_DIFFERENCIAL 'D'
#define VALIDATION_ESTIMATED 'E'
#define VALIDATION_NOT_VALID 'N'
#define VALIDATION_SIMULATOR 'S'

typedef struct gps{
    struct protocol * p_out;
    struct autopilot * ap;
    unsigned char sentence[5];
    unsigned char buffer[255];
    unsigned char indexer;
    unsigned char end_char_counter;
}gps;

extern void gps_init(gps * const _this,protocol * const pr, autopilot * const ap,unsigned char sentence[5]);
extern unsigned char gps_decode(gps * const _this,unsigned char inChar);

#endif //_GPS_H_
#include "gps.h"

void gps_init(gps * const _this,protocol * const pr, autopilot * const ap,unsigned char sentence[5])
{
    _this->p_out = pr;
    _this->ap = ap;
    for(unsigned char i=0; i<5; i++)
    {
        _this->sentence[i] = sentence[i];
    }
}

unsigned char gps_decode(gps * const _this,unsigned char inChar)
{
    _this->buffer[_this->indexer] = inChar;
    if(_this->buffer[_this->indexer]=='$')
    {
        for(unsigned char i=0; i<255; i++)
        {
            _this->buffer[i] = 0;
        }
        _this->indexer = 0;
    }
    if(_this->buffer[_this->indexer]=='*')
    {
        _this->end_char_counter = _this->indexer;
    }

    if(_this->end_char_counter+2==_this->indexer)
    {
        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]))
        {
       unsigned char tmp_indexer = 6;
            //Zeit
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                tmp_indexer+=1;
                char t[] = {_this->buffer[tmp_indexer],_this->buffer[tmp_indexer+1],'\n'};
                _this->p_out->data[ZEIT_1] = atoi(t);
                t[0] = _this->buffer[tmp_indexer+2];
                t[1] = _this->buffer[tmp_indexer+3];
        t[3] = '\n';
                _this->p_out->data[ZEIT_2] = atoi(t);
                t[0] = _this->buffer[tmp_indexer+4];
                t[1] = _this->buffer[tmp_indexer+5];
        t[3] = '\n';
                _this->p_out->data[ZEIT_3] = atoi(t);
                tmp_indexer += 6;
                _this->p_out->check_byte[ZEIT_1] = 0x01;
            }
            else
            {
                tmp_indexer++;
            }

            //Status der Bestimmung
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                //
                tmp_indexer+=2;
            }
            else
            {
                tmp_indexer++;
            }

            //Breite
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                tmp_indexer++;
                char t1[] = {_this->buffer[tmp_indexer],_this->buffer[tmp_indexer+1],'\n'};
                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'};
                tmp_indexer+=9;
                _this->ap->lon = atof(t2)/60.0 + (double)atoi(t1);
            }
            else
            {
                tmp_indexer++;
            }

            //Nord / Süd
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                tmp_indexer+=2;
            }
            else
            {
                tmp_indexer++;
            }

            //Länge
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                tmp_indexer++;
                char t1[] = {_this->buffer[tmp_indexer],_this->buffer[tmp_indexer+1],'\n'};
                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'};
                tmp_indexer+=9;
                _this->ap->lat = atof(t2)/60.0 + (float)atoi(t1);
            }
            else
            {
                tmp_indexer++;
            }

            //East / West
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                tmp_indexer+=2;
            }
            else
            {
                tmp_indexer++;
            }

            //GS
            if(_this->buffer[tmp_indexer+1]!=',')
            {
                char t[10];
                unsigned char tmp = 0;
                tmp_indexer++;
                while((_this->buffer[tmp_indexer]!=',')&&(_this->buffer[tmp_indexer]!='*'))
                {
                    t[tmp] = _this->buffer[tmp_indexer];
                    tmp++;
                    tmp_indexer++;
                }
            }
            else
            {
                tmp_indexer++;
            }

            return 0xff;
        }
    }

    _this->indexer++;
    return 0x00;
}

MfG
Philipp

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp M. (lord-maricek)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
||=== test, Debug ===|
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"|
c:\winavr-20100110\bin\..\lib\gcc\avr\4.3.3\..\..\..\..\avr\lib\avr51\libc.a(cmpsf2.o)||In function `__lesf2':|
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|
||=== Build finished: 1 errors, 1 warnings ===|

Mfg
Philipp

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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, jetzt kann ichs reproduzieren. Lösung: libm dazulinken ('-lm'):
$ ls
Comm.rar         fifo.c       functions.h  protocol.c  uart.h
Communication.c  fifo.h       gps.c        protocol.h
defines.h        functions.c  gps.h        uart.c
$ avr-gcc -Wall -DF_CPU=8000000UL -Os -mmcu=atmega644p --std=c99 -o main *.c
gps.c: In function ‘gps_decode’:
gps.c:42: warning: array subscript is above array bounds
gps.c:46: warning: array subscript is above array bounds
[..]/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)
[..]/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)
$ avr-gcc -Wall -DF_CPU=8000000UL -Os -mmcu=atmega644p --std=c99 -o main *.c -lm
gps.c: In function ‘gps_decode’:
gps.c:42: warning: array subscript is above array bounds
gps.c:46: warning: array subscript is above array bounds
$ file main 
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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp Maricek schrieb:
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.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
gps.c: In function ‘gps_decode’:
gps.c:42: warning: array subscript is above array bounds
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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: Philipp M. (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
foo * const bar
 richtig ist. Meistens will man ein
const foo * bar
 Aber, hier scheints tatsächlich doch zu stimmen :-).

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Ergänzung:
> foo * const bar
'bar' ist ein ∗konstanter Zeiger∗ auf einen foo
> const foo * bar
'bar' ist ein Zeiger auf einen ∗konstanten foo∗
..und der Vollständigkeit wegen:
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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.