Hallo Leute, Ich benutze den MSP430f2132 mit 512 Byte Ram. Nun habe ich folgende Variablen global deklariert : unsigned int i_test1[66]; unsigned int i_test2[66]; unsigned int i_test3[66]; unsigned int i_test4[66]; Da integer 2 Byte Datenbreite hat müssten das insgesamt 2*4*66=528 Byte Speicher sein. Ich benutze IAR embedded workbench und wenn ich das auf den Controller lade meldet er keinen Fehler. Habe ich das falsch verstanden und die globalen Variablen werde nicht im RAM reserviert oder kann es sein, dass manche Werte dann einfach überschrieben werden und ich bekomme davon nur nichts mit? Danke im Vorraus
Gibt's kein Listing? Vielleicht hat der IAR keine RAM Usage Überprüfung und meldet deswegen kein Fehler. Der ICCAVR zeigt immer eine Zusammenfassung an (siehe Anhang).
anfänger schrieb: > Da integer 2 Byte Datenbreite hat müssten das insgesamt 2*4*66=528 Byte > Speicher sein. > Ich benutze IAR embedded workbench und wenn ich das auf den Controller > lade meldet er keinen Fehler. - Schaue Dir mal das MAP-File an. - Was passiert, wenn Du auf die Variablen zugreifst?
Max G. schrieb: > anfänger schrieb: > >> Da integer 2 Byte Datenbreite hat müssten das insgesamt 2*4*66=528 Byte >> Speicher sein. >> Ich benutze IAR embedded workbench und wenn ich das auf den Controller >> lade meldet er keinen Fehler. > > - Schaue Dir mal das MAP-File an. > - Was passiert, wenn Du auf die Variablen zugreifst? Joo, meinte natürlich MAP-File (statt Listing)...
Hallo, verwendest du auch die Variablen im Programm? Der IAR ist kreativ im optimieren :-) Aus eigener Erfahrung kann ich dir nur sagen, dass IAR meldet wenn der Speicher voll ist. Dass das bei dir nicht kommt kann liegen an: - Optimierung (Nicht verwendete Variablen fliegen raus) - Falsch eingestelltes projekt (falscher Typ eingestellt) Häng einfach mal das map file an. Grüße Peter
Du hattest recht :D. Hatte sie noch net im Programm eingebunden sondern nur deklariert. Sobald ich sie benutze wird gemotzt... Also hab ich das richtig verstanden und alle deklarierten Variablen werden im RAM abgelegt, nur die Globalen sind halt fest belegt?
Alle Variablen landen im RAM. Allerdings ist es ein Unterschied, ob die Variable Global oder Lokal definiert ist. Globale Variablen werden auf eine feste Adresse gemappt (deswegen kann man im Map-File schauen, wo die Variablen liegen). Die lokalen Variablen werden zur Laufzeit "erzeugt" (wenn z.B. eine Funktion aufgerufen wird), und werden auf dem Stack bereitgestellt und bei verlassen der entsprechenden Funktion wieder "vernichtet". Deswegen sollten die globalen Vriablen nicht den ganzen RAM auffressen,sondern es sollte noch genügend frei sein, damit der Stack nicht "überläuft". Meistens lässt sich einstellen, wie groß der Stack sein soll, damit der Compiler entsprechend die RAM-Benutzung überprüfen kann.
Daniel V. schrieb: > Alle Variablen landen im RAM. Bist du dir da sicher? Gerade lokale Variablen können auch ausschließlich in Registern gehlaten werden. Das entscheidet der Compiler.
Regbank schrieb: > Daniel V. schrieb: >> Alle Variablen landen im RAM. > > Bist du dir da sicher? Gerade lokale Variablen können auch > ausschließlich in Registern gehlaten werden. Das entscheidet der > Compiler. Das ist natürlich korrekt! Da hab ich doch glatt nicht (mehr) dran gedacht. Wenn man Assembler programmiert (das war bei mir vor ca. 12 Jahren.....), dann kann man ja gerade über die Register viel optimieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.