Forum: Mikrocontroller und Digitale Elektronik 512Byte Variabel in C18


von Rudi (Gast)


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:
1
  extern struct Fat{  
2
  unsigned short     cntOfBytes; 
3
  unsigned short    cntSecs; 
4
  unsigned char     bufferDirty;
5
  unsigned long int   currentSectorNr;
6
  unsigned long int   startSectors; 
7
  unsigned long int   dir; 
8
  unsigned long int    rootDir; 
9
  unsigned long int    dataDirSec; 
10
  unsigned long int    fatSec;
11
  unsigned char     secPerClust; 
12
  unsigned char      fatType; 
13
#pragma udata FAT_buffer
14
  unsigned char     sector[512];
15
#pragma udata
16
  }fat;


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

unsigned char     sector[512];

Weiß jemand warum?

von Uhu U. (uhu)


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.

von Rudi (Gast)


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

von Uhu U. (uhu)


Lesenswert?

Der Speicherbereich ist zu klein, um den ganzen struct aufzunehmen.

von Rudi (Gast)


Lesenswert?

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

von Uhu U. (uhu)


Lesenswert?

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

0x23e == 574

Hat der Controller überhaupt genug RAM?

von Rudi (Gast)


Lesenswert?

doch, 18F4685 hat etwa 3KB Ram

von Michael H. (morph1)


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

von Spes (Gast)


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.

von Rudi (Gast)


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

von holger (Gast)


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.

von Rudi (Gast)


Lesenswert?

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

von Rudi (Gast)


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?

von holger (Gast)


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?

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.