PIC geheugen

Eduard2

Golden Member

Beste forumleden,

Momenteel programmeer ik een pic 16F1718. Die heeft 2048 bytes aan RAM geheugen. Wanneer ik met de XC8 (free version) een buffer van 128 bytes vraag dan krijg ik deze foutmelding:
main.c:154: error: (1250) could not find space (128 bytes) for variable _fifo

Een 64 byte buffer geeft geen foutmelding.

Heeft iemand een idee waarom ik geen grotere buffer kan aanmaken?
Kan ik deze foutmelding omzeilen? Ideaal ware een buffer van minstens 1024 bytes. Voor de andere variabelen blijft er dan nog meer dan genoeg RAM over.

Vriendelijke groeten,

Eduard

Wat ik weet van bijna 20 jaar geleden dat ik nog wat met pic's programmeerde is dat arrays indexeren liefst met een byte moet gebeuren. Anders wordt het voor de compiler lastig om de data uit de array te halen. (er is een laad-van-adres X+offset instructie, waarbij "X" begin van de array is en offset je index. Maar die offset is dus maar 8 bits).

Het kan zijn dat je een optie op de compiler moet aanzetten om grotere arrays te kunnen maken.

Raar dat 64 wel gaat maar 128 niet meer. Gebruik je soms integers (16 bits?) ipv chars? Het kan zijn dat ze 128 NET niet vinden passen en 127 net wel.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
elmowww

Golden Member

Wat zijn je compileer resultaten van je programma zónder die array? Zit je niet al dicht tegen een grens aan?

MPLABX heeft volgens mij ook ergens een memory usage indicator.

Lukt het als je twee arrays van 64 bytes alloceerd?

In de properties van je project kan je "large code" en "large data model" aanvinken. Ik denk dat je wellicht large data nodig hebt.

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling
Eduard2

Golden Member

Bedankt rew,

Ik zal eens nalezen of er bij de compiler een optie voor grote arrays bestaat. Is het omzeilen van arrays via malloc() en een pointer een oplossing? Als C programmeur heb je meestal geen zorgen met wat er precies op machine niveau gebeurt maar daardoor mis ik ook de soms nodige voeling met de opbouw der chip.

Hetgeen u vertelt over de indexering via een byte kan best een fundamentele beperking worden. Op zich is dat nog geen ramp. Mits handshaking kunnen fifo's in serie worden gezet.

Vriendelijke groeten,

Eduard

Eduard2

Golden Member

Beste elmowww,

U hebt me wellicht op de goede weg gezet. Ik had het geheugengebruik al eerder uitgevlooid. De optie waarbij ik via de project properties en compiler het ondersteunen van grote arrays kon kiezen heb ik niet gevonden.

Toch is het probleem wellicht opgelost. In de XC8 handleiding staat dat auto en static variabelen (uiteraard) anders worden behandeld.

Met het woordje "static" voor de declaratie kan ik probleemloos 1024 als arraylengte opgeven. Achteraf gezien is dat niet onlogisch. Auto variablen gaan op een stack en static zit ergens op een vaste locatie.

Ik denk dat hiermee het probleem is verholpen.
Ieder bedankt voor zijn bijdrage.
Wat mij betreft mag de draad worden gesloten.

Vriendelijke groeten,

Eduard

De stack zelf is op dit soort processoren vaak 256 bytes Of in ieder geval, de stack pointer (*). Dus een auto-variabele die 128 of meer bytes is, dat is een beetje absurd.

Verder... een fifo in een auto-variabele is ook raar, lijkt me. Maar goed, ik ken je programma niet.

(*) Ik heb PICs geprogrammeerd in de tijd van PIC16f84. Die had iets van 64 bytes RAM, totaal. OOIT gaat de tijd aanbreken dat het een rare beperking wordt dat de SP maar 8 bits is. Of ze gaan zeggen: koop dan maar een 32 bitter.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

De 16F1718 heeft een 16 level hardware stack, meer dan genoeg voor zo'n klein controllertje... ;)
(voor meer stackruimte neem je een grotere controller met software stack)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ehh. Ohja. de hardware call-stack.

Maar er is ook nog de automatische-variablen stack. Een stukje RAM.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/