Forum: Mikrocontroller und Digitale Elektronik Controller alloziert keinen Speicher


von Christian (Gast)


Lesenswert?

Hallo zusammen,

auf einem ATMega 128 brauche ich die Datenstruktur einer Warteschlange. 
Dafür habe ich eine Funktion zum hinzufügen eines Knotens. Der Funktion 
wird der Inhalt des Knoten (Q_datentyp e) sowie die eigentliche 
Warteschlange (queue *q) übergeben. Rufe ich nun die Funktion auf (ohne 
Compiler Errors) geht die IF-Abfrage immer in den ELSE-Teil. Unter Linux 
funktioniert die Funktion und die ganze Warteschlange einwandfrei.
1
int q_enqueue( Q_datentyp e, queue *q )  {
2
    q_knoten *neu = (q_knoten*)malloc(sizeof(q_knoten));
3
    if(neu != NULL) {
4
        neu->q_daten = e;
5
        if(!q_empty(*q)) {
6
            neu->next = q->head;
7
            q->head = neu;
8
        } else {
9
            q->head = neu;
10
            q->tail = neu;
11
        }
12
        return 1;
13
    } else {
14
        return 0;
15
    }
16
}

Hat vlt. jemand eine Idee woran das liegt? Als Compiler nutze ich den 
von CodeVision.

von Peter (Gast)


Lesenswert?

Christian schrieb:
> jemand eine Idee woran das liegt?

das der atmel zu wenig freien speicher hat - kann ich mir vorstellen. 
Das wird wohl auch der Grund sein warum kaum jemand ersthaft malloc auf 
einem Atmel haben will.

von Christian (Gast)


Lesenswert?

Peter schrieb:
> Christian schrieb:
>> jemand eine Idee woran das liegt?
>
> das der atmel zu wenig freien speicher hat - kann ich mir vorstellen.
> Das wird wohl auch der Grund sein warum kaum jemand ersthaft malloc auf
> einem Atmel haben will.

Das kann ich mir nicht vorstellen. Momentan initialisiert das Programm 
nur eine Hand voll Variablen. Bei einem anderen Projekt auf einem ATMega 
644 lief die Warteschlange problemlos. Da wurden auch wesentlich mehr 
Variablen genutzt und das ganze allerdings mit WinAVR compiliert.

von tom (Gast)


Lesenswert?

...autsch, dynamische Speicherverwaltung auf einem kleinen uC, davon 
würde ich erstmal schon prinzipiell abraten !
Überlege Dir eine statische Lösung, wie z.B. einen Ringpuffer o.ä.

gruss, tom.

von Christian (Gast)


Lesenswert?

tom schrieb:
> ...autsch, dynamische Speicherverwaltung auf einem kleinen uC, davon
> würde ich erstmal schon prinzipiell abraten !
> ...
> gruss, tom.


Was spricht denn dagegen? Ich habe Daten mit unterschiedlicher Länge und 
mit einem Array würde ich mehr Platz im RAM verschwenden als mit den 
paar Zeilen Code. Und wie schon erwähnt, auf einem ATMega 644 lief es 
einwandfrei.

von Purzel H. (hacky)


Lesenswert?

Dynamischer Speicher ist etwas was man in Controllern generell 
vermeidet. Denn sonst muss man sich an einem idiotischen Ort im Programm 
darum kuemmern was geschehen soll wenn es keinen Freien mehr hat. Zudem 
ist die Zeit zur Allokation nicht konstant.

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:

> Was spricht denn dagegen?

Das du in Summe weniger Platz zur Verfügung hast als wie wenn du 
statisch allokierst. Und wenn du nur heftig genug allokierst und wieder 
freigibst, dann schlägt dir die Speicherfragmentierung ein Schnippchen.
Rein rechnerisch hast du zb 500 Bytes frei und trotzdem kriegst du eine 
läppische Speicheranforderung mit 50 Bytes nicht mehr durch.

> Ich habe Daten mit unterschiedlicher Länge und
> mit einem Array würde ich mehr Platz im RAM verschwenden als mit den
> paar Zeilen Code.

1) Das genaue Gegenteil ist der Fall
2) Und? Kriegst du von Atmel für nicht benutzten Speicher Geld zurück?


> Rufe ich nun die Funktion auf (ohne
> Compiler Errors) geht die IF-Abfrage immer in den ELSE-Teil.

du hast 2 if und 2 else.
Also: Welches?

>    if(neu != NULL) {

dann wird dir wohl malloc keinen Speicher mehr besorgen können

>        if(!q_empty(*q)) {

dann musst du rausfinden, warum q_empty deine queue immer als leer 
ansieht

von Christian (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> du hast 2 if und 2 else.
> Also: Welches?

das erste if
1
if(neu != NULL)
 schlägt fehl.

Mir ist eingefallen das ich mir die Fusebits nicht angeguckt haben. 
Könnte es daran scheitern oder an der Optimierung des Compilers? Daran 
das kein Platz ist glaube ich nicht, denn ich habe in dem ganzen 
Programm keine zehn Variablen deklariert.

von Olaf (Gast)


Lesenswert?

> Daran das kein Platz ist glaube ich nicht,

Warum willst du glauben? Das hat doch schoen bei Goettern nicht 
funktioniert. Lass dir von deinem Compiler ein mapfile erzeugen
und schaue nach wie gross deine Variablen sind und wo der Stack liegt
und noch interessanter wo malloc seinen heap hat.

Olaf

p.s: Auch ich denke das es unklug ist malloc zu benutzen. .-)

von tom (Gast)


Lesenswert?

@Christian

...nichts für ungut, niemand hat die Absicht Dir Dein Designkonzept 
auszureden, wirklich nicht.
Die aufgeführten Gründe sind aber real vorhanden und die pure+reine 
Informatik trifft auf die reale raue und asketisch-spartanische Welt der 
embedded Systeme g.

Also, wenn es auf einem atmega644 funzt und Du das auf einem 128'er zum 
Leben erwecken willst: "So gehe er dann hin, benütze den gleichen 
Compiler und modifiziere das originale Makefile für seine 128'er Zwecke 
!".
So sprach der König und murmelte nachdenklich in seinen Bart - "Geh Zeh 
Zeh" - welch seltsame Aufforderung.

Gutt Lack und Gute Nacht, all Euch kleinen Bits, Beits und Müh-Zehs !

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.