www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 C-Code an bestimmte Speicherzelle schreiben


Autor: Martin Bondza (Firma: Hummel) (marbo80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe ein Programm geschrieben das aus C- und Assembler Dateien 
besteht.
Jetzt muss ich meinen Code an einer bestimmten Stelle im Speicher 
ablegen.
In Assembler kann ich das mit dem ORG oder dem CSEG at Befehl machen.
Aber ich weiß nicht mit welchem Befehl ich meinen C-Code an eine 
bestimmte Stelle schreiben kann.
Kann mir jemand die Anweisung sagen?

Autor: Florian Kulling (flo_k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

die Zuordnung der Speicheradressen erfolgt bei C-Code im Linker. Den 
kann man per Makefile/Parameter dazu auffordern einen bestimmten Code in 
einen bestimmten Teil des Speichers zu legen. Zusätzlich gibt es noch 
sogenannte "#pragma" anweisungen die Compilerspezifische Aktionen 
ausführen. Es kommt auf den verwendeten Compiler an, ob der eine 
"#pragma"-Anweisung für Speicherbereiche an den Linker durchleitet.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Bondza wrote:
> ich habe ein Programm geschrieben das aus C- und Assembler Dateien
> besteht.

Dann mußt Du aber die Assemblerteile so schreiben, daß sie linkbar sind 
und nicht mit den C-Conventionen kollidieren (Variablendeklaration, 
Stacks, Parameterpassing, Memory-Model, Scratchpadregister usw.).
Ansonsten stürzen Deine Programme gnadenlos ab, wenn der Linker 
überhaupt erstmal ein Hex erzeugt.


> Jetzt muss ich meinen Code an einer bestimmten Stelle im Speicher
> ablegen.

Das sagt man dem Linker.
Ist aber bei C-Modulen vollkommen unnötig, da sie verschiebbar sind.
Dem Linker ist daher wurscht, wo sie stehen, er löst alle Referenzen 
entsprechend auf.

> Kann mir jemand die Anweisung sagen?

Nein, da wir nicht wissen, um welchen Compiler es geht.
Compiler- und Linkeroptionen sind immer Toolchain spezifisch, nur die 
C-Syntax ist standardisiert.


Peter

Autor: Martin Bondza (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Problem ist das ich zur Laufzeit mein Programm löschen will und neu 
beschreiben will und die C-Datei die ich dazu brauche schreibt er in den 
bereich der gelöscht wird also muss ich diese c-datei in einen Bereich 
schieben der nicht gelöscht wird. In Assembler würde ich es ja mit dem 
ORG Befehl machen nur leider funktioniert er nicht in C. Ich benutzte 
einen Keil-Compiler.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst bei Keil jede C-Funktion an eine bestimmte Stelle platzieren. 
Geht bei den Target-Einstellungen unter "BL 51 Locate". Bei CODE 
schreibst Du die betreffenden Funktionen mit der Zieladresse rein:

z. B.: ?CO?TESTROUTINE(0x5000)

Den korrekten Namen suchst Du Dir aus den LST/M51 File raus. Keil will 
da paar Besonderheiten.

Insgesamt würde ich Dir aber davon auch abraten. Um Programme während 
der Laufzeit zu ändern benutzt man meist andere Strategien. Um welchen 
µC geht es überhaupt?

Autor: Martin Bondza (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#Ich habe von Analog Devices den AduC831 da gibt es einen UserDownloader 
im oberen Speicherbereich von dort aus kann man den unteren 
Speicherbereich löschen und neu beschreiben. Mit UART habe ich das schon 
programmiert(in assembler) und es funktioniert auch. Jetzt will ich das 
ganze auch über CAN machen. Dafür habe ich schon eine fertige Datei 
can.c die ich in den oberen Speicherbereich legen will. Aber leider 
nicht weiß wie!
Wenn ich in den Target-Einstellungen LX51 Locate
?PR?can_input?CAN(0xF000)
eingebe kriege ich folgende Fehlermeldung
TO "mv_v134_RFID_pre.abs"
nooverlay
SEGMENTS ( can.obj nooverlay
?PR?can_input?CAN
)
*** ERROR L207: INVALID NAME
    POS: 153
     can.obj, mcp.obj TO mv_v134_RFID_pre.abs NOOVERLAY SEGMENTS 
(CAN.OBJ
Target not created
kann mir jemand sagen wie ich die datei can.c oder nur die funktionen in 
den oberen speicherbereich bekomme?

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.