Programmen blir väl mer lättlästa om varje variabel får ett eget logiskt namn i varje rutin, även om de använder samma minnesceller.
Knudsens C-kompilator håller reda på vilka rutiner som anropas av vilka och kan därför själv avgöra vilka celler som kan återanvändas för lokala variabler i varje rutin.
Automatisk export av använda minnesceller till exel?
Re: Automatisk export av använda minnesceller till exel?
C använder väl nästan alltid stacken eller register för lokala variabler? Eftersom det måste fungera även vid rekursion.
Re: Automatisk export av använda minnesceller till exel?
Jupp, detta kräver alltså att man antingen ser till att stacken är stor nog eller ser till att deklarera globala arbetsvariabler eller en kombination därav.
Re: Automatisk export av använda minnesceller till exel?
Fast PIC16 har ingen variabelstack och har bara ett arbetsregister. Hårdvarustacken för funktionsadresser rymmer bara 8 adresser. Det går inte att göra rekursiva funktioner.
Re: Automatisk export av använda minnesceller till exel?
Nu har jag provat och läst hyffsat mycket och har koll på var saker hamnar beroende på:
UDATA
UDATA_ACS
UDATA_OVR
UDATA_SHR
IDATA
Men finns det någon möjlighet att deklarera en variabel i stil med:
Work1 RES 1
Work2 RES 1
och få dem i accessdelen av första banken (0x00 till 0x7F) genom att bara deklarera dem en gång någonstans i någon .asm-fil så man kan använda tex Work1 överallt i hela projektet?
En global variabel helt enkelt är vad jag vill skapa.
Märkte också att jag inte får någon varning om att en variabel deklarerats med identiskt namn på mer än ett ställe och får samma cell knuten till sig.
UDATA
UDATA_ACS
UDATA_OVR
UDATA_SHR
IDATA
Men finns det någon möjlighet att deklarera en variabel i stil med:
Work1 RES 1
Work2 RES 1
och få dem i accessdelen av första banken (0x00 till 0x7F) genom att bara deklarera dem en gång någonstans i någon .asm-fil så man kan använda tex Work1 överallt i hela projektet?
En global variabel helt enkelt är vad jag vill skapa.
Märkte också att jag inte får någon varning om att en variabel deklarerats med identiskt namn på mer än ett ställe och får samma cell knuten till sig.
Re: Automatisk export av använda minnesceller till exel?
Inte helt oväntat använder man direktivet "global" för att exportera och "extern" för att dra nytta av de labels som man exporterat.
Re: Automatisk export av använda minnesceller till exel?
Först, notera att UDATA_SHR inte är rellevant på PIC18 arkitekturen, den används
för att allokera variabler i "shared memory" (eller "unbanked memory) på PIC16.
UDATA_ACS gör motsvarande på PIC18 (d.v.s allokerar ur "access bank").
Du vill alltså ha tillgång till Work1 och Work2 oavsett vilken modul du "är i" ?
Är de "riktiga" globala variabler (i så fall är det kanske inte så bra namn) eller
bara lokala variabler som råkar ha samma namn (och dela lagring) ? Alltså
en sorts kombination av UDATA_ACS och UDATA_OVR ?
Är de riktiga globala variabler så borde det vara GLOBAL (där den allokeras)
och EXTERN (i alla andra ASM filer som vill används dom) som ska användas.
För att underlätta underhållet så kan en liten INC fil som innehåller alla EXTERN
direktiv användas, då blir det bara ett ställa ett ändra om du också vill ha
Work3 eller liknande. Gör bara #include på den i alla övriga filer.
Är det "bara" lokala variabler som ska dela minne så borde UDATA_OVR fungera.
Även detta kan läggas i en INC fil så att alla dina moduler automatiskt får tillgång
till samma Work* variabler. Se bara upp med interrupt, CALL till andra filer o.s.v,
det är lätt att villa bort sig och börja "skriva sönder" värden för en annan rutin...
> Märkte också att jag inte får någon varning om att en variabel deklarerats med identiskt
> namn på mer än ett ställe och får samma cell knuten till sig.
Är det två ställen i samma ASM fil eller i två olika ASM filer ?
Har du ett exempel ?
för att allokera variabler i "shared memory" (eller "unbanked memory) på PIC16.
UDATA_ACS gör motsvarande på PIC18 (d.v.s allokerar ur "access bank").
Du vill alltså ha tillgång till Work1 och Work2 oavsett vilken modul du "är i" ?
Är de "riktiga" globala variabler (i så fall är det kanske inte så bra namn) eller
bara lokala variabler som råkar ha samma namn (och dela lagring) ? Alltså
en sorts kombination av UDATA_ACS och UDATA_OVR ?
Är de riktiga globala variabler så borde det vara GLOBAL (där den allokeras)
och EXTERN (i alla andra ASM filer som vill används dom) som ska användas.
För att underlätta underhållet så kan en liten INC fil som innehåller alla EXTERN
direktiv användas, då blir det bara ett ställa ett ändra om du också vill ha
Work3 eller liknande. Gör bara #include på den i alla övriga filer.
Är det "bara" lokala variabler som ska dela minne så borde UDATA_OVR fungera.
Även detta kan läggas i en INC fil så att alla dina moduler automatiskt får tillgång
till samma Work* variabler. Se bara upp med interrupt, CALL till andra filer o.s.v,
det är lätt att villa bort sig och börja "skriva sönder" värden för en annan rutin...
> Märkte också att jag inte får någon varning om att en variabel deklarerats med identiskt
> namn på mer än ett ställe och får samma cell knuten till sig.
Är det två ställen i samma ASM fil eller i två olika ASM filer ?
Har du ett exempel ?