Hallo,
ich brauche aktuell für ein Projekt mehrere Puffer, welche ich zur Laufzeit reservieren möchte.
Nachdem der Code nicht auf Anhieb lief, hab ich ein Testprojekt geschrieben, indem ich einige eigenartige Ergebnisse bekommen hab.
Das ist mein Code:
void setup()
{
Serial.begin(9600);
uint8_t* ptr1 = (uint8_t*) malloc(32);
uint8_t* ptr2 = (uint8_t*) malloc(32);
uint8_t* ptr3 = (uint8_t*) malloc(32);
uint8_t* ptr4 = (uint8_t*) malloc(32);
Serial.println(*ptr1);
Serial.println(*ptr2);
Serial.println(*ptr3);
Serial.println(*ptr4);
}
void loop()
{
}
Hier müssten doch eig. via UART 4 verschiedene Pointer in den RAM ausgegeben werden, oder?
Das hier ist die Rückgabe:
14
17
1
0
mkl0815
December 23, 2013, 12:05pm
2
Naja, "ptr" liefert aber das erste Byte Deines Puffers, nicht den Pointer selbst. Der " " vor dem Variablennamen dient zum "dereferenzieren" des Pointers.
Folgender Code liefert die Adressen der Pointer:
void setup()
{
Serial.begin(9600);
uint8_t* ptr1 = (uint8_t*) malloc(32);
uint8_t* ptr2 = (uint8_t*) malloc(32);
uint8_t* ptr3 = (uint8_t*) malloc(32);
uint8_t* ptr4 = (uint8_t*) malloc(32);
Serial.println((word)ptr1,HEX);
Serial.println((word)ptr2,HEX);
Serial.println((word)ptr3,HEX);
Serial.println((word)ptr4,HEX);
}
void loop()
{
}
Der Cast auf "word" ist notwendig, da Serial.println() mit einem Pointer auf ein Byte nix anfangen kann.
Mario.
mkl0815
December 23, 2013, 12:12pm
4
Spannend finde ich, das die einzelnen Bereiche noch 2 Bytes auseinander liegen. Sprich zwischen den Pointern liegen 34 Bytes, nicht 32. Somit werden jedesmal 2 Byte verschwendet. Wäre interessant zu wissen, wofür die gebraucht werden.
Mario.
Das ist für den Pointer selbst. Die müssen auch noch irgendwo abgespeichert werden. Und Pointer sind auf dem Adruino 2 Bytes groß.
mkl0815
December 23, 2013, 2:20pm
6
Klingt plausibel, passt aber nicht zu folgender Ausgabe:
void setup()
{
Serial.begin(9600);
uint8_t* ptr1 = (uint8_t*) malloc(32);
uint8_t* ptr2 = (uint8_t*) malloc(32);
uint8_t* ptr3 = (uint8_t*) malloc(32);
uint8_t* ptr4 = (uint8_t*) malloc(32);
Serial.print((word)ptr1,HEX);
Serial.print(" @ ");
Serial.println((word)&ptr1,HEX);
Serial.print((word)ptr2,HEX);
Serial.print(" @ ");
Serial.println((word)&ptr2,HEX);
Serial.print((word)ptr3,HEX);
Serial.print(" @ ");
Serial.println((word)&ptr3,HEX);
Serial.print((word)ptr4,HEX);
Serial.print(" @ ");
Serial.println((word)&ptr4,HEX);
}
void loop()
{
}
1D3 @ 8EC
1F5 @ 8EE
217 @ 8F0
239 @ 8F2
Wie man sieht, liegen die Variablen ptr1 bis ptr4 ganz woanders.
Mario.
Duh. Stimmt. malloc ist ja auf dem Heap. Die Pointer sind auf dem Stack.
Falls es noch jemand interessiert:
malloc belegt den Speicher selbst und die Länge ( 2 byte ), damit free weiss, was wieder freigegen werden soll...
mkl0815
December 26, 2013, 6:55am
9
Ja, tut es. Danke fürs rausfinden.
Mario.