STM32 calloc()/free() auf USB-Schnittstelle

OP #5758017
Lesenswert?
• ▲
▼
Hallo Gemeinde,

ich arbeite auf einem STM32L496 (nucleo-144)

Die USB-CDC-Schnittstelle hat mir CubeMx gebastelt.

Senden und Empfangen geht,
aber nur mit statischen Sendepuffer!
Da ich aber zwischen 2 und 2k-Bytes senden werden,
möchte ich dynamischen Speicher verwenden.

Mit diesem Befehl werden die Daten versendet:
CDC_Transmit_FS(pbuf, lenframe + SIZE_CRC);

Das Verhalten ist komisch:
Wenn Speicher erfolgreich (!NULL) allokiert wird (calloc())
und kein!!! free() verwendet wird geht das Senden
bis das Allokieren fehlschlägt (heapsize = 0x400)
Bis hierher normal...

Wenn ich nach CDC_Transmit_FS() free() verwende
friert die Anwendung ein.
Ich prüfe auch auf (while(!hcdc->TxState)).

Kann die USB-CDC-Schnittstelle nicht mit dyn. Memory umgehen?
Ist es egal, ob der Pointer für calloc() lokal oder global deklariert 
wird?

Komme hier nicht weiter.

Grüße
Runout
OP #5758208
Lesenswert?
• ▲
▼
Hallo Uwe,

danke für den Tipp.

in ST-UM1021 ( On-The-Go host and device library)

Dedicated FIFO transmission for each of the 4 device IN endpoints.
Each FIFO can hold multiple packets

"dedicated RAM" ist für mich erst mal Namedropping ;-)
Der Nachteil des "HAL Generierens" ist des Fehlen des detaillierten 
Durchblicks.

Wie es aussieht, muss ich meine Puffer schon beim Kompilieren wissen.
Relativ blöd...

Grüße
Runout
Gast #5758244
Lesenswert?
• ▲
▼
Ich vermute, dein Problem wird dadurch ausgelöst, dass die 
Datenübertragung nach dem Aufruf von CDC_Transmit_FS() asynchron 
stattfindet. Der Puffer wird also noch länger benötigt, und zwar bis die 
Übertragung beendet ist.
OP #5758703
Lesenswert?
• ▲
▼
Hallo Stefanus,

war auch meine erste Vermutung.

Deswegen:
"Ich prüfe auch auf (while(!hcdc->TxState))"

Ich schaue mal,
ob es einen Int "Senden fertig / Sendpuffer leer" gibt.
Einfach so mit Timer den Speicher freigeben wäre nur
versuchsweise eine Lösung.

Grüße Runout

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.