¿Puedo iniciar una nueva función de interrupción de uart1 dentro de una función de devolución de llamada de interrupción de uart1 anterior?

3

Estoy utilizando la placa de descubrimiento NUCLEO STM32F46ZG. Mi código es como:

int main(){
  HAL_UART_Transmit_IT(&huart1, buff, 5);

  while(1)
  {
    do something;
  }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  HAL_UART_Transmit_IT(&huart1, buff, 5);
}

Mi código no tiene RTOS, y quiero transmitir continuamente los 5 bytes. Una vez que finalice la transmisión de interrupción anterior, quiero transmitir 5 bytes de inmediato. Entonces, ¿puedo simplemente llamar a HAL_UART_Transmit_IT() en su propia función de devolución de llamada?

    
pregunta linkopen

1 respuesta

3

Claro, solo asegúrate de evitar las condiciones de carrera y el bloqueo de todo lo que se llame desde un ISR. Por ejemplo, si HAL_UART_Transmit_IT bloquea para que el espacio del búfer esté disponible, no debe llamarlo desde un ISR, ya que esto seguramente causará un bloqueo. Además, HAL_UART_Transmit_IT debe ser reentrante ya que su interrupción podría dispararse mientras HAL_UART_Transmit_IT se está ejecutando en su ciclo principal. Otra opción sería establecer una bandera y manejar la transmisión en otro lugar.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas