STM32f767zi: HAL_UART_Transmit_DMA funktioniert nicht

OP #6718807
Lesenswert?
• ▲
▼
Für mein https://github.com/FBergemann/STM32-FreeRTOS-Framework versuche 
ich die Ausgabe auf die Console zu verbessern.
Auf DMA zu wechseln funktioniert leider nicht.
Siehe im dev-v2 branch 
https://github.com/FBergemann/STM32-FreeRTOS-Framework/tree/dev-v2, 
https://github.com/FBergemann/STM32-FreeRTOS-Framework/blob/dev-v2/User/UserSrc/Tasks/TaskConsole/TaskConsole.c

Ein DMA write geht raus, aber die Schleife
1
while ( HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY);
hängt.
in stm32f7xx_hal_uart.c hier
1
HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)
2
{
3
  uint32_t temp1;
4
  uint32_t temp2;
5
  temp1 = huart->gState;
6
  temp2 = huart->RxState;
7

8
  return (HAL_UART_StateTypeDef)(temp1 | temp2);
9
}

bekomme ich den Wert 0x21 = #33 für temp1 = huart->gState.

Während der erwartete Wert HAL_UART_STATE_READY = 0x20 = #32

Mit
1
...
2
#define  HAL_UART_STATE_READY         0x00000020U    /*!< Peripheral Initialized and ready for use
3
                                                          Value is allowed for gState and RxState */
4
...
5
#define  HAL_UART_STATE_BUSY_TX       0x00000021U    /*!< Data Transmission process is ongoing
6
                                                          Value is allowed for gState only */
7
...

Ich habe im Netz gesucht und fand Hinweise, dass man 
HAL_UART_STATE_READY selbst setzen muss? (wo und warum? liegt's an 
circular vs. nicht-circular und dass beide über denselben Mechanismus 
laufen?)

Letztendlich ist die loop
1
while ( HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY);
Sowieso nicht sinnvoll. Ich mache ja kein dma, damit ich parallel dann 
doch wieder cpu verbrate. Aber da kann man hinterher durch eine 
Semaphore austauschen.


MIch würde ausserdem noch interessieren, ob so eine Konstruktion
1
    vTaskSuspendAll();
2
      writePtr += len;
3
      if (writePtr > endPtr) writePtr = logBuffer;
4
    xTaskResumeAll();
sinnvoll/zulässig ist, um ein konsistenten update vom writePtr für 
TaskConsole_Run() zu gewährleiste.

Und: Kann man sich darauf verlassen, dass in TaskConsole_Run() wiederum 
das Holen des Wertes
1
char *writePtrCopy = writePtr;
atomar ist?
Beitrag #6718886 wurde von einem Moderator gelöscht.
OP #6719179
Lesenswert?
• ▲
▼
> MIch würde ausserdem noch interessieren, ob so eine Konstruktion
1
vTaskSuspendAll();
2
  writePtr += len;
3
  If (writePtr > endPtr) writePtr = logBuffer;
4
xTaskResumeAll();
> sinnvoll/zulässig ist, um ein konsistenten update vom writePtr für
> TaskConsole_Run() zu gewährleiste.
>
> Und: Kann man sich darauf verlassen, dass in TaskConsole_Run() wiederum das
> Holen des Wertes
1
char *writePtrCopy = writePtr;
> atomar ist?

Laut 
https://stackoverflow.com/questions/52784613/which-variable-types-sizes-are-atomic-on-stm32-microcontrollers 
(mit Verweis auf Spec) ist
1
char *writePtrCopy = writePtr;
Bereits ok.

Und aus
1
vTaskSuspendAll();
2
  writePtr += len;
3
  If (writePtr > endPtr) writePtr = logBuffer;
4
xTaskResumeAll();
Muss ich machen
1
writePtrCopy = writePtr + len;
2
If (writePtrCopy > endPtr) writePtrCopy = logBuffer;
3
writePtr = writePtrCopy

Mit jeweils eigenen (nicht globalen) writePtrCopy Instanzen.

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.