MPLAB-Verknüpfungsfehler

Ich arbeite mit Invensense IMU3000 und einem PIC18 Mikrocontroller. Ich migriere eine in MSVS2005 geschriebene Bibliothek nach MPLAB und nehme die richtigen Änderungen vor, um sie auszuführen. Der Code selbst enthält nur Warnungen, aber wenn es um das Verknüpfen geht, bekomme ich Folgendes:

Fehler – Abschnitt „.idata_dmpDefault.o“ passt nicht in den Abschnitt. Abschnitt „.idata_dmpDefault.o“ Länge=0x000004b0

Was bedeutet das?

Ich kann noch keine wirklich solide Antwort geben, aber in Ihrem Code ist ein Abschnitt definiert, in den Daten/Variablen/Code hineingehen (wahrscheinlich Variablen), der nicht als ausreichend großer Abschnitt im Linker definiert ist.
Welchen PIC18 verwendest du? Hat es genug RAM für Ihre Anwendung? Welchen Compiler/Assembler verwenden Sie für Ihren Code?
@Stefano: Was macht deine VS-Bibliothek? Der Chip, den Sie erwähnen, kommuniziert nur mit I2C , und ich könnte mir nur vorstellen, dass VS direkten Zugriff darauf (oder einen ähnlichen) hat, wäre über SMBus (der Chip wäre auf Ihrem Motherboard). Kommuniziert die VS-Bibliothek mit dem ARM-Entwicklungsboard?
@ mjh2007 Ich habe nur 2K, das ist das Problem, nehme ich an. Ich werde versuchen, den Bedarf daran zu reduzieren.
@Nick T Die von Invensense bereitgestellte Bibliothek kommuniziert über das ARM-Board mit dem Chip. Ich ändere es, um es auf dem PIC18 zu verwenden. Die I2C-Kommunikation ist nur die unterste Schicht, dann gibt es alle Registereinstellungen und DMP-Einstellungen (Dynamic Motion Processor) und die Verwendung (Sie können ohne diese Bibliothek nicht verwenden, die Verwendung der direkten Register ist im Datenblatt nicht angegeben). Grundsätzlich ist ein ganzer Prozessor in die IMU eingebettet, der gesteuert werden muss, und daraus ergibt sich der enorme RAM-Bedarf.
@Stefano, also wirst du einen PIC an einen ARM anhängen und die Verarbeitung auf dem PIC durchführen? Das scheint eine mutwillige Verschwendung von Ressourcen zu sein. Das IMU3000-Datenblatt listet eine Reihe von Registern (0 bis 0x3E) auf. Gibt es noch etwas anderes? Es sieht einfach aus wie ein 3-Achsen-Kreisel, der auch ein anderes I2C-Gerät (idealerweise einen Beschleunigungsmesser) lesen kann.
Es tut mir leid, dies ist eine Frage, keine Antwort, aber ich kämpfe hier mit demselben Problem. Ich habe mich gefragt, ob es Ihnen gelungen ist, diesen Chip mit einem pic18-Gerät zu verwenden.

Antworten (4)

Alle Variablen im Programm nehmen Platz ein, und Sie verwenden zu viel für den Chip, für den Sie es kompilieren möchten. Das Programm, das Sie zu kompilieren versuchen, benötigt 0x4B0 Bytes (1200 dezimal), und Sie haben etwas weniger als das.

Finden Sie heraus, wie viel RAM-Speicher Ihr PIC18 hat. Stellen Sie sicher, dass es mit dem übereinstimmt, wofür Sie kompilieren. Möglicherweise gibt es irgendwo eine Linker-Definitionsdatei, die die Größe der verschiedenen Abschnitte definiert. Abschnitt IDATA ist Ihr aktuelles Problem.

Jemand, der sich besser mit MPLAB auskennt, kann möglicherweise Details darüber ausfüllen, was Ihre tatsächlichen Einschränkungen sind und wie Sie den Compiler für Ihren Chip richtig konfigurieren.

Das Lesen von FAQ-8 und FAQ-10 im Microchip C18 Compiler Getting Started Guide sollte Ihnen helfen, die Probleme zu lösen. Ich bin mir nicht sicher, ob Sie C18 verwenden oder nicht, um Ihren Code zu kompilieren, aber selbst wenn Sie es nicht sind, müssen Sie wahrscheinlich Ihr Linker-Skript ändern, um die Größe der RAM-Bank zu erhöhen.

Sie sind entweder

(A) Der Flash-Speicher zum Speichern der Anfangswerte der Variablen geht aus, oder
(B) Ihre Variablen sind größer als das Segment.

Der Linker versucht, die dmpDefault-Datei zu verknüpfen, aber es überläuft die definierten Speichersegmente des Linkers.

ODER

Bei MCC18 erzeugt jede Datei 1 Datenabschnitt mit maximal 256 Bytes (1 Bank). .idata_dmpDefault ist viel größer als das. Sie können benannte Datenabschnitte erstellen, indem Sie Banken im Linker kombinieren und #pragmas um die Variablen setzen, um diese Variablen in diesem Abschnitt zu lokalisieren.

Ich danke Ihnen allen für Ihre freundliche Hilfe!

Vielleicht kann ein Teil der Lösung allgemein helfen: Ich habe herausgefunden, dass ich große konstante Arrays habe (ich hatte den Code nicht selbst geschrieben ...) und ich habe den RAM-Bedarf drastisch reduziert, indem ich sie in Flash anstelle von RAM eingefügt habe, indem ich die verwendet habe Schlüsselwort "rom" in ihrer Deklaration.