강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của bu85034594
bu85034594

câu hỏi đã được viết

Lập trình FreeRTOS

Phân tích mã nguồn - xTaskIncrementTick

uart 전송중에는 스위칭이 금지되나요?

Viết

·

64

·

Đã chỉnh sửa

1

틱인터럽트가 들어와도

fflush로 uart 점유 및 전송중이면 스위칭을 안하는건가요?

운영체제임베디드FreeRTOS

Câu trả lời 2

1

guileschool님의 프로필 이미지
guileschool
Người chia sẻ kiến thức

안녕하세요. 박상우님!
freertos 수업중에 사용한 예제 소스 기준으로 답변드립니다. 현재 우리 소스 코드에서는 stm32cubeide 에서 기본으로 제공하는 HAL API UART 드라이버를 이용하여 printf 을 수행합니다.

결국 질문 내용은 관련 핵심 함수인 HAL_UART_Transmit 을 살펴보아야 할텐데요. 해당 함수내에서 tick 인터럽트를 불활성하거나 작동을 방해할 만한 요소는 발견되지 않습니다. 따라서, 간단히 답변드리자면 'fflush 나 HAL_UART_Transmit 함수가 실행중이더라도 tick 인터럽트 이벤트가 발생한다면 인터럽트는 즉시 처리된다. 그리고 문맥전환도 필요하다면 실행된다' 입니다.

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  uint8_t  *pdata8bits;
  uint16_t *pdata16bits;
  uint32_t tickstart = 0U;

  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return  HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Init tickstart for timeout management */
    tickstart = HAL_GetTick();

    huart->TxXferSize = Size;
    huart->TxXferCount = Size;

    /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      pdata8bits  = NULL;
      pdata16bits = (uint16_t *) pData;
    }
    else
    {
      pdata8bits  = pData;
      pdata16bits = NULL;
    }

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    while (huart->TxXferCount > 0U)
    {
      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
      {
        return HAL_TIMEOUT;
      }
      if (pdata8bits == NULL)
      {
        huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU);
        pdata16bits++;
      }
      else
      {
        huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU);
        pdata8bits++;
      }
      huart->TxXferCount--;
    }

    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
    {
      return HAL_TIMEOUT;
    }

    /* At end of Tx process, restore huart->gState to Ready */
    huart->gState = HAL_UART_STATE_READY;

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

-1

안녕하세요, 인프런 AI 인턴입니다. 박상우님

UART 전송과 관련된 플러시 및 스위칭에 대한 질문에 대해 이해를 돕기 위해 유사한 주제를 다룬 답변을 제공합니다.

UART 전송 중에 스위칭이 금지되는 상황은 주로 UART 하드웨어가 실제 데이터를 전송하는 동안 발생할 수 있는 상황입니다. 이러한 경우, UART 전송이 완료될 때까지 선점형 멀티태스킹에서의 스위칭은 일시적으로 지연될 수 있습니다. 이는 데이터 전송의 무결성과 정확성을 보장하기 위해 필요할 수 있습니다.

관련 답변 참고:

  1. Fflush질문: 이 질문에서는 fflush()를 사용하는 동안 UART 통신이 어떻게 동작할 수 있는지를 명확히 설명합니다. 특히, fflush()가 버퍼를 비워 UART 전송을 유발하는 상황에서 예상치 못한 출력이 나타날 수 있음을 설명합니다.

  2. 지연 인터럽트 관련 질문입니다.: 특정 ISR에서의 컨텍스트 스위칭 이슈와 관련한 UART 통신을 포함한 인터럽트 핸들러와의 관계를 다룹니다. 이는 UART 전송이 선점 및 스위칭에 미치는 영향을 이해하는 데 도움이 됩니다.

UART 전송이 진행 중일 때, 해당 시점에서 스위칭을 제어하는 요소로는 우선순위, 임계 영역(임계 구역) 보호 및 인터럽트 관리 정책 등이 있습니다. 이러한 내용은 RTOS의 구현 세부 사항에 따라 다를 수 있으므로 프로젝트의 요구사항에 따라 조정되어야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Hình ảnh hồ sơ của bu85034594
bu85034594

câu hỏi đã được viết

Đặt câu hỏi