- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: relocation truncated to fit

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716

    relocation truncated to fit

    Hallo,

    ich habe ein seltsames Problem und kann es mir nicht erklären. Folgender Code:

    Code:
    #define MSG_off   9
    //...
    void LCD_Text_EEPROM (U16 Offset)
    {
     U8 Zeichen = eeprom_read_byte ((uint8_t *)(uint16_t)Offset);
     while (Zeichen != 0)
     {
      LCD_Zeichen (Zeichen);
      Offset++;
      Zeichen = eeprom_read_byte ((uint8_t *)(uint16_t)Offset);
     }
    }
    //...
    void LCDMsg (U8 Msg)
    {
     U16 Addr = Msg<<4;
     LCD_Text_EEPROM (Addr);
    }
    //...
    int main (void)
    //...
    switch (GSM_Status)
    {
     case 0:  { LCDMsg (MSG_off);
    //...
    Wenn ich das compiliere erhalte ich als Fehlermeldung: P:\AVR\test.c:1186: relocation truncated to fit: R_AVR_7_PCREL against `no symbol'
    Zeile 1186 ist dabei die switch-Zeile.

    Bei Google habe ich herausgefunden, dass es was mit der Reihenfolge der eingebundenen Bibliotheken zu tun haben könnte. Die Funktionen LCD_Text_EEPROM und LCD_Zeichen sind tatsächlich in einer externen Bib. Aber egal an welche Reihenfolge ich diese Bib einbinde, der Fehler bleibt. Seltsam ist dass das Programm fehlerfrei compiliert wird und läuft, wenn ich die Zeile LCDMsg (MSG_off); auskommentiere. Seltsamerweise sind davor und danach aber auch aufrufe von LCDMsg. Es scheint nur ein Problem an dieser einen Stelle zu geben. Wie komme ich dem Problem auf die Schliche?

    Viele Grüße
    Andreas

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du, mit den geschweiften Klammern im "int main()" komm' ich nicht klar ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo PicNick,

    die int main besteht mittlerweilse aus fast 500 Zeilen. Ich habe zur Übersichtlichkeit deshalb nur den relevanten Teil gezeigt. Hier ist etwas mehr Code:

    Code:
      LCD_Cursor (1, 4);
      LCDMsg (MSG_GSM);
      switch (GSM_Status)
      {
       case 0:  { LCDMsg (MSG_off); break;}
       case 1:  { LCDMsg (MSG_boot); break;}
       case 2:  {  LCDMsg (MSG_config); break;}
    //...noch ein paar mehr...
    }
    Es funktioniert alles, bis auf die Zeile bei case 0. Ich kann auch den Wert der Konstanten LCD_off von 9 auf einen anderen Wert ändern, es hilft alles nichts.

    Wenn ich in die Zeile statt dessen folgendes schreibe:

    Code:
    LCD_Text_EEPROM (144);
    funktioniert alles. Ein seltsames Problem wie ich finde. Zwei Zeilen vorher funktioniert der Aufruf, zwei Zeilen nachher, nur genau an dieser Stelle erhalte ich die komische Fehlermeldung. Ich habe den Teil mit dem switch bereits in eine Funktion gepackt und auch diese etwas im Programm hin und hergeschoben. Das hat aber leider auch nicht geholfen.

    Viele Grüße
    Andreas

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Tscha. Bin ich für Einkreisen.
    1) lass beim "Case" die geschweiften weg, also einfach
    Code:
    case 0: LCDMsg(MSG_off);  break;
    2) den "call" aus dem "switch" testweise rausnehmen (davor)
    Code:
      LCD_Cursor (1, 4);
      LCDMsg (MSG_GSM);
      LCDMsg(MSG_off);              
      switch (GSM_Status)
      {
          etc
    nur um festzustellen, obÄs um den function-call geht, oder ob es was mit dem "Switch-case" zu tun hat.

    Wie sind denn U16 und U8 deklariert ? mit oder ohne * ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Ich habe es jetzt gerade noch mal probiert und jetzt läuft es. Das Programm ist schon ein paar Tage fertig und funktioniert, ich bin zur Zeit nur noch am Feinschliff und Optimieren. Es wurden inzwischen eine handvoll Codezeilen an verschiedenen Stellen geändert und nun taucht der Fehler nicht mehr auf. Seltsam!

    Vorschlag 2 hatte ich bereits probiert, das hat nicht zum Erfolg geführt.

    Welche U16 bzw. U8 meintest du genau?

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Das Problem ist ein zu großer Offset in einem relativen Spring, vermutlich wegen inline assembler.

    Wie sieht das mit -save-temps erzeugte Präcompilat (i-File) und das s-File aus?
    Disclaimer: none. Sue me.

Ähnliche Themen

  1. gcc/as - problem: relocation truncated bei .extern
    Von RedEagle im Forum Assembler-Programmierung
    Antworten: 0
    Letzter Beitrag: 01.12.2010, 08:15
  2. Antworten: 1
    Letzter Beitrag: 24.05.2007, 20:44
  3. Antworten: 9
    Letzter Beitrag: 23.07.2005, 10:30

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests