티스토리 뷰
앞의 글에서 UART 통신이 제대로 수행되는것을 확인하였으므로, printf() 함수를 사용하여 보다 편리하게 출력기능을 수행할 수 있도록 해 보겠다.
main() 함수를 다음과 같이 작성하고 컴파일 해 본다.
컴파일 하면 다음과 같은 에러 화면을 볼 것이다.
printf() 함수에 해당하는 코드가 없기 때문에 발생하는 에러이다. printf() 함수의 실제 코드는 libc 라이브러리에 있으므로 Makefile에 libc가 포함되도록 수정해 주어야 한다.
Makefile을 수정한 다음 다시 컴파일 해본다.
그러자 이번엔 더 많은 에러가 출력 된다. 이것은 libc 라이브러리 코드 중에 일부분은 프로그래머가 직접 만들어 넣어주어야 되는 부분이 있기 때문이다. 예를 들면 printf()라는 함수를 이용해서 문자열을 출력하고자 할 때 어디로 출력되어야 되는지 libc 라이브러리에서는 알 수가 없다. 컴퓨터의 경우에는 모니터로 출력할 수도 있고, 이 글에서처럼 UART로 내보낼수도 있고, 아니면 1602 LCD 화면으로도 내 보낼수 있기 때문이다. 즉, 라이브러리에서 임의로 설정할 수 없는 부분을 프로그래머가 정확히 알려주어야 되는 부분이다.
이 코드를 작성하기 위해서는 newlib라는 오픈소스를 참조하면 된다. https://sourceware.org/newlib/에 들어가서 download 페이지를 열어 newlib 소스코드를 다운받으면 된다.
newlib 소스코드에서 libgloss\arm 디렉토리에 보면 syscalls.c 파일이 있다. 이 파일안에 위에서 나온 에러를 해결할 수 있는 코드가 들어 있으므로 참조하여 함수를 만들어 제공하면 된다.
위의 코드를 적용하면 컴파일 에러가 해결될 것이다.
그리고, 컴파일 결과 생성된 실행파일을 보드에 내려서 실행시키면 다음과 같이 정상적인 결과 화면을 볼 수 있게 된다.
그러나 printf() 함수를 사용하기 위하여 libc 라이브러리를 포함시키게 되면 실행 파일 크기가 너무 커지게 된다. 앞의 글에서 만든 uart 실행 파일의 크기가 2Kbyte 정도 되었는데 이번 글에서 만든 프로그램의 실행 파일 크기가 27Kbyte가 되었다. 13배 정도 실행파일의 크기가 커졌다.
따라서 이런 경우 굳이 libc 를 사용하지 않고 필요한 함수를 프로그래머가 직접 만들어서 사용하는 경우도 많다. ROM이나 RAM 용량이 충분하면 이미 만들어져 있는 libc를 사용하면 편리하지만, 자원의 크기가 제한적이라면 직접 만들어서 사용하는 방법을 선택하여야 한다.
'ARM Cortex-M' 카테고리의 다른 글
interrupt (0) | 2017.02.25 |
---|---|
System Timer (0) | 2017.02.24 |
UART (0) | 2017.02.18 |
Clock 설정 (0) | 2017.02.17 |
GPIO를 통한 LED 제어 (0) | 2017.02.12 |