2012-11-06 1 views
1

Un projet a été compilé et exécuté avec succès sur l'appareil. Mais après avoir dit à l'éditeur de liens qu'il devrait mettre la partie du code d'application à la mémoire ROM, au lieu de SDRAM, je reçois l'erreur suivante à l'étape de liaison:Erreur de relocalisation IAR

Erreur [Lp002]: relocalisation a échoué: valeur hors de portée ou illégale: 0x60000545 Genre: R_ARM_PREL31 [0x2A] Lieu: 0xa0000030 Module: I: \ projet \ Debug \ Obj \ fileOper.o Section: 128 (.ARM.exidx) Offset: 0x0 Cible: 0x00000574 "SECTION_FILEOP_87" Module: I: \ Project \ Debug \ Obj \ fileOper.o Section: 104 (SECTION_FILEOP) Offset: 0x4f4

J'ai lu le C/C++ Guide de IAR. Mais il ne fournit pas assez d'explications concernant cette erreur. Donc, même en lisant le manuel je ne peux pas obtenir la raison de cette erreur. Quelqu'un peut-il aider à résoudre ce problème? En fait, le IAR C/C++ guide de développeurs dit:

Pour chaque instruction qui ne peut pas être déplacé correctement, ILINK va générer une erreur de déplacement. Cela peut se produire pour les instructions où la cible est hors de portée ou est d'un type incompatible, ou pour beaucoup d'autres raisons. Puis il fournit l'erreur comme un exemple qui est différent de dans mon cas.

EDIT 1: J'ai créé le petit projet qui reproduit les mêmes erreurs et il se compose des fichiers fileOper.cpp et main.cpp uniquement.

Le fichier ICF utilisé pour dire linker comment mettre à la mémoire des sections:

définir symbole intvec_start = 0x10000000;

/-Memory régions-/

/-TUNNELS ROM-/

symbole FLASH_ROM_start = définissent 0x00000000;

définir le symbole FLASH_ROM_end = 0x0007FFFF;

/* RAM interne */

définir symbole RAM_start = 0x10000000;

définir le symbole RAM_end = 0x10017FFF;

/* SDRAM */

définir symbole SDRAM_start = 0xA0000000;

définir le symbole SDRAM_end = 0xA1FFFFFF;

/-Sizes-/

définir symbole size_stack = 0x4000;

définir le symbole taille_heap = 0x2000;

définir mémoire mem avec size = 4G;

définir la région FLASH_region = mem: [from FLASH_ROM_start to FLASH_ROM_end];

définir la région RAM_region = mem: [de RAM_start à RAM_end];

définir la région SDRAM_region = mem: [de SDRAM_start à SDRAM_end];

définir le bloc CSTACK avec l'alignement = 8, size = size_stack {};

définir le bloc HEAP avec l'alignement = 8, size = size_heap {};

initialiser par copie avec packing = zeros {readwrite};

ne pas initialiser {section .noinit};

placer à l'adresse mem: intvec_start {section .intvec};

placez au début de FLASH_region {section readonly.cstartup};

place dans RAM_region {bloc CSTACK};

dans SDRAM_region {} readonly

sauf {section} FILEOP en lecture seule;

placer dans SDRAM_region {readwrite};

placer dans SDRAM_region {bloc HEAP};

placer dans FLASH_region {section en lecture seule FILEOP};

fileOper.cpp: Je l'ai changé, mais il reproduire toujours la même erreur.

#include "fileOperbug.h" 
#include <string> 

char *fgets(char *str, int num, std::string *stream) { 

    char *pointer = 0; 
    return pointer; 
} 

std::string *fopen(const char *name, const char *mode) { 
    std::string *str = new std::string(); 
    str->assign(""); 
    return str; 
} 
+0

Est-ce que la réponse de cette aide question stackoverflow acceptée: [Comment fixer un « \ [Lp002 \]: relocalisation a échoué avec des outils IAR ARM] [1] [1]: http: //stackoverflow.com/questions/1208312/how-to-fix-a-lp002-relocation-failed-with-iar-arm-tools – Habi

+0

J'ai déjà vu ça, ça n'aide pas, la raison est différente, mais l'erreur est la même – maximus

+0

Pouvez-vous poster les détails des changements que vous avez faits pour dire à l'éditeur de liens qu'il devrait mettre une partie du code de l'application dans la ROM? Peut-être que vous pouvez également afficher les parties pertinentes de 'fileOper.c'? –

Répondre

1

J'ai résolu le problème. Lors de l'utilisation de l'atelier IAR Embedded: Options du projet -> Compilateur C/C++ -> onglet Langue 1. Là, au "dialecte C++" il y avait une case à cocher nommée "avec des exceptions" à l'endroit où elle était vérifiée. L'erreur au niveau de la liaison se produit lorsque la case "avec exceptions" est cochée. Tout le code qui utilise des exceptions doit être chargé sur ROM. Sinon, le "avec des exceptions" devrait être décoché.

Questions connexes