MCU/TIP / / 2020. 6. 7. 10:24

TouchGFX Designer 로 만든 프로젝트 에서 printf 사용

TouchGFX Designer로 프로젝트를 생성해서 사용하면 int __io_putchar(int ch)을 추가하여도 printf 문이 동작하지 않습니다.

대부분 저는 인터넷에서 아래 함수를 복사해서 사용하는데 아무리 추가를 하여도 printf 문이 동작하지 않습니다.

 

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
view raw stm32f4 printf hosted with ❤ by GitHub

 

printf (및 다른 모든 콘솔 지향 stdio 함수)가 작동하는 방식은 _read() _write()와 같은 저수준 I / O 함수의 사용자 정의 구현을 만드는 것입니다. 

 

프로젝트에서 int _write(int file, char *ptr, int len)를 검색해보면 선언된 부분을 확인할 수가 없습니다.

기본으로 CubeIDE에서 프로젝트 작업을 할 때에는 syscalls.cint _write(int file, char *ptr, int len)가 선언되어 있고, _write(int file, char* ptr, int len)에서 __io_putchar(int ch)을 호출합니다.

 

아래와 같이 TouchGFX Designer ( 4.13.0 )에서 생성한 Project 에는 syscalls.c 가 프로젝트에 추가되어 있지 않습니다.

 

 

하지만 프로젝트 폴더에는 syscalls.c 가 생성되어 있습니다.

 

 

생성되어 있는 syscalls.c 를 드래그하여 프로젝트에 하고, int __io_putchar(int ch) 함수를 추가하여 printf 를 사용합니다.

 

아니면 아래와 같이 int __io_putchar(int ch), int _write(int file, char *ptr, int len) 두 함수를 모두 추가하여 printf 를 사용할 수도 있습니다.

int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}

 

개인마다 취향이 다르겠지만 저는 아무래도 syscalls.c 를 추가하는 것을 더욱 선호합니다.

 

CubeIDE에서 printf를 사용하게 되면 행 버퍼링이 적용되어 있습니다 ( 현재 버전 : 1.3.1 )

개행 문자가 입력되면 stdout 안의 버퍼가 출력되게 됩니다. 아니면 fflush를 통하여 버퍼를 출력해주어야 합니다.

 

그래서 저는 setvbuf 함수를 이용하여 원하는 순간 바로 송신이 되도록 수정해줍니다.

printf를 처음 사용하기 전에 setvbuf(stdout, NULL, _IONBF, 0); 을 추가하여 버퍼가 바로 송신되도록 수정합니다.

 

 

setvbuf 참고 사이트 : https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/setvbuf.htm

 

사업자 정보 표시
봄해(BOMHAI) | 이동현 | 경기도 수원시 장안구 상률로 32 103동 1301 | 사업자 등록번호 : 564-09-02316 | TEL : 010-2977-3322 | Mail : dylan@bomhai.com | 통신판매신고번호 : 2023-수원장안-0750호 | 사이버몰의 이용약관 바로가기
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유