답변 2
1
안녕하세요. 박상우님!
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 전송이 완료될 때까지 선점형 멀티태스킹에서의 스위칭은 일시적으로 지연될 수 있습니다. 이는 데이터 전송의 무결성과 정확성을 보장하기 위해 필요할 수 있습니다.
Fflush질문: 이 질문에서는 fflush()를 사용하는 동안 UART 통신이 어떻게 동작할 수 있는지를 명확히 설명합니다. 특히, fflush()가 버퍼를 비워 UART 전송을 유발하는 상황에서 예상치 못한 출력이 나타날 수 있음을 설명합니다.
지연 인터럽트 관련 질문입니다.: 특정 ISR에서의 컨텍스트 스위칭 이슈와 관련한 UART 통신을 포함한 인터럽트 핸들러와의 관계를 다룹니다. 이는 UART 전송이 선점 및 스위칭에 미치는 영향을 이해하는 데 도움이 됩니다.
UART 전송이 진행 중일 때, 해당 시점에서 스위칭을 제어하는 요소로는 우선순위, 임계 영역(임계 구역) 보호 및 인터럽트 관리 정책 등이 있습니다. 이러한 내용은 RTOS의 구현 세부 사항에 따라 다를 수 있으므로 프로젝트의 요구사항에 따라 조정되어야 합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.