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?