[Cryptech-Commits] [sw/stm32] branch master updated: Still some problem with uart receive under heavy load, so change to a 2-byte receive buffer with half-complete callbacks, and raise the dma priority.

git at cryptech.is git at cryptech.is
Tue Sep 20 13:12:02 UTC 2016


This is an automated email from the git hooks/post-receive script.

paul at psgd.org pushed a commit to branch master
in repository sw/stm32.

The following commit(s) were added to refs/heads/master by this push:
       new  d172acb   Still some problem with uart receive under heavy load, so change to a 2-byte receive buffer with half-complete callbacks, and raise the dma priority.
d172acb is described below

commit d172acba926b72c57c47697bd640c51c0fcb038d
Author: Paul Selkirk <paul at psgd.org>
AuthorDate: Tue Sep 20 09:10:08 2016 -0400

    Still some problem with uart receive under heavy load, so change to a 2-byte receive buffer with half-complete callbacks, and raise the dma priority.
---
 .../TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c      |  2 +-
 .../TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c           | 42 +++++++++++++++++++---
 .../TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c      | 42 +++++++++++++++++++---
 projects/hsm/hsm.c                                 | 25 +++++++------
 4 files changed, 89 insertions(+), 22 deletions(-)

diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c
index 7eeb6df..609c596 100644
--- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c
+++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c
@@ -182,7 +182,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
     hdma->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
     hdma->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
     hdma->Init.Mode = DMA_CIRCULAR;
-    hdma->Init.Priority = DMA_PRIORITY_LOW;
+    hdma->Init.Priority = DMA_PRIORITY_HIGH;
     hdma->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
     /*
       hdma->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c
index 7b8e97f..f69e790 100644
--- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c
+++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c
@@ -189,6 +189,12 @@ void USART2_IRQHandler(void)
     HAL_UART_IRQHandler(&huart_user);
 }
 
+/**
+  * @brief  Rx Transfer completed callbacks.
+  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
+  *                the configuration information for the specified UART module.
+  * @retval None
+  */
 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 {
     extern void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart);
@@ -201,23 +207,49 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
         HAL_UART2_RxCpltCallback(huart);
 }
 
+__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+  /* NOTE: This function Should not be modified, when the callback is needed,
+           the HAL_UART1_RxCpltCallback could be implemented in the user file
+   */
+}
+
+__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+  /* NOTE: This function Should not be modified, when the callback is needed,
+           the HAL_UART2_RxCpltCallback could be implemented in the user file
+   */
+}
+
 /**
-  * @brief  Rx Transfer completed callbacks.
+  * @brief  Rx Half Transfer completed callbacks.
   * @param  huart: pointer to a UART_HandleTypeDef structure that contains
   *                the configuration information for the specified UART module.
   * @retval None
   */
-__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart)
+void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
+{
+    extern void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart);
+    extern void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart);
+
+    if (huart->Instance == USART1)
+        HAL_UART1_RxHalfCpltCallback(huart);
+
+    else if (huart->Instance == USART2)
+        HAL_UART2_RxHalfCpltCallback(huart);
+}
+
+__weak void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart)
 {
   /* NOTE: This function Should not be modified, when the callback is needed,
-           the HAL_UART_RxCpltCallback could be implemented in the user file
+           the HAL_UART1_RxHalfCpltCallback could be implemented in the user file
    */
 }
 
-__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
+__weak void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart)
 {
   /* NOTE: This function Should not be modified, when the callback is needed,
-           the HAL_UART_TxCpltCallback could be implemented in the user file
+           the HAL_UART2_RxHalfCpltCallback could be implemented in the user file
    */
 }
 
diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c
index 1118db2..0b829b3 100644
--- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c
+++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c
@@ -193,6 +193,12 @@ void USART2_IRQHandler(void)
     HAL_UART_IRQHandler(&huart_user);
 }
 
+/**
+  * @brief  Rx Transfer completed callbacks.
+  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
+  *                the configuration information for the specified UART module.
+  * @retval None
+  */
 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 {
     extern void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart);
@@ -205,23 +211,49 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
         HAL_UART2_RxCpltCallback(huart);
 }
 
+__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+  /* NOTE: This function Should not be modified, when the callback is needed,
+           the HAL_UART1_RxCpltCallback could be implemented in the user file
+   */
+}
+
+__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+  /* NOTE: This function Should not be modified, when the callback is needed,
+           the HAL_UART2_RxCpltCallback could be implemented in the user file
+   */
+}
+
 /**
-  * @brief  Rx Transfer completed callbacks.
+  * @brief  Rx Half Transfer completed callbacks.
   * @param  huart: pointer to a UART_HandleTypeDef structure that contains
   *                the configuration information for the specified UART module.
   * @retval None
   */
-__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart)
+void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
+{
+    extern void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart);
+    extern void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart);
+
+    if (huart->Instance == USART1)
+        HAL_UART1_RxHalfCpltCallback(huart);
+
+    else if (huart->Instance == USART2)
+        HAL_UART2_RxHalfCpltCallback(huart);
+}
+
+__weak void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart)
 {
   /* NOTE: This function Should not be modified, when the callback is needed,
-           the HAL_UART_RxCpltCallback could be implemented in the user file
+           the HAL_UART1_RxHalfCpltCallback could be implemented in the user file
    */
 }
 
-__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
+__weak void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart)
 {
   /* NOTE: This function Should not be modified, when the callback is needed,
-           the HAL_UART_TxCpltCallback could be implemented in the user file
+           the HAL_UART2_RxHalfCpltCallback could be implemented in the user file
    */
 }
 
diff --git a/projects/hsm/hsm.c b/projects/hsm/hsm.c
index 862e718..f2f1b12 100644
--- a/projects/hsm/hsm.c
+++ b/projects/hsm/hsm.c
@@ -103,7 +103,7 @@ osMutexId  uart_mutex;
 osMutexDef(uart_mutex);
 #endif
 
-static volatile uint8_t uart_rx;	/* current character received from UART */
+static uint8_t uart_rx[2];	/* current character received from UART */
 
 /* Callback for HAL_UART_Receive_DMA().
  * With multiple worker threads, we can't do a blocking receive, because
@@ -113,7 +113,7 @@ static volatile uint8_t uart_rx;	/* current character received from UART */
  * Even with only one worker thread, context-switching to the CLI thread
  * causes HAL_UART_Receive to miss input.
  */
-void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
+static void RxCallback(uint8_t c)
 {
     /* current RPC input buffer */
     static rpc_buffer_t *ibuf = NULL;
@@ -125,7 +125,7 @@ void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
         ibuf->len = 0;
     }
 
-    if (hal_slip_recv_char(ibuf->buf, &ibuf->len, sizeof(ibuf->buf), &complete) != LIBHAL_OK)
+    if (hal_slip_process_char(c, ibuf->buf, &ibuf->len, sizeof(ibuf->buf), &complete) != LIBHAL_OK)
         Error_Handler();
 
     if (complete) {
@@ -135,17 +135,20 @@ void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
     }
 }
 
-void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
+void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart)
 {
-    /* I dunno, just trap it for now */
-    Error_Handler();
+    RxCallback(uart_rx[0]);
 }
 
-hal_error_t hal_serial_recv_char(uint8_t *cp)
+void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart)
 {
-    /* return the character from HAL_UART_Receive_DMA */
-    *cp = uart_rx;
-    return LIBHAL_OK;
+    RxCallback(uart_rx[1]);
+}
+
+void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
+{
+    /* I dunno, just trap it for now */
+    Error_Handler();
 }
 
 hal_error_t hal_serial_send_char(uint8_t c)
@@ -269,7 +272,7 @@ int main()
     }
 
     /* Start the UART receiver. */
-    if (HAL_UART_Receive_DMA(&huart_user, (uint8_t *)&uart_rx, 1) != CMSIS_HAL_OK)
+    if (HAL_UART_Receive_DMA(&huart_user, uart_rx, 2) != CMSIS_HAL_OK)
         Error_Handler();
 
     /* Launch other threads (csprng warm-up thread?)

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Commits mailing list