Wie kann ich ARM-Code von externem Speicher ausführen?

8

Ich verwende einen LPC2132 ARM-Chip, um ein Programm zu entwickeln. Mein Programm ist jedoch größer geworden als der Platz auf dem Chip.

Wie kann ich meinen Chip mit einem externen Speicherchip verbinden, um zusätzlichen ausführbaren Code zu speichern? Ist das möglich? Wenn nicht, was machen Leute normalerweise, wenn ihnen der Chipraum ausgeht?

    
samoz 12.04.2010, 18:08
quelle

6 Antworten

10

Marks Antwort ist eine gute. Eine Frage - haben Sie zu wenig RAM, oder Flash oder beides? Die Lösungen / Antworten könnten davon abhängen ...

Vor ein paar Jahren befand ich mich in einer ähnlichen Situation (auf dem LPC2148 fehlte der Platz (Flash und RAM). Von den pinkompatiblen Teilen war dies der größte Flash- und der größte RAM. So war es eine unglückliche Situation von "mach mit dem, was du hast." Und wie Mark sagte, wurde der falsche Chip gewählt (naja, die Anforderungen und Funktionalität wuchsen über das hinaus, was der Chip ursprünglich tun sollte ... ich bin mir sicher nein ein anderer hat das je erlebt ;-))

Wie auch immer, ich befand mich in einem "Kampf der Bytes". Hier sind die Dinge, an die ich mich erinnern kann (wohlgemerkt, eine Menge von diesem Code habe ich vom Kunden geerbt ...)

  • [+ RAM, -ROM] mache alles, was möglich ist
  • [+ ROM] Verwenden Sie, wo möglich, den Daumen (siehe Marks Kommentare)
  • [+ ROM] verwendet wo möglich Lookup-Tabellen
  • [+ ROM] Re-Faktor & amp; Kombiniere gängige Funktionalität (insb. wandele stark genutzte funktionsähnliche Makros in Subroutinen)
  • [+ ROM] alles, was eine Funktion ist, die von einem Ort aufgerufen wird - lege es direkt in eine Zeile anstatt in eine Funktion
  • [+ ROM, + RAM] Ändern Sie die Verwendung aller Gleitkommawerte in Festkomma
  • [+ ROM, + RAM] Eliminiere unbenutzte Variablen + Konstanten (verwende lint & amp; linker map um zu finden / eliminieren / verifizieren)
  • [+ ROM] Ersetzen Sie den Schalter w / if / else und umgekehrt
  • [+ ROM] stellen Sie sicher, dass Ihr Linker so konfiguriert ist, dass er "toten" (nicht verwendeten) Code löscht
  • [+ ROM] überarbeitet Zeichenfolgen und Konstanten so, dass identische "Dinge" nur an einer Stelle definiert sind
  • [+ ROM] (keuchen, seufzen) Ersetze Funktionen zum Verstecken von Daten mit Makros (oder inline, wenn du kannst) - hüte dich vor Vorkauf, Wettrennen, gegenseitigem Ausschluss, etc ...
  • [+ ROM, + RAM] - Eliminiere alle Debugging- / Temp-Codes - normalerweise gibt es I / O-Pin-Umschalt / Drucke / etc ..., die nicht bedingt kompiliert sind

Mann, es gibt eine Menge mehr, aber ich muss zu einem Meeting laufen. Alles, woran ich mich erinnere, ist, dass es Fortschritt war, Zehner & Amp; Hunderte von Bytes zu einer Zeit, die zu erheblichen Einsparungen führten. Ich habe am Ende etwa 20% von Flash & amp; RAM, und das war genug, um das Projekt abzuschließen. Ich brauchte vielleicht ~ 2 Wochen, um das Zeug zu säubern, aber die Kosteneinsparungen haben sich gelohnt.

Ich werde versuchen, zurückzukommen & amp; Post mehr Taktik, ich kann gerade nicht jetzt. Für den Rekord war ich in Situationen, in denen ich Code in & amp; aus dem RAM zur Laufzeit aus dem seriellen Flash nach Bedarf (Algorithmen, Tabellen, etc ..) und es war schrecklich. Versuchen Sie zunächst, Ihren aktuellen Code so weit wie möglich zu straffen. Es ist auch eine etwas intellektuelle Übung und es zwingt Sie, unter die Haube zu kommen & amp; Verstehen Sie, was zur Hölle Ihr Compiler wirklich macht.

Letzter Punkt: Schreiben Sie einen guten Tight-Code im gesamten Projekt, aber führen Sie diese Art der Optimierung am Ende aus, wenn es notwendig ist und ein Geschäftsfall dies rechtfertigt .

    
Dan 12.04.2010, 22:11
quelle
8

Schauen Sie sich das Datenblatt für diesen Teil hier an:

Ссылка

Es hat anscheinend keine Schnittstellen für externe Flash- oder SDRAM-Speicherkarten oder eine MMU.

Es hat SPI-Ports, die für die Schnittstelle zu SD-Karten, EEPROM oder seriellen Flash für Off-Chip-Speicher verwendet werden könnten, aber diese würden nicht Speicher zugeordnet werden, müssten Sie verschieben Code-Segmente in einem out sehr begrenzter RAM auf diesem Chip, das wäre schwierig.

Es kann "genug" sein, dass Sie Daten in den externen Speicher verschieben und nur Code im On-Chip-ROM speichern. Dies würde Ihre Herausforderung auf Kosten einer erhöhten Latenz beim Zugriff auf Daten vereinfachen. Sie können auch den Daumen-Befehlssatz verwenden, der die Code-Größe auf Kosten einer gewissen Geschwindigkeit reduziert und den Compiler für die Codedichte anstatt für die Geschwindigkeit optimiert.

  

Wenn nicht, was machen die Leute normalerweise?   wenn sie keinen Chipraum mehr haben?

Die unglückliche Antwort hier ist, dass Sie den falschen Chip für Ihre Anwendung gewählt haben und / oder neu überdenken müssen, wie Ihre Anwendung aufgebaut ist, damit sie in diesen Chip passt.

BEARBEITEN:

Es sieht auch so aus, als gäbe es einige fast pin-kompatible Teile mit mehr Ressourcen. Der LPC2138 hat 512kB Flash und 32kB RAM (im Vergleich zu 64/16). Es gibt auch ein paar Größen zwischen den beiden zur Verfügung.

Ein kurzer Blick auf die Pin-Outs sah aus, als ob der einzige Unterschied ein zweiter ADC an Bord wäre, der mit einigen der anderen Pins gemultiplext ist. Schau dir das natürlich ganz genau an, aber es sieht so aus, als könntest du einfach zu den höheren Endteilen wechseln, ohne den Rest des Boards zu verändern.

    
Mark 12.04.2010 18:24
quelle
2

Wenn Sie externen Speicher anschließen müssen (Hardware-Änderungen sind notwendig), sollten Sie einen Chip mit größerem Speicher verwenden. In der Tat sind einige Chips vollständig Pin-kompatibel und haben mehr Flash, so dass Sie Redesign vermeiden (nur Chip-Ersatz).

    
kgiannakakis 12.04.2010 18:25
quelle
1
  

Wenn nicht, was machen die Leute normalerweise?   wenn sie keinen Chipraum mehr haben?

Als erstes würden sie ihre Anwendung optimieren. Ich spreche nicht über das Ausführen des Compileroptimierers (obwohl das ein Teil der Lösung sein könnte), aber das Anwenden von Techniken wie Dan hat vorgeschlagen. Betrachten Sie die Platzeffizienz Ihrer Datenstrukturen und Algorithmen, oft gibt es einen Kompromiss zwischen Speicherplatz und Ausführungsgeschwindigkeit, aber Sie brauchen vielleicht nicht den schnellstmöglichen Algorithmus, aber Sie müssen Platz sparen.

Sie müssen Ihr Ziel kennen und wissen, ob es in erster Linie machbar ist. Um wie viel überschreitet Ihre Anwendung den verfügbaren Speicherplatz und wie groß ist sie derzeit? Die Linker-Map oder das Build-Protokoll sollte Ihnen dies sagen. Wenn Sie die Optimierung noch nicht angesprochen haben, habe ich selten eine Anwendung gesehen, die nicht mindestens 5% relativ schmerzfrei und noch konzertierter abklopfen konnte, noch bevor der Optimierer verwendet wurde.

Die Linker-Map zeigt Ihnen auch die Menge an Speicher an, die von jeder Funktion / jedem Modul verwendet wird. So können Sie Ihre Optimierung dort einsetzen, wo sie die größte Wirkung hat. Sie können auch von der Map-Datei überrascht werden, welcher Bibliothekscode verknüpft wurde, und Sie könnten sich fragen, warum und ob dieser beseitigt werden könnte.

Die Verwendung der Compiler-Optimierung beschränkt die Möglichkeit, einen Debugger einfach zu verwenden, aber Sie müssen nicht jedes Modul optimieren. Wenn Sie also Debuggen, aber auch Compiler-Optimierung benötigen, optimieren Sie alle Module außer denen, die Sie zu einem bestimmten Zeitpunkt debuggen.

Beachten Sie jedoch, dass Code, der scheinbar funktioniert, aber fehlerhaft ist oder ein undefiniertes Sprachverhalten verwendet, sein Verhalten ändern kann (d. h. fehlschlägt), nachdem der Compiler optimiert wurde. Sie erhalten einen Code, der fehlschlägt, aber nicht debuggt werden kann. Die beste Strategie zur Vermeidung dieser Situation besteht darin, den Code mit der maximalen Warnstufe zu erstellen, die Ihr Compiler zulässt (und Warnungen auf Fehler zu setzen), und alle Warnungen zu beseitigen. Verwenden Sie nach Möglichkeit ein statisches Analysetool wie Lint.

Wenn Sie es noch nicht getan haben, wäre die schnellste und drastischste Speicherung in Ihrem Fall wahrscheinlich die Kompilierung in den Thumb- statt in den ARM-Befehlssatz.

Schließlich, wenn alles andere fehlschlägt, ist Ihr Teil ein Mitglied einer Familie von Geräten LPC2131 / 32/34/36/38, der 'größte' Teil mit 512K Flash / 32K RAM, so dass Sie zu einem anderen Teil in die gleiche Familie und weitgehend Software-Kompatibilität beibehalten. Überprüfen Sie das Datenblatt , wenn Sie auch Pin-Kompatibilität benötigen.

    
Clifford 12.04.2010 22:52
quelle
-1

Wählen Sie einen TI OMAP-Prozessor. Alle diese laufen Code von DDR3 (oder DDR2) Speicher und können mit 1GHz für einige Modelle arbeiten. Der einzige Nachteil hier ist, dass diese Arten von Prozessoren sind alle BGA und DDR2 / 3 Speicher PCB-Layout ist nicht einfach oder einfach, das erste Mal richtig zu bekommen.

    
Joseph Perkins 30.07.2013 20:49
quelle
-2

Sie müssen einen Hot-Swap-fähigen Modulcode entwickeln und eine Art Speicherchip für die externen Module anschließen.

    
Paul Nathan 12.04.2010 18:12
quelle

Tags und Links