Forum: Compiler & IDEs GCC und static deklarierung von arrays


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mat. K. (matthias_kornfield)


Lesenswert?

Hi
was macht diese Funktion eigentlich (STM32 USB library):
Wird bei jedem Aufruf ein neuer array mit dem Namen mem angelegt? Sieht 
ganz danach aus.
1
/**
2
  * @brief  Static single allocation.
3
  * @param  size: Size of allocated memory
4
  * @retval None
5
  */
6
void *USBD_static_malloc(uint32_t size)
7
{
8
  static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */
9
  return mem;
10
}

[Mod: c-Tags eingefügt]

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mat. K. schrieb:
> Wird bei jedem Aufruf ein neuer array mit dem Namen mem angelegt?

Nein. Static-Variablen existieren nur einmal im Speicher - und das über 
die komplette Laufzeit. Die Funktion gibt jedes mal dieselbe Adresse auf 
denselben Speicherbereich (Array) zurück.

Übrigens: Das Argument dieser Funktion wird komplett ignoriert.
(Ja, die STM32-USB-Library ist etwas gewöhnungsbedürftig und wirft bei 
entsprechendem Warning-Level jede Menge von Warnungen.)

: Bearbeitet durch Moderator
von Bruno V. (bruno_v)


Lesenswert?

Das sieht aus wie ein Hack, wo eine Funktion "USBD" ein malloc braucht, 
aber das Framework keines bereitstellen soll.


Es wird gleichzeitig nur genau ein Block gebraucht.

Vermutlich wird das malloc an mehreren Stellen aufgerufen aber 
dazwischen immer wieder freigegeben. (Ansonsten hätte man sich die 
Funktion schenken können und den Speicher direkt am Aufrufort legen 
können)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mat. K. schrieb:
> void *USBD_static_malloc(uint32_t size)

wobei "_malloc" ein ziemlich blöder Name für diese Funktion ist.

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.