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

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

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

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

 

 

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 를 사용할 수도 있습니다.

 

개인마다 취향이 다르겠지만 저는 아무래도 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호 | 사이버몰의 이용약관 바로가기
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유