본문 바로가기
OldStory/WORKS

printf

by Alnilam 2010. 6. 9.

FreeRTOS와 같은 RTOS에서 UART를 통해 printf와 같은 표준입출력 함수를 사용려면 어떻게 해야 할까?

표준입출력 함수는 보통 툴체인과 함께 제공된다. 코드내에서 stdio.h를 포함 시키고 함수를 사용하면 제공된 라이브러리가 같이 링크되어 라이브러리에 있는 함수가 호출 된다.
하지만 시스템 마다 UART가 다르므로 라이브러리에서는 입출력 시스템 콜을 호출하게 되며 이 시스템 콜 함수는 사용하는 시스템에 맞게 UART 입출력을 구현 해 주어야 한다. 그러므로 사용하는 컴파일러에 따라 시스템 콜 함수가 다르다.

현재 yagarto gcc 툴체인을 사용하여 개발 중인데   yagarto-bu-2.19_gcc-4.22-c-c++_nl-1.16.0_gi-6.8.50_20080408.exe 버전의 경우 시스템 콜이 라이브러리에 포함이 되어 printf 를 사용할 수 없었다. 하지만 yagarto-bu-2.20.1_gcc-4.5.0-c-c++_nl-1.18.0_gdb-7.1_eabi_20100501.exe 버전의 경우 입출력 시스템 콜을 외부에서 구현하도록 하여 시스템 콜을 구현해 주면 uart를 통해 printf와 같은 표준 입출력 함수를 사용할 수 있다.

꼭 구현해야 하는 시스템 콜 함수는 다음과 같으면 그 예제이다. syscalls.c
_read_r, _lsee_r, _write_r, _close_r, _sbrk_r, _fstat_r, _isatty_r, _exit

이 중 _read_r, _write_r함수에 UART 입출력을 구현 하면 된다.

참고로 표준 입출력 함수는 라이브러리로 제공되므로 디버깅중에 소스가 보이지 않는다. 표준 입출력함수의 소수가 궁금하거나 디버깅을 해야 한다면 소스를 받아 설치 하면 된다. yagarto 톨체인의 경우 nl-1.18.0이 표준 입출력 라이브러리의 버전으로 newlib-.1.18.0 을 의미 한다. newlib은 newlib 홈페이지에서 받을 수 있다.

'OldStory > WORKS' 카테고리의 다른 글

startup code  (0) 2010.06.29
_sbrk_r  (0) 2010.06.24
최적화 옵션  (0) 2010.06.08
HISR  (0) 2010.06.04
Timer Test  (0) 2010.05.28