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


von Martin B. (Firma: Hummel) (marbo80)


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?

von Florian K. (flo_k)


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.

von Peter D. (peda)


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

von Martin Bondza (Gast)


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.

von Matthias (Gast)


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?

von Martin Bondza (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.