Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage zu idata, xdata usw


von Sascha K. (quad2000)


Lesenswert?

Hallo an alle,

ich bin gerade dabei, einen AT89C51CC03 µC von Atmel mit Keil µVision 3 
zu programmieren.

Datenblatt:
www.atmel.com/dyn/resources/prod_documents/doc4182.pdf

Er hat folgende Daten:

256 Bytes of On-Chip Ram
2048 Bytes of ON-Chip ERAM
64K Bytes of On-chip Flash Memory
2K Bytes of On-chip Flash for Bootloader
2K Bytes of On-chip EEPROM

Nun meine Frage:

Wie spreche ich im Keil die einzelnen Speicher an und welche 
Unterschiede gibt es?
Ich kenne folgendes: xdata, idata z.B. xdata test;

Danke und schöne Pfingsten noch

von Sascha K. (quad2000)


Lesenswert?

Hat keiner eine Idee?

Kann ich die einzelnen Speicher für Variablen verwenden? Oder muss ich 
auf etwas achten?

von Daniel (Gast)


Lesenswert?

je nachdem für programm oder varibablen, check mal die anleitung von u3v 
ist dort sauber beschrieben...

von Helmi (Gast)


Lesenswert?

>256 Bytes of On-Chip Ram

Die ersten 128 Byte mit "data" oder "idata"
die 2. 128 Byte mit "idata"

idata  int i;
data   int i;

>2048 Bytes of ON-Chip ERAM
mit "xdata"

xdata int a;

>64K Bytes of On-chip Flash Memory
mit "code"  oder direkt als Programm

code int c = 12;

>2K Bytes of On-chip EEPROM
mit "xdata"


Gruss Helmi

von Sascha K. (quad2000)


Lesenswert?

Vielen Dank für die Hilfe.

>64K Bytes of On-chip Flash Memory
>mit "code"  oder direkt als Programm

Direkt als Programm??? Wie ist das gemeint?

von Helmut L. (helmi1)


Lesenswert?

>>64K Bytes of On-chip Flash Memory
>>mit "code"  oder direkt als Programm

>Direkt als Programm??? Wie ist das gemeint?

Dein Programcode steht steht ja im CODE Bereich.

Du kannst aber auch dort konstanten ablegen.

code char TestString[] = {"Test"};

Der String wird dann fest im CODE Bereich abgelegt

So ist das gemeint.

Gruss Helmi

von Yevgeniy K. (memberx)


Lesenswert?

Helmi schrieb:
>>2K Bytes of On-chip EEPROM
> mit "xdata"

Mit xdata schiebe ich mein Kram ins ERAM, aber nicht ins EEPROM

von Yevgeniy K. (memberx)


Lesenswert?

Weiß jemand, wie man in C mit idata die Variablen ins obere Hälfte des 
256 byte großen RAMs schreiben kann? Außer z.B. so

char idata my_var at "adresse im RAM"; ?

In dieser Variante muss man die Adresse jeder Variable vergeben. Gibt es 
vielleicht was, wo man sagen kann "schreibe alle Variablen die mit idata 
definiert sind ins obere Hälfte"

von Helmut L. (helmi1)


Lesenswert?

Yevgeniy K. schrieb:
> In dieser Variante muss man die Adresse jeder Variable vergeben. Gibt es
> vielleicht was, wo man sagen kann "schreibe alle Variablen die mit idata
> definiert sind ins obere Hälfte"

idata geht normalerweise von 0 .. 0xff. Du kannst dem Linker aber sagen 
wo idata beginnen soll, zumindest beim Keil Compiler geht das so.



   1
   2          data  int   a;
   3          idata  int  b;
   4
   5          void main (void)
   6          {
   7   1
   8   1        a = 12;
   9   1        b = 35;
  10   1
  11   1      }
  12
C51 COMPILER V6.00 MAIN 
02/15/2014 10:47:33 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION main (BEGIN)
                                           ; SOURCE LINE # 5
                                           ; SOURCE LINE # 6
                                           ; SOURCE LINE # 8
0000 750000      R     MOV     a,#00H
0003 75000C      R     MOV     a+01H,#0CH
                                           ; SOURCE LINE # 9
0006 7800        R     MOV     R0,#LOW b
0008 7600              MOV     @R0,#00H
000A 08                INC     R0
000B 7623              MOV     @R0,#023H
                                           ; SOURCE LINE # 11


Hier in der Linkermap sieht man wo er b hingelegt hat.

SYMBOL TABLE OF MODULE:  test51 (MAIN)

  VALUE           TYPE          NAME
  ----------------------------------

  -------         MODULE        MAIN
  C:0000H         SYMBOL        ICE_DUMMY
  C:0003H         PUBLIC        main
  D:0008H         PUBLIC        a
  I:0080H         PUBLIC        b    <<<<<<<< Hier liegt b (idata) auf 
addresse 80H
  -------         PROC          MAIN
  C:0003H         LINE#         5
  C:0003H         LINE#         6
  C:0003H         LINE#         8
  C:0009H         LINE#         9

von Segment (Gast)


Lesenswert?

Yevgeniy K. schrieb:
> Weiß jemand, wie man in C mit idata die Variablen ins obere Hälfte des
> 256 byte großen RAMs schreiben kann?

Man segmentiert den Speicher:
http://www.keil.com/support/man/docs/bl51/bl51_idata.htm

von Yevgeniy K. (memberx)


Lesenswert?

Vielen Dank für die Hilfe!

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.