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?
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.
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
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.
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?
#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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.