mikrocontroller.net

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


Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Idee?

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

Autor: Daniel (Gast)
Datum:

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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Yevgeniy K. (memberx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helmi schrieb:
>>2K Bytes of On-chip EEPROM
> mit "xdata"

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

Autor: Yevgeniy K. (memberx)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Segment (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Yevgeniy K. (memberx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hilfe!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.