mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 512Byte Variabel in C18


Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Habe ein Problem mit einem Programm. In der Header Datei wird ein Struct 
definiert, das eine Variabel mit 512 Byte beinhaltet. Um diese im Ram 
unterzubringen, habe ich die Linker Datei wie folgt geändert:

...
DATABANK   NAME=gpr2   START=0x200   END=0x3FF   PROTECTED
...
SECTION    NAME=FAT_buffer   RAM=gpr2
...

das Struct in der Header sieht nun wie folgt aus:
  extern struct Fat{  
  unsigned short     cntOfBytes; 
  unsigned short    cntSecs; 
  unsigned char     bufferDirty;
  unsigned long int   currentSectorNr;
  unsigned long int   startSectors; 
  unsigned long int   dir; 
  unsigned long int    rootDir; 
  unsigned long int    dataDirSec; 
  unsigned long int    fatSec;
  unsigned char     secPerClust; 
  unsigned char      fatType; 
#pragma udata FAT_buffer
  unsigned char     sector[512];
#pragma udata
  }fat;  


Beim Compilieren erhalte ich jedoch einen Syntax Fehler in der Zeile mit 
der 512B Variabel:

unsigned char     sector[512];

Weiß jemand warum?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute, daß #pragma udata FAT_buffer festlegt, daß die folgenden 
Variablen in einen bestimmten Speicherbereich gelegt werden sollen.

Wenn das so ist: Es muß der ganze struct so angelegt werden. Für eine 
einzelne Komponente geht das nicht.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich hab nun versucht, den ganzen Struct in FAT_buffer zu übernehmen 
und den dafür reservierten Speicherbereich dementsprechend zu 
vergrößern.
So bekomm ich nun keinen Systax Fehler mehr, dafür aber:

 section '.udata_fat.o' can not fit the section. Section '.udata_fat.o' 
length=0x0000023e

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Speicherbereich ist zu klein, um den ganzen struct aufzunehmen.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie gesagt, ich hab den Bereich vergrößert. Ich habe FTA_buffer in der 
Linker Datei  insgesamt 3 mal 256Byte zugewiesen

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum sagt der Linker dann: Section '.udata_fat.o' length=0x0000023e?

0x23e == 574

Hat der Controller überhaupt genug RAM?

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doch, 18F4685 hat etwa 3KB Ram

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
überhaupt gibts in der anleitung vom c18 eine genaue anleitung wie man 
für den kleinen 8-bitter "huge arrays" baut.

einfach befolgen, dann frisst der auch 1024byte arrays klaglos

Autor: Spes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Speicher der PIC18 uC ist in Banken organisiert. Jede Bank ist 256 
Bytes groß.
Der MCC18 legt alle Variablen die zu einer Quelldatei gehören in eine 
Bank ab. Das FAT Objekt ist einfach zu gross für eine Bank. Um so 
größere Variablen in MCC18 zu verwenden muss man das Linkerscript ändern 
und die Variabelzugriffe über Pointer realisieren.

Wie das genau geht wir im Kapitel

5.2 APPLICATION: CREATING LARGE DATA OBJECTS AND THE USART

vom

MPLAB® C18 C Compiler User’s Guide

beschrieben.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab es immer so gemacht, wie es im manual steht und hat bislang 
immer geklappt. Nur diesmal hab ich ein struct mit unter anderem einer 
512B Varialbel und das scheint wohl das Problem zu sein.

Setze ich die "#pragma udata fat_buffer" directive vor das Struct, 
bekomme ich die Meldung, dass der Speicherbereich zu klein sei. Setze 
ich udata direkt vor die entspechende Variable im struct, bekomme ich 
einen Syntax Fehler.

die Linker Datei sieht nun wie folgt aus:



DATABANK   NAME=buffer  START=0x200  END=0x4FF  PROTECTED

SECTION    NAME=fat_buffer         RAM=buffer

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal ohne SECTIONS und ohne das #pragma udata.
Im Linkerscript einfach bei gpr0 mehrere Bänke
zusammenfassen:

DATABANK   NAME=gpr0       START=0x80           END=0xDFF

Eine Bank lässt du für den Stack übrig.
So klappt das bei mir.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo, danke. damit hat das compilieren geklappt, jetz muss ich nur noch 
versuchen ob das Programm so auch läuft...

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
immer wenn das Programm von main auf die erste Funktion springt, dort wo 
dann einige Varialben definiert werden, wird ein Reset ausgelöst... Kann 
obige Speichereinteilung der Grund dafür sein?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>immer wenn das Programm von main auf die erste Funktion springt, dort wo
>dann einige Varialben definiert werden, wird ein Reset ausgelöst... Kann
>obige Speichereinteilung der Grund dafür sein?


Vieleicht ist der Stack zu klein. Du versuchst doch hoffentlich nicht
dein struct local anzulegen?

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.