Re: räknas lokala variabler med i minnesåtgången?
Postat: 3 december 2011, 23:29:29
Man skulle kunna kombinera unions med något variant av lås för att göra det lite svårare att klanta till det
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Jag tycker inte bara optimeringen av minnesanvändning är imponerande, även optimeringen av kod är imponerande.jesse skrev:Försöker analysera minnesåtgången, och jag får säga att jag är imponerad av GCC's optimering!
Main behandlas som en vanlig funktion, och därför reserveras plats på stacken för lokala variabler i main och även retur adressen.jesse skrev:EDIT: när jag kör lite större funktioner (som i sin tur anropar en massa andra och så kör interrupten dessutom under tiden) så har jag kommit upp i 32 byte som mest. Men jag irriterar mig lite på att stackpekaren ligger på 10EB när main() startar --- vad är det för skit den lagrar i stacken innan? Det kommer väl aldrig att användas då jag aldrig gör retur från main(). SKulle man kunna justera stacken i början och sätta den till 1100 där den borde börja? (Ja AVR är konstig; SRAM börjar på 0x100 och slutar på 0x1100 om jag har 4096 bytes)
Kod: Markera allt
int main(void) __attribute__((OS_task)) {
...
};
EDIT: Det här gick bättre:Error 3 expected ',' or ';' before '{' token
Kod: Markera allt
__attribute__((OS_task))
int main(void){
...
};
Kanske "naked" är ännu bättre. Varför ha en "ret" i slutet av main när en ändå aldrig ska komma dit?+@item OS_main/OS_task
+@cindex @code{OS_main} AVR function attribute
+@cindex @code{OS_task} AVR function attribute
+On AVR, functions with the @code{OS_main} or @code{OS_task} attribute
+do not save/restore any call-saved register in their prologue/epilogue.
+
+The @code{OS_main} attribute can be used when there @emph{is
+guarantee} that interrupts are disabled at the time when the function
+is entered. This will save resources when the stack pointer has to be
+changed to set up a frame for local variables.
+
+The @code{OS_task} attribute can be used when there is @emph{no
+guarantee} that interrupts are disabled at that time when the function
+is entered like for, e@.g@. task functions in a multi-threading operating
+system. In that case, changing the stack pointer register will be
+guarded by save/clear/restore of the global interrupt enable flag.
+
+The differences to the @code{naked} function attrubute are:
+@itemize @bullet
+@item @code{naked} functions do not have a return instruction whereas
+@code{OS_main} and @code{OS_task} functions will have a @code{RET} or
+@code{RETI} return instruction.
+@item @code{naked} functions do not set up a frame for local variables
+or a frame pointer whereas @code{OS_main} and @code{OS_task} do this
+as needed.
+@end itemize
+
Kod: Markera allt
00003AF8 CLI Global Interrupt Disable
00003AF9 RJMP PC-0x0000 Relative jump
Kod: Markera allt
cli();
goto 0x0000;