인프런 커뮤니티 질문&답변

Lee Kilhun님의 프로필 이미지
Lee Kilhun

작성한 질문수

바닥부터 시작하는 STM32 드론 개발의 모든 것

1-3. 디버그 UART 및 printf 함수 출력

궁금합니다

작성

·

278

1

printf  함수와   작성한  _write 함수가 어떻게 

연결되어 동작했는지 궁금합니다. 

(두 함수의 관계를 정의하지 않아도 되는 이유가 궁금) 

답변 5

2

ChrisP님의 프로필 이미지
ChrisP
지식공유자

안녕하세요. 어려운 질문을 주셨네요..ㅎㅎ;

저도 자세히는 알고 있지 못하고 제가 아는한에서 설명드리면,

PC같은 경우엔 표준출력장치인 모니터가 항상 포함되어있기 때문에 PC에서 돌아가는 장치의 경우엔 별다른 설정 없이도 printf를 사용하면 표준출력장치 모니터로 출력됩니다.

하지만 embedded 시스템에서는 표준출력장치가 정의되어있지 않은 경우가 있기 때문에 (우리가 사용하는 MCU같은 경우) 출력대상을 명시적으로 지정해주어야 합니다. 이걸 redirection 한다고 하는 것 같습니다. Redirection 없이 printf를 사용하면 출력대상이 지정되어있지 않기 때문에 출력되지 않습니다.

이 Redirection 하는 방법은 컴파일러마다 다 다릅니다. 예로 CubeIDE의 경우엔 _write() 함수를 재정의 해주어야 하고, KEIL이나 IAR 같은 경우엔 PUTCHAR PROTOTYPE 매크로를 사용하는 것으로 알고 있습니다. 그리고 이것이 printf() 함수가 컴파일 될 때 해당 함수를 호출하여 문자열을 출력해줍니다. 즉, 이것은 사용자가 직접 Redirection 하는 방법이 아니고, 컴파일러가 제공하는 Redirection 방법을 사용하는 것입니다. 실제 컴파일러가 어떤 방식으로 printf() 호출했을때 _write() 함수를 호출하게 하는지는 컴파일러 매뉴얼을 보셔야 할 텐데, 원리가 자세하게 설명되어있지는 않을거고, 단지 "이렇게 사용하면 printf()로 출력할 수 있다" 라는 정도만 설명되어있을겁니다.

우리가 알아야 하는 것은, MCU는 PC와 다르게 printf() 기본출력 대상이 없기 때문에 원하는 장치로 Redirection 하여 사용해야 하는데, 그건 컴파일러마다 사용 방법이 다르다 라는 것이고, 컴파일러에서는 컴파일 시, printf() 함수의 출력은 Redirection 된 함수(_write()함수같은) 로 대체시킨다 정도로 이해하시면 될 것 같습니다. 또한 소스코드를 통해 출력대상을 UART 가 아닌 다른장치로도 Redirection 할 수도 있습니다.

저도 구글링을 하면서 찾아본건데, 한글 번역 되어있어서 문맥이 조금 이상하게 보일 수 있습니다만 이해하는데 도움이 좀 될 것 같네요.

https://qastack.kr/electronics/206113/how-do-i-use-the-printf-function-on-stm32

한번 쭈욱 읽어보시기 바랍니다!

0

ChrisP님의 프로필 이미지
ChrisP
지식공유자

아뇨 _write() 함수는 사용자가 직접 정의해줘야 합니다.

단, printf()를 호출하면 그 안에서 _write()함수가 호출되도록 되어있다고 보시면 될 것 같습니다.

0

_write()함수도 어딘가에 정의가 되어있다는 말씀이신가요?

0

ChrisP님의 프로필 이미지
ChrisP
지식공유자

ㅎㅎ 공부는 하면 할수록 할게 더 많아지는 것이죠... 그래서 저는 공부라고 생각하지 않고 상식(?)이라고 생각하면서 보는데, 그러면 재밌습니다.ㅎㅎ

연말 잘 마무리 하시고 내년에는 더 성장할 수 있는 한 해 되시기 바랍니다!

감사합니다.

0

Lee Kilhun님의 프로필 이미지
Lee Kilhun
질문자

좀 더 내공을 쌓아야겠네요.  공력을  강제로 입력해 줄 치트키가 있으면 얼마나 좋을까요 

답글 감사합니다.

올해 정리 잘 하시고, 내년 좋은 한 해 되세요

Lee Kilhun님의 프로필 이미지
Lee Kilhun

작성한 질문수

질문하기