Forum: Mikrocontroller und Digitale Elektronik Reicht Speicher des Atmegas?


von John (Gast)


Lesenswert?

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

von Ingo (Gast)


Lesenswert?

Ja, kein Problem...

von Justus S. (jussa)


Lesenswert?

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...

von Andreas B. (bitverdreher)


Lesenswert?

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

von oldmax (Gast)


Lesenswert?

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

von John (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

John schrieb:
> Ich denke, dass der Compiler das Array wegoptimiert.

Wahrscheinlicher ist, dass du es als lokale Variable angelegt hast.

von John (Gast)


Lesenswert?

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
  }

von Cyblord -. (cyblord)


Lesenswert?

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.

von Wilhelm F. (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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.

von John (Gast)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.