Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S256 / Codesegment zu klein (IAR)


von Peter P. (axis)


Lesenswert?

Hallo Newsgroup,

zunächst mal entschuldigung, dass ich das hier 2x poste, aber ich habe 
leider vergessen, den Betreff richtig zu beschreiben...

Ich bin gerade dabei, ein LCDisplay mit HD44780 anzusprechen
(Assembler). Leider scheint in meiner Konfiguration ein Fehler zu sein,
so dass folgende Fehlermeldung ausgegeben wird:

(IAR Workbench 4.0)

Error[e18]: Range error, Expression out of range
  Where $ = main + 0x104  [0x108]
            in module "main" (C:\Dokumente und
Einstellungen\Peter\Desktop\LCD asm\binary ram\Obj\asm.r79),
            offset 0x104 in segment part 1, segment ICODE
  What: 0x160000 - ($ + 8) [0x15FEF0]
  Allowed range: 0xFFFFF001 - 0x1000

Wo muss ich denn da drehen, dass ich für meinen Code mehr Speicher habe,
oder wie läuft das grundsätzlich mit dem Code-Segment?

Mein Header im Programm:
------------------------
        NAME    main

        PUBLIC  main

        COMMON  INTVEC:CODE
        CODE32

        B       main


        RSEG    ICODE:CODE
        CODE32

#define PIOA_BASE    0xFFFFF400
#define PIOA_SODR_OFFSET  0x30
#define PIOA_CODR_OFFSET  0x34

main:
.
.
.


Danke für jeden Tip !
Peter

von Peter Pippinger (Gast)


Lesenswert?

Hallo Newsgroup,

also jetzt habe ich meine Makros durch Unterprogramme abegelößt, die ich 
mit "BL" anspringe und mit MOV pc, r14 wieder verlasse. Wenn ich mit 
dieser Version viele Daten in mein ICODE-Segment einfüge
z.B. 2000x:
mov  r8, #us50
bl  warte

meckert mein die Workbench nicht beim Assemblieren. Wenn ich jedoch mit 
Mkros arbeite klappt das nicht. Wobei mir klar ist, dass die Stelle wo 
das Makro aufgerufen wird dann der Quelltext vom Makro vom Assembler 
eingefügt wird (ist das so richtig?). Ich habe schon das eingangs 
erwähnte problem schon, wenn ich nur wenige Makros ver wende (also nicht 
wie beim Test 2000x irgendwas)

Die Makros habe ich an dieser Stelle definiert:

<CODE wie eingangs beschrieben>
  B       main

   RSEG    ICODE:CODE
  CODE32

// ------------------------------------------------------------
WARTE  macro durchgaenge
  LOCAL warte1
// ------------------------------------------------------------
  ldr  r8, =durchgaenge
warte1:  subs  r8,r8,#1
  bne  warte1
  endm
// ------------------------------------------------------------

main:
<CODE>

Sind die Makros vielleicht an einer falschen Stelle definiert. Oder hat 
die freie Version der Workbench eine begrenzung an Makros (kann ich mir 
aber wegen der Fehlermeldung nicht vorstellen)?

Wäre echt nett, wenn jemand ein bischen Licht ins Dunkle bringen könnte. 
Mir wäre schon geholfen, wenn jemand den Zweck von Segmenten erklärt, 
und wo man Makros richtigerweise definiert.

Es klappt zwar jetzt auch ohne Makros. Aber sie zu verwenden würde mir 
schon gefallen.

Achja, was gibt es denn sonst noch für Möglichkeiten, Code sinnvoll zu 
gestalten (Makros, Unterprogramme, und ???)

PS.: Wieder mal alles ohne C(++) :-)

Danke und Viele Grüße
Peter

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.