Stránka 1 z 2
Program pro PIC16F84A
Napsal: 20 bře 2010, 18:33
od forbidden
Dělám teď na jednom programu a mám zajímavej problém, nejspíš začátečnickej.
Jakmile mi délka programu přesáhne nějakou hranici, odhadem 450 B. Začne mi program havarovat na Stack ower flow. Na začátku programu volám nějaký procedury co mám někde u konce. Začalo to tak, že jsem přidal doprostřed programu nějakou tabulku, která se zatím vůbec nepoužívá, takže i kdyby v ní byla chyba, neprojeví se. Prostě, jako kdybych si ty procedury odsunul někam, kam na ně nedosáhnu, nebo co. Přitom paměť programu je až 1024 B, takže mám ještě bohatě místa.
Nějak to nechápu, v programování jsem "věčnej začátečník" akorát teď jsem se pustil do takovýho většího díla.
Díky za pomoc.
Napsal: 20 bře 2010, 18:52
od Andrea
Ten krám má 8-úrovňový hardwarový stack, možná máš příliš mnoho volání procedur vnořených do sebe. A paměť programu není u PICů v bytech, ale ve slovech, v tomhle případě 14 bitů širokých.
Napsal: 20 bře 2010, 19:17
od forbidden
Volání procedur z jiných procedur si celkem hlídám, to mám tak maximálně do tří, nebo čtyř úrovní. Mě hlavně zaráží to, že ta část, kterou jsem tam vložil se zatím vůbec nepoužívá, takže to vnoření ani nemá jak ovlivnit. Bez ní to funguje dobře.
Jen pro upřesnění, píšu to v assembleru a v prostředí MPLAB 8.43.
Napsal: 20 bře 2010, 19:36
od Andrea
forbidden píše:Volání procedur z jiných procedur si celkem hlídám, to mám tak maximálně do tří, nebo čtyř úrovní. Mě hlavně zaráží to, že ta část, kterou jsem tam vložil se zatím vůbec nepoužívá, takže to vnoření ani nemá jak ovlivnit. Bez ní to funguje dobře.
Jen pro upřesnění, píšu to v assembleru a v prostředí MPLAB 8.43.
A jak ti to může havarovat na stack overflow, když to píšeš v assembleru? To ti padá překladač nebo simulátor?
Napsal: 20 bře 2010, 19:42
od forbidden
Padá simulátor a i když ten program nacpu do aplikace, tak vidím, že se zacyklí.
Napsal: 20 bře 2010, 19:44
od Andrea
A to v tom simulátoru nevidíš co to dělá, kdy a proč to cpe něco do zásobníku?
Napsal: 20 bře 2010, 19:49
od forbidden
Až tak dobře zatím v MPLABu dělat neumím, Hardware Stack jsem si zobrazil, ale když spustím simulaci, tak to po záseku ukazuje Stack Level 0 Empty a ostatní levely s nějakýma adresama, aly ty tam jsou i po resetu stejný, takže nevím jak to myslí.
Bez toho vloženýho kusu kódu, se to po spuštění simulace zastaví na testu stisknutí tlačítka, což je v pořádku. Když tam dám ten kus nesouvisejícího kódu, tak to zhavaruje v čekací smyčce.
Tak už to vůbec nechápu, hraju si s krokováním, animacema běhu a zjistil jsem, že mi program z neznámýho důvodu skáče na začátek paměti programu ORG 0. Proto se to pak zacyklí, ale ve stacku návratovou adresu 0 nevidím
Zrušil jsem všechny čekací smyčky, abych nemusel vyskakovat při krokování z cyklů ale stejně jsem na nic nepřišel.
Kdyby byl někdo ochotnej a uměl v MPLABU odkrokovat ten program a zjistit, proč to skáče kam nemá, byl bych moc vděčnej.
Tak poslední vývoj je takovej, že jsem odmazával části nepotřebnýho kódu a při 406 slovech programu to funguje, ale při 407 slovech už ne. A je jedno co je to za instrukce, klidně NOP. Takže mu asi vadí skoky přes moc dlouhý kusy kódu

Napsal: 20 bře 2010, 21:08
od petus
PICům vůbec nerozumím ,takže to co napíšu může být blbost.Ale u atmelu (89C2051-assembler{Nebo to byla ATmega8???}) byli rozdělený skoky na dlouhé a krátké a pokud skok přesáhl určitou hranici, krátký skok "nefungoval" a musel se použít dlouhý.
Pokud je to blbost tak mě omluvte...

Napsal: 20 bře 2010, 21:24
od Crifodo
Andrea píše:Ten krám má 8-úrovňový hardwarový stack, možná máš příliš mnoho volání procedur vnořených do sebe. A paměť programu není u PICů v bytech, ale ve slovech, v tomhle případě 14 bitů širokých.
kdybyste se drželi slušných tradičních procesorů...

Napsal: 20 bře 2010, 21:33
od forbidden
petus píše:...musel se použít dlouhý.
Tím to asi nebude, takovou instrukci neznám. Zatím jsem trochu pokročil. Vypadá to, že za to může příkaz RETLW. Ten by měl skočit zpět na místo odkud byl volán, ale skočí úplně jinam, nechápu...
Napsal: 20 bře 2010, 21:34
od Andrea
Crifodo píše:kdybyste se drželi slušných tradičních procesorů...

Já to říkám pořád, PIC není normální procesor

Napsal: 20 bře 2010, 21:36
od Andrea
forbidden píše:petus píše:...musel se použít dlouhý.
Tím to asi nebude, takovou instrukci neznám. Zatím jsem trochu pokročil. Vypadá to, že za to může příkaz RETLW. Ten by měl skočit zpět na místo odkud byl volán, ale skočí úplně jinam, nechápu...
A nepodtejká ti ten zásobník? Skutečně máš ten RETLW na konci kódu který voláš CALLem?
Napsal: 20 bře 2010, 21:48
od forbidden
Nic nepodtíká, teď si to krokuju. Nefunguje mi třeba toto:
MOVLW D'0' (opravena chybička)
CALL TABULKA
-
-
-
TABULKA ADDWF PCL,F
RETLW B'01010101'
No a po vykonání instrukce RETLW se to nevrátí pod CALL TABULKA, ale někam doprostřed programu.
Ale jen, pokud je mezi CALL TABULKA a TABULKou hodně kódu.
Napsal: 20 bře 2010, 21:57
od Andrea
ADDWF PCL,F modifikuje program counter ne? Tak to skočí někam podle hodnoty ve W a to záleží kolik máš ve W. A pokud při tom sčítání dojde k přetečení, tak to se ignoruje, nepřene se se do PCH.
Napsal: 20 bře 2010, 22:01
od forbidden
Chybička se vloudila, místo ADDLW, má být MOVLW.
Funguje to tak, že do W dám pozici dat v tabulce, kterou chci zase ve W při návratu z tabulky najít. Chyba může nastat, když ve W je větší hodnota jak tabulka, to pak zhroutí program, ale to mám ohlídaný