MPLAB felmeddelande 1300, stack frame too large

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

MPLAB felmeddelande 1300, stack frame too large

Inlägg av victor_passe »

Hej, jag använder mplab för första gången med pic18. Har använt mikroC tidigare.

Jag försöker få fatfs att funka men stöter på problem.

Processorn är pic18f4680.
Som jag förstår felmeddelandet så är min variabel för stor för minnet på något vis. Jag skulle köpa detta om det var en pic16fxxx jag skrev till men nu är det en pic18.

Jag får felet på denna raden:
FATFS fatfs; /* File system object */

Och definitionen av FATFS:

Kod: Markera allt

typedef struct {
	BYTE	fs_type;		/* FAT sub-type (0:Not mounted) */
	BYTE	drv;			/* Physical drive number */
	BYTE	csize;			/* Sectors per cluster (1,2,4...128) */
	BYTE	n_fats;			/* Number of FAT copies (1,2) */
	BYTE	wflag;			/* win[] dirty flag (1:must be written back) */
	BYTE	fsi_flag;		/* fsinfo dirty flag (1:must be written back) */
	WORD	id;				/* File system mount ID */
	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */
#if _MAX_SS != 512
	WORD	ssize;			/* Bytes per sector (512,1024,2048,4096) */
#endif
#if _FS_REENTRANT
	_SYNC_t	sobj;			/* Identifier of sync object */
#endif
#if !_FS_READONLY
	DWORD	last_clust;		/* Last allocated cluster */
	DWORD	free_clust;		/* Number of free clusters */
	DWORD	fsi_sector;		/* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
	DWORD	cdir;			/* Current directory start cluster (0:root) */
#endif
	DWORD	n_fatent;		/* Number of FAT entries (= number of clusters + 2) */
	DWORD	fsize;			/* Sectors per FAT */
	DWORD	fatbase;		/* FAT start sector */
	DWORD	dirbase;		/* Root directory start sector (FAT32:Cluster#) */
	DWORD	database;		/* Data start sector */
	DWORD	winsect;		/* Current sector appearing in the win[] */
	BYTE	win[_MAX_SS];	/* Disk access window for Directory, FAT (and Data on tiny cfg) */
} FATFS;
_max_SS är 512.
Det ska ju finnas runt 3KB RAM på pic18f4680...
Jag tror att MPLAB inte fattar att den är en pic18 på något vis.

Någon som kan hjälpa mig?
Jag får även samma fel på flera andra rader där variabeln är mycket mindre.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av sodjan »

> Har använt mikroC tidigare.

Och vad använder du nu ?

> MPLAB felmeddelande 1300

Är du säker på att det är ett fel från MPLAB ?
Inte från någon kompilator eller liknande ?

> _max_SS är 512.
> Det ska ju finnas runt 3KB RAM på pic18f4680...

Du har fortfarande 256 bytes banker. Om du inte har anpassat
länknings skriptet och slagit ihop flera banker till en stor area.

> Som jag förstår felmeddelandet...

Möjligt. Svårt att säga, *vi* vet ju inte hur felmeddelandet ser ut.
Så där får du klara dig själv (eller kopiera hela meddelandet, om du vill ha hjälp).
Är det av någon speciell anledning som du inte har kopierat "output fönstret ?
Vad säger dokumentationen för <vad-du-nu-kör> för det aktuella meddelandet ?
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av victor_passe »

Att jag använder C18 är väll kanske en bra gissning, finns det ens något annat till pic18?

Kod: Markera allt

----------------------------------------------------------------------
Debug build of project `C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\test.mcp' started.
Language tool versions: mpasmwin.exe v5.40, mplink.exe v4.38, mcc18.exe v3.37.01, mplib.exe v4.38
Preprocessor symbol `__DEBUG' is defined.
Sun Jan 16 18:43:16 2011
----------------------------------------------------------------------
Make: The target "C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\ff.o" is up to date.
Make: The target "C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.o" is out of date.
Executing: "C:\Program Files\Microchip\mplabc18\v3.37.01\bin\mcc18.exe" -p=18F4680 "main.c" -fo="main.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:29:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:30:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:31:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:32:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:33:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:33:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:33:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:34:Error [1300] stack frame too large
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:58:Warning [2066] type qualifier mismatch in assignment
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:73:Warning [2066] type qualifier mismatch in assignment
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:77:Warning [2054] suspicious pointer conversion
C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\main.c:86:Warning [2066] type qualifier mismatch in assignment
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\test.mcp' failed.
Language tool versions: mpasmwin.exe v5.40, mplink.exe v4.38, mcc18.exe v3.37.01, mplib.exe v4.38
Preprocessor symbol `__DEBUG' is defined.
Sun Jan 16 18:43:21 2011
----------------------------------------------------------------------
BUILD FAILED
Och hur anpassar jag länknings skriptet och slår ihop flera banker till en stor area?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av TomasL »

Googla och rtfm, är väl det enklaste svaret, titta hur linkerscripten ser ut så börjar du nog förstå
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av victor_passe »

Har redan googlat en bra stund.
Och jag kan inget om linkerscript eller sådant.

Har även testat hi-tech c-kompilator men jag får liknande fel där "Cant fit 1301Bytes in RAM" eller något liknande stog det.
Hur svårt ska det vara att definiera en vektor?? I mikroc skriver man "char vector[1000];".
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av TomasL »

"Problemet" är att per default är minnet i en PIC18 uppdelat i 256Byte-sidor.
Detta innebär att inga variabler kan vara större än 256 byte, vilket skapar problem, med bl.a. Arrays och strukturer.

Genom att redigera Linker-scripten så kan man ändra detta, det finns "utförligt" beskrivit i bl.a. manualen till MPLINC
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av sodjan »

> Att jag använder C18 är väll kanske en bra gissning, finns det ens något annat till pic18?

Två småsaker först bara...
Det finns ingen anledning i helvete att vi ska behöva *GISSA* ! En notis
om att du hade missat att ange kompilatorn hade varit mer på sin plats.
Och ja, det finns en uppsjö av olika C-kompilatorer till PIC18 (inte "pic18").

Right, C18 alltså.
Och du har alltså kollat vad "stack frame too large" betyder samt vad
som sägs om "stack frame" för övrigt i dokumentationen ? Bra.
Då vet du att du har för mycket definierat som "auto" (alltså stack-lagrade
funktionsparameterar, vilket är default). Jag vet inte om det skulle fungera
att bara definiera en del sakar som "static"...

Hur är det med koden som sådan ? Var kommer den ifrån ? Är den
från början avsedd för PIC18 ? Har du någon referens/länk till koden ?
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av victor_passe »

All kod kommer från http://elm-chan.org/fsw/ff/ffsample.zip under mappen "generic".
Det är fatfs koden som ska funka i vilken ansi c kompilator som helst.
Man skriver bara egna makron för att sätta pinnar höga/låga och sedan ska allt funka.

Jag testade också att byta till picc18 och har nu lyckats få den att nästan kompilera.
Jag får felet

Kod: Markera allt

Build C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\tst2\main for device 18F4680
Using driver C:\Program Files\HI-TECH Software\PICC-18\STD\9.52\bin\picc18.exe

Make: The target "C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\tst2\ff.obj" is up to date.
Make: The target "C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\tst2\main.obj" is up to date.
Make: The target "C:\Documents and Settings\admin\My Documents\My Dropbox\c-kod\printer\v2.0\sd\mplab\tst2\mmcbb.obj" is up to date.
Executing: "C:\Program Files\HI-TECH Software\PICC-18\STD\9.52\bin\picc18.exe" -omain.cof -mmain.map --summary=default,-psect,-class,+mem,-hex --output=default ff.obj main.obj mmcbb.obj --chip=18F4680 -P --runtime=default,+clear,+init,-keep,-download,-ramtest,-config,+clib,-checksum --opt=default,+asm,9 --warn=0 -D__DEBUG=1 -Blarge --double=24 --cp=24 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
HI-TECH PICC-18 STD COMPILER (Microchip PIC micro)  V9.52
Copyright (C) 1984-2010 HI-TECH SOFTWARE
licensed for evaluation purposes only
this licence will expire on Fri, 04 Mar 2011
Advisory[1233] Employing 18F4680 errata work-arounds:
Advisory[1234]  * Corrupted fast interrupt shadow registers
Error   [491] C:\Program Files\HI-TECH Software\PICC-18\STD\9.52\lib\pic83l-c.lib(store.obj); 0. can't find 0x3A1 words for psect "param" in segment "RAM"

********** Build failed! **********
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av TomasL »

Det är ju busenkelt, det står ju i klartext på sista raden.
"Kan Inte Hitta 929 bytes i RAM-Segmentet"

Bara för att koden är ansi-kompatibel, är det ju inte säkert att den är avsedd för en PIC eller liknande.
Du får fortfarande titta på dina linkerscript, eller också är det helt enkelt så att koden inte går att kompilera till en PIC-Processor pga för stort behov av RAM.

Och varför i JÖSSE namn använder du inte PIC-Koden istället.
Inte konstigt att du får problem.
RTFM, Gör om, Gör Rätt!
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9095
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av AndersG »

Vilket är samma typ av fel som tidigare. Låt mig ge dig ett exempel:

Kod: Markera allt

volatile unsigned char flags;
int dspmode = 0;
//
unsigned char SWKEYS = 0;           // live switch press bits
unsigned char SLATCH = 0;           // debounced switch latch
unsigned char VCBIT0 = 0;           // vertical counter bit 0
unsigned char VCBIT1 = 0;           // vertical counter bit 1
unsigned char VCMASK = 0;           // 'cumulative AND' mask
unsigned char KEYS = 0;          	// switch flags for MAIN
unsigned char COLPOS = 1;           // ring counter prescaler
unsigned char VCTEMP = 0;           //


#pragma udata battery_data			// Put in separate bank.
struct
{
	int capacity;					// Battery capacity in Ah
	unsigned char efficiency;		// Charge efficiency in 1/256
	unsigned char selfdischarge;	// in %/month
	int offset;						// Measured offset
	int rsense;						// Rsense in uOhms
	int imax;						// Maximum current (charge) seen
	int imin;						// Minimum current (discharge) seen
	long total_charge;				// Total charge in native units (same as charge)
	int temp_ave;					// Average temperature for the day
	int	delta_charge;				// Used to adjust for efficiency
	int charge;						// Values below here pulled from STC3100
	int counter;
	int current;
	int voltage;   
	int temp;
} battery[BATTERIES];
Här styr jag manuellt i vilken bank jag lägger vad, just pga bankningen. Detta har inte så mycket med C och dialekter av C att göra som med processorarkitekturen.

Se:
http://ww1.microchip.com/downloads/en/D ... 51288j.pdf
Stycket om "Creating Large Data Objects"
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av TomasL »

Dessutom, om du läser FatFS Appnotes så ser du att den är för PIC24
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av victor_passe »

"Och varför i JÖSSE namn använder du inte PIC-Koden istället."
"Dessutom, om du läser FatFS Appnotes så ser du att den är för PIC24"
Du svarade just på din egna fråga. Jag använder ju pic18 i detta projektet.
Så de finns alltså inte nog med RAM på processorn för koden?

Och det finns befintliga bibliotek från microchip men jag har inte dragit spi bussen till kortet utan måste bitbanga.
Jag har iof mosi/miso och sck till sd kortet men ingen /SS.


AndersG:
Tack, ska kolla på pdfen.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av TomasL »

Victor, du missar poängen helt.
Om du hade läst på innan, så hade du upptäckt att det inte hade funkat.
Det är klart beskrivit hur mycket minne de olika versionerna behöver.
Generic avser i princip typ 8051/8032 eller liknande med externa minnen.
Det finns andra FAT-applikationer som problemfritt går att köra på PIC18.
uChipFAT behöver bara lite enkla moddar för att kunna snurra med nästan vad som helst.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av victor_passe »

Okej, då skippar jag fatfs.
Vad menar du med "uChipFAT"? Menar du microchips fat bibliotek?
Var hittar jag källkoden till den?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: MPLAB felmeddelande 1300, stack frame too large

Inlägg av TomasL »

Ja, hos uChip
Skriv svar