Forum: Mikrocontroller und Digitale Elektronik IAR Workbench: Startadresse des Programms festlegen


von peter (Gast)


Lesenswert?

Hallo NG,

kann mir jemand von euch sagen, wo ich die Startadresse vom C-Programm 
(main) einstellen kann? Ich verwende einen AT91SAM7S256.

main
{
    ...
}

Vielen Dank
Peter

von Rudi Mentär (Gast)


Lesenswert?

RTFM!

von ABC (Gast)


Lesenswert?

oder schau dier die beispiele an,

kann mir nicht vorstellen, das IAR für den Baustein, oder einen seiner 
kleineren brüder nicht ein beispiel projekt beigelegt hätte.


und die main linkt man normalerweise sowieso nirgendwo hin. die wird vom 
cStartup.S irgend wann mal aufgerufen. und dafür das die cStartup.S 
ausgeführt wird, wird normalerweise schon im beispielprojekt gesogt.

Ich kann mir nur 2 möglichkeiten vorstellen.

1. erste gehversuche mit arm / IAR
-> beispielprojekt anschauen

2. du hast was ganz spezielles vor
-> linkerfile / RTFM aber das hättest du dan auch selber rauskriegen 
könne. IAR Installiert die alle mit. In pdf form. oder beim kauf in 
gedruckter version.

von peter (Gast)


Lesenswert?

Aha, ok.

Kann mir jemand von euch sagen, ob ich z.B. auch ein Array definieren 
kann, das an einer bestimmen Stelle liegt? Also z.B. sowas in der Art:

0x202000 main ...
0x202500 'hallo'
0x202600 'welt'

Ich habe schon gesehen, dass man über "projekt->einstellungen->linker" 
Adressen eingeben kann. Aber wie funktioniert das mit mehreren 
Speicherbereichen? Muss ich Textdateien bearbeiten, oder geht das auch 
über Menüs aus der Workbench raus?

MfG
Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Auch das geht über die Linkerkonfiguration.

Allerdings: Wozu soll das ganze gut sein?

von Peter (Gast)


Lesenswert?

Hallo Rufus,

zunächst mal danke für die Antwort.

> Allerdings: Wozu soll das ganze gut sein?

Nunja ich habe da momentan mehrere Probleme, der AT91SAM7S256 hat ja 
256kb flash und 64kb SRAM.

1. Bestimmte Dinge möchte ich gerne im SRAM "veränderbar" halten. So 
könnte ich mir eben vorstellen, dass ein bestimmtes Array da dann an 
einer bestimmten Stelle liegt (z.B. 0x202000)

2. Ich habe auch das Problem, dass ich nicht weiß, wo mein C-Programm 
eigentlich seinen Einstiegspunkt hat. Wenn ich z.B. mein Hello World 
oder RS232-Programm (ASM) via SAM-BA an 0x202000 lade, dann funktioniert 
"go 0x202000. Aber mit C-Sourcen bekomme ich es irgendwie nicht hin. Und 
ich denke mal, dass man es nicht einfach irgendwohin laden kann ohne 
realloc, oder? Es sind doch bestimmt auch stellenweise absolute Adressen 
in den binären Dateien verwendet, oder?

Es wäre echt super nett, wenn Du mir da vielleicht noch den ein oder 
anderen Tipp hättest, nachdem Du ja scheinbar genau weißt, wo man da was 
einstellen muss...

Vielen Dank,
Peter

von Jürgen K. (Gast)


Lesenswert?

Hallo Peter,

arbeite jetzt zwar hauptsächlich mit dem IAR Compiler für Renesas, 
müsste aber äquivalent auch für den ARM IAR Compiler gelten.

1.) Du kannst im XCL File (Linker File) ein eigenes Segment definieren 
und anschließend im Quellcode eine Pragma-Anweisung (#pragma 
segment=mySegment) vor Deiner Array Definition setzen. Damit zwingst Du 
den Linker Dein Array im Segment und damit angegebenen Adressbereich 
anzulegen.

2.) Noch einfacher: Die IAR compilerspezifische @ Anweisung verwenden. 
Beispiel:

unsigned int myArray[255] @ 0x202000;

Damit wird das Array beginnend an der Adresse 0x202000 angelegt.

3.) Selber noch nicht getestet, müsste aber theoretisch funktionieren.
a) typedef definieren
b) pointer vom type Deines typedef anlegen
c) Pointeradresse (mit &) auf gewünschte Adresse setzen. (und hoffen, 
das der Linker nichts anderes an dieser Position gelegt hat :-)

a) und b) sind optional. Evtl. direkt mit Adresse mit &myArray zuweisen. 
Einfach mal test.

Viel Erfolg.

Jürgen

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.