 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
| Poglej prejšnjo temo :: Poglej naslednjo temo |
| Avtor |
Sporočilo |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.01 Kraj: Yogyakarta
|
Objavljeno: Sre Okt 08, 2008 1:14 pm Naslov sporočila: PIC stack/memory array problem (mplab C18) |
|
|
Živjo!
Imam en hiter in velik problem
Uporabljam PIC18F8722 v MPLAB okolju in z C18 prevajalnikom.
Želel sem uporabit spremenljivko, ki hrani IDje
in sicer 3 nivojski array
char spremenljivka[4][4][25];
pa mi zadeva vrne napako
Error - section '.udata_main.o' can not fit the section. Section '.udata_main.o' length=0x00000190
če zmanjšam to na [4][4][16] je vredu
uC ima 4Kb rama id tega ni zasedenega niti 1Kb.
tako da mi ni jasno v čem je problem
če prestavim zadevo v main funkcijo (drugače je globalna spremenljivka)
mi pa javi Error [1300] stack frame too large
any suggestions? _________________ Bad things happen to good people all the time for no reason!
Blog |
|
| Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 16.33 Kraj: Črnuče
|
Objavljeno: Sre Okt 08, 2008 1:31 pm Naslov sporočila: |
|
|
Naletel na enak problem z Basic-om.
Picek res ima 4KB Flasha za program, le pa ta razdeljen med banke. In programski segment je lahko dolg toliko, da paše v posamezno banko. Vsaj nekako tako sem jaz to zastopil. Upam da se bo še kdo oglasil in povedal kako se temu izogniti..... _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
| Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.46 Kraj: Zagorje ob Savi
|
|
| Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 3.99 Kraj: Ljubljana
|
Objavljeno: Sre Okt 08, 2008 6:41 pm Naslov sporočila: |
|
|
Naredi aray sam in sicer iz štirih array-ev po [4,25]!
LP GJ |
|
| Nazaj na vrh |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.01 Kraj: Yogyakarta
|
Objavljeno: Sre Okt 08, 2008 7:02 pm Naslov sporočila: |
|
|
| Highlag je napisal/a: |
Naletel na enak problem z Basic-om.
Picek res ima 4KB Flasha za program, le pa ta razdeljen med banke. In programski segment je lahko dolg toliko, da paše v posamezno banko. Vsaj nekako tako sem jaz to zastopil. Upam da se bo še kdo oglasil in povedal kako se temu izogniti..... |
pic ima 4K RAM-a in 128k FLASH-a drugače  _________________ Bad things happen to good people all the time for no reason!
Blog |
|
| Nazaj na vrh |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.01 Kraj: Yogyakarta
|
Objavljeno: Sre Okt 08, 2008 7:15 pm Naslov sporočila: |
|
|
e, to je pir  _________________ Bad things happen to good people all the time for no reason!
Blog |
|
| Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.15
|
Objavljeno: Pon Nov 10, 2008 6:13 pm Naslov sporočila: |
|
|
No ja, sicer sem malo pozen za odgovor.... Bom pa dodal še par trikov kar se linker file-a tiče.
Jaz imam navado poleg spreminjanja velikosti gpr tudi preimenovati - na primer:
| Koda: |
SECTION NAME=Eeprom_Menu RAM=gpr4
SECTION NAME=Serial_1 RAM=gpr5
SECTION NAME=Ex_eeprom RAM=gpr6 |
tako si lahko zložim spremeljivke po bankah glede na modul v katerem so klicane. Izvajanje programa je zato hitrejše (manj bankselektanja)
V programu pred deklaracijo spremenljivk kličem
| Koda: |
Eeprom_Menu UDATA
<<<deklaracija spremeljivk vezanih na EEprom....>>>> |
Inicializacijo ne prepuščam C18 ampak jo spišem sam. Zato skomentiram v linkerju vrstico:
V svojem programu pa dodam
| Koda: |
STARThere CODE 0x0000
<<<koda za inicializacijo>>>> |
Paziti je potrebno da ustrezno inicializiraš fpflags zaradi pravilnega delovanja nekaterih starih čipov. V inicializacjo zato vključim:
| Koda: |
extern near char FPFLAGS;
_asm
// Initialize the stack pointer
lfsr 1, _stack
lfsr 2, _stack
clrf TBLPTRU, 0 // 1st silicon doesn't do on POR
bcf FPFLAGS,RND,0 // Initalize rounding flag for floating point libs
_endasm |
V linkerju je mogoče definirati s čim naj bo zapolnjen preostali prostor po CODEPAGE-ih. To narediš tako, da dodaš na konec vrstice direktivo FILL:
| Koda: |
| CODEPAGE NAME=page START=0x2A END=0x7FFF FILL 0xFFFF |
kjer FFFF pomeni korak naprej. Lahko pa dodate svojo komando. Jaz dam v končno verzijo komado za reset. Koda za reset se razlikuje od uCja do uCja. Kodo komande dobite tako, da nekje v program vpišete to komando in po kompilanju pogledate Disassembly listing na isti lokaciji v katero ste vpisali komando. Stvar je uporabna v zares izrednih primerih pri debugiranju. Zapomniš flash s komando za prižig ene ledice na portu in na ta način zveš, če ti koda odpleše. Tega noben debugger ne javi!
Upam da bo komu kdaj koristilo... _________________ LP, Matjaž |
|
| Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 232 dni
Powered by phpBB © 2001, 2005 phpBB Group
|