Hey, ich möchte, dass mein Atmega324p-Controller 200 16bit Sensorwerte abfragt, auf dem Controller zwischenspeichert und später an meinen Messrechner überträgt. Nun überlege ich, ob mein Speicher im Atmega dafür noch reicht. Laut AVR Studio sind es ohne die Zwischenspeicherung Program: 2194 bytes (6.7% Full) Data: 15 bytes (0.7% Full) Nun kommen 200*16/8= 400Byte bei DATA dazu, laut Datenblatt habe ich 2k internal SRAM. Also kann ich es so machen... Ist die Überlegung richtig? Vielen Dank
John schrieb: > Ist die Überlegung richtig? Ohne dein Programm zu kennen, kann man da keine wirklich Antwort geben...aber der Mega hat doch 1kB EEPROM...
John schrieb: > Ist die Überlegung richtig? Speicher für den Stack brauchst Du auch noch. Den hast Du noch nicht berücksichtigt. Es könnte aber reichen. Gruß Andreas
Hi Na, ich glaube nicht, das der Stack in die Region der Werte rutscht... immerhin sind da noch 2048- 415 = 1633 Bytes frei. Aber, wenn du doch schon die Datas kennst, warum definierst du nicht einfach ein entsprechend großes Array und schaust dir dann die Auslastung an ? Inn ASM Mess_Daten: .Byte 400 Dürftest dann so ca. 20 % Speicherbelegung bekommen.... Und das ohne dein Programm zu kennen, denn bekann ist ja bereits, das 15 Byte Data belegt sind. Gruß oldmax
oldmax schrieb: > Aber, wenn du doch > schon die Datas kennst, warum definierst du nicht einfach ein > entsprechend großes Array und schaust dir dann die Auslastung an ? Das wollte ich, ich habe ein entsprechendes Array erzeugt und die Variablen in einer Schleife mit der gleichen Zahl beschrieben. Allerdings ändert sich an meiner Programmspeicherauslastung nach dem Compilieren nichts. Ich denke, dass der Compiler das Array wegoptimiert.
John schrieb: > Ich denke, dass der Compiler das Array wegoptimiert. Quatsch. Zeig mal den Code. Wenn du ein Array definierst dann musst du das sofort an der Größe des Data-Segments sehen.
John schrieb: > Ich denke, dass der Compiler das Array wegoptimiert. Wahrscheinlicher ist, dass du es als lokale Variable angelegt hast.
Stefan Ernst schrieb: > Wahrscheinlicher ist, dass du es als lokale Variable angelegt hast. Habe ich auch, ich will das Ding ja später auch mit meinen Messwerten füttern Der Code in der main-Schleife
1 | volatile int16_t VarADtemp[200]; |
2 | |
3 | while(1) |
4 | {
|
5 | |
6 | for(int k=0;k<200;k++) |
7 | {
|
8 | |
9 | VarADtemp[k]=k; |
10 | }
|
Mach das Ding GLOBAL. Was spricht für dich dagegen? Sowas großes lokal anzulegen macht wenig Sinn. Das wird ja dann dynamisch auf den Stack gepumpt. Du kennst aber ja die Größe also lass es statisch anlegen dann weißt du auch wieviel Speicher du so brauchst.
cyblord ---- schrieb: > Mach das Ding GLOBAL. Das wäre einen Versuch wert. Volatile soll der Compiler normalerweise auch nicht weg optimieren, zumindest wenn so eine Variable auch noch in einem Interrupt bzw. anderer Stelle gebraucht wird. Dann müßte sie aber auch an einer anderen Stelle definiert werden, wie Global. Vielleicht ist er aber schlau, und bemerkt, das Volatile hier keinen tieferen Sinn macht. Da hilft es manchmal nur, die Assembler-Listings mal anzuschauen, was da wirklich gemacht wird.
Da wird nie was wegoptimiert. Nur wenn die Lokal definiert wird dann landet sie nicht im Data-Segment und damit taucht sich im avr-size Listing nicht auf. ----> Weil sie zur Laufzeit auf dem Stack landet.
Global, nun klappt es auch. Jetzt habe ich auch die Sache mit dem Stack verstanden. Achja, das volatile hatte ich auch gegen die Optimierung eingefügt Vielen Dank
cyblord ---- schrieb: > Nur wenn die Lokal definiert wird dann > landet sie nicht im Data-Segment und damit taucht sich im avr-size > Listing nicht auf. ----> Weil sie zur Laufzeit auf dem Stack landet. Stimmt. Das ist nicht nur bei AVR so, sondern auch anderswo.
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.