Forum: Mikrocontroller und Digitale Elektronik Absolte addressing mit SDCC


von srb (Gast)


Lesenswert?

Hallo,
ich verwende den SDCC und einen 8051 von Silabs. Wegen Schreibschutz etc 
muss ich ein Datenarray auf eine feste Adresse im Code-Segment legen. 
Versucht habe ich es mit:

code __at (0xC000) unsigned char INI[INI_LEN*2]={ 10,12,37,...

Das Programm versucht zwar auf dieser Adresse das Array zu lesen, aber 
dort steht nichts. Wie kann ich den SDCC dazu bringen, mir dieses Array 
genau dort auch abzulegen?

Danke.

von Joe (Gast)


Lesenswert?

Funktioniert einwandfrei.

code at 0x0100  INI []={10,11,12,13,14,15,16,17};

Welche Version von SDCC verwendest du ?

von srb (Gast)


Lesenswert?

Also bei mir funktioniert das nicht. Ich verwende Version 2.6.0 #4309. 
Bist Du Dir sicher, daß es funktioniert?

Leg doch mal bitte die Adresse außerhalb Deines Programms, also z.B. auf 
0xC000.

von Joe (Gast)


Lesenswert?

Saug dir mal 20061030-4444, klar funktioniert das ich kann es ja im 
INTEL.HEX sehen.

Das mußt du mir dann schon glauben, welche Compiler Optionen verwendest 
du ?

--code-loc 0x0000  --model-small --std-sdcc99 --vc

Anbei meine Einstellungen.

von Εrnst B. (ernst)


Lesenswert?

Getestet mit sdcc 2.6.1 #4497 (Dec  2 2006):
1
code at 0xCCCC int test[]={1,2,3};
2
3
void main() {
4
5
}

Erzeugt im .asm file:
...
        .org 0xCCCC
_test:
        .byte #0x01,#0x00
        .byte #0x02,#0x00
        .byte #0x03,#0x00

und der Asembler packt entspechend die Daten an 0xCCCC.
Im .lst file:

   CCCC                     130         .org 0xCCCC
   CCCC                     131 _test:
   CCCC 01 00               132         .byte #0x01,#0x00
   CCCE 02 00               133         .byte #0x02,#0x00
   CCD0 03 00               134         .byte #0x03,#0x00

Schliesslich landet im .hex/.ihx File folgende Zeile:

:06CCCC000100020003005C

Passt also alles.

von Joe (Gast)


Lesenswert?

Ja, Version 2.5 weis ich nicht hatte einen BUG, der ist aber beseitigt.

von srb (Gast)


Lesenswert?

Nicht falsch verstehen. Ich habs Dir durchaus geglaubt. Allerdings meine 
ich, daß der Compiler das erst dann falsch macht, wenn es außerhalb des 
Programm-Adressbereichs liegt.

Wo bekomme ich denn diese neuere Version her? Eine neuere kann ich für 
Windows nicht finden...

Hier meine Einstellungen

sdcc -c --model-large --int-long-reent init.c
sdcc -c --model-large --int-long-reent --no-peep-comments x.c
sdcc --model-large x.rel init.rel

von Joe (Gast)


Lesenswert?


von srb (Gast)


Lesenswert?

So, es funktioniert nun. Wusste nicht, daß es auch quasi inoffizielle 
Versionen gibt, die man nutzen kann. Ich dachte immer, von sowas läßt 
man besser die Finger, wenns sicher sein soll.

Aber es funktioniert jetzt.

Vielen Dank an Euch!!

von Joe (Gast)


Lesenswert?

Ne ne, die sind schon offiziell. Wenn du mal Support brauchst dann weist 
du das zu schätzen, in den nightly snapshots sind "schnellen" BUGfixes 
enthalten.

von srb (Gast)


Lesenswert?

Ja, hab eben von den SDCC-lern auch eine Antwort bekommen. Allerdings 
leicht arrogant. Aber was solls, kostet ja nichts und ist gut.

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.