Forum: Mikrocontroller und Digitale Elektronik PIC & C18: Error Stack frame too large


von RS4B5 (Gast)


Lesenswert?

Salu zusammen

Yep, der Titel sagt schon fast alles ;o))

Ich bin gerade bei einem neuen Projekt. Bis data haben wir den CCS 
Compiler eingesetzt, naaaaaaaaaja :o)

Nun bin ich mal mit C18 am herumspielen und bekomme immer diesen 
komischen Fehler wenn ich folgende Zeile einfüge:

unsigned char dummy[511];

(Das Projekt beinhaltet nicht viel mehr als ein Main, sollte also an 
nichts anderem liegen...)

main.c:75:Error [1300] stack frame too large

Wieso will der denn das auf dem Stack (der Error Message nach zu 
urteilen) ablegen?? Ich will das doch im RAM g

Kann mir einer bitte auf die Sprünge helfen, fühle mich gerade sehr blöd 
;o)

Grüessli aus der CH

RS4B5
von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Beitrag "Problem mit C18 compiler von Microchip"

E.1.1 Stack Frame Size
When the compiler is operating in Extended mode, the total stack frame 
size (local
variables, parameters and frame pointer preservation) is limited to 96 
bytes per
function. In Non-extended mode, for each function 120 bytes are 
available for locals
and an additional 120 bytes are available for parameters.
von RS4B5 (Gast)


Lesenswert?

Hm, vielen Dank für die rasche Antwort.

Ja das heisst dann wohl das ich das Linker Skript ändern muss, oder? Da 
blick ich echt nicht durch. Hab schon so einige Sachen programmiert, 
also auf unterschiedlichen Systemen, aber so was ist mir noch nie 
passiert. zszszs ;o)

Es geht um einen PIC18F46K80. Kann mir jemand sagen was ich an meinem 
Skript anpassen muss damit ich ein Array mit 512 Positionen als Globale 
Variable anlegen kann? Die brauch ich übrigens für eine MicroSD Karte...

Wäre echt toll wenn mir jemand helfen könnte. Wird ja denke ich kein all 
zu grosser Akt sein für jemanden der durchblickt

Grüessli RS4B5




// File: 18f46k80_g.lkr
// Generic linker script for the PIC18F46K80 processor

#DEFINE _CODEEND _DEBUGCODESTART - 1
#DEFINE _CEND _CODEEND + _DEBUGCODELEN
#DEFINE _DATAEND _DEBUGDATASTART - 1
#DEFINE _DEND _DATAEND + _DEBUGDATALEN

LIBPATH .

#IFDEF _CRUNTIME
  #IFDEF _EXTENDEDMODE
    FILES c018i_e.o
    FILES clib_e.lib
    FILES p18f46k80_e.lib

  #ELSE
    FILES c018i.o
    FILES clib.lib
    FILES p18f46k80.lib
  #FI

#FI

#IFDEF _DEBUGCODESTART
  CODEPAGE   NAME=page       START=0x0               END=_CODEEND
  CODEPAGE   NAME=debug      START=_DEBUGCODESTART   END=_CEND 
PROTECTED
#ELSE
  CODEPAGE   NAME=page       START=0x0               END=0xFFFF
#FI

CODEPAGE   NAME=userid     START=0x200000          END=0x200007 
PROTECTED
CODEPAGE   NAME=cfgmem     START=0x300000          END=0x30000D 
PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF 
PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF003FF 
PROTECTED

#IFDEF _EXTENDEDMODE
  DATABANK   NAME=gpre       START=0x0               END=0x5F
#ELSE
  ACCESSBANK NAME=accessram  START=0x0               END=0x5F
#FI

DATABANK   NAME=gpr0       START=0x60              END=0xFF
DATABANK   NAME=gpr1       START=0x100             END=0x1FF
DATABANK   NAME=gpr2       START=0x200             END=0x2FF
DATABANK   NAME=gpr3       START=0x300             END=0x3FF
DATABANK   NAME=gpr4       START=0x400             END=0x4FF
DATABANK   NAME=gpr5       START=0x500             END=0x5FF
DATABANK   NAME=gpr6       START=0x600             END=0x6FF
DATABANK   NAME=gpr7       START=0x700             END=0x7FF
DATABANK   NAME=gpr8       START=0x800             END=0x8FF
DATABANK   NAME=gpr9       START=0x900             END=0x9FF
DATABANK   NAME=gpr10      START=0xA00             END=0xAFF
DATABANK   NAME=gpr11      START=0xB00             END=0xBFF
DATABANK   NAME=gpr12      START=0xC00             END=0xCFF

#IFDEF _DEBUGDATASTART
  DATABANK   NAME=gpr13      START=0xD00             END=_DATAEND
  DATABANK   NAME=dbgspr     START=_DEBUGDATASTART   END=_DEND 
PROTECTED
#ELSE //no debug
  DATABANK   NAME=gpr13      START=0xD00             END=0xDFF
#FI

DATABANK   NAME=gpr14      START=0xE00             END=0xE40
DATABANK   NAME=sfr14      START=0xE41             END=0xEFF 
PROTECTED
DATABANK   NAME=sfr15      START=0xF00             END=0xF5F 
PROTECTED
ACCESSBANK NAME=accesssfr  START=0xF60             END=0xFFF 
PROTECTED

#IFDEF _CRUNTIME
  SECTION    NAME=CONFIG     ROM=cfgmem
  #IFDEF _DEBUGDATASTART
    STACK SIZE=0x100 RAM=gpr12
  #ELSE
    STACK SIZE=0x100 RAM=gpr13
  #FI
#FI
von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

von holger (Gast)


Lesenswert?

DATABANK   NAME=gpr0       START=0x60              END=0xCFF

gpr1 bis gpr12 löschen.
von holger (Gast)


Lesenswert?

unsigned char dummy[511];

Ein Sektor hat übrigends 512 Bytes;)
von RS4B5 (Gast)


Lesenswert?

Sorry, Tippfehler, natürlich 512 ;o)))

Merci, werde ich doch gleich mal versuchen.

Eine Frage habe ich aber noch...

Wenn ich nun dies mache:

DATABANK   NAME=gpr0       START=0x60              END=0xCFF

gpr1 bis gpr12 löschen.

Dann gibts ja nur noch eine gpr, nehme mal an das heisst Gruppe. Der PIC 
hat noch einen ECAN mit an Bord. Dieser hat irgend eine Funktion um 
direkt die Buffer im RAM anzusprechen. Mach ich mir dann das nicht 
kaputt?

Wieso werden dann überhaupt so Speicherbereiche eingebaut, wenns auch 
mit einem klappt? Wäre ja viel einfacher: 1 Topf, alles drin :o) oder 
was ist der Sinn hinter der Geschichte?

Tschuldigung für die Fragerei, aber hab halt sonst niemanden der mir mal 
was erklärt. PIC ist für mich irgendwie speziell, nicht irgendwie 
schlecht oder so, aber manchmal frag ich mich halt schon was die sich 
überlegen.

Grüessli und nochmals Merci für die Antworten!

RS4B5
von Meister E. (edson)


Lesenswert?

Hallo,

RS4B5 schrieb:
> gpr, nehme mal an das heisst Gruppe

Es steht für 'General Purpose Register'.

RS4B5 schrieb:
> Der PIC
> hat noch einen ECAN mit an Bord. Dieser hat irgend eine Funktion um
> direkt die Buffer im RAM anzusprechen. Mach ich mir dann das nicht
> kaputt?

Nein, die Sektion liegt ab 0xF60 (nennt sich ACCESSBANK):
1
ACCESSBANK NAME=accesssfr  START=0xF60             END=0xFFF
2
PROTECTED

Gruß,
Edson
von RS4B5 (Gast)


Lesenswert?

So, hab ich mich wohl als absoluter noob geoutet ;o))))

An alle noch einmal vielen Dank für die Hilfe!!! Funzt nun wie es soll!

Grüessli

RS4B5
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.