위 코드는 Keil에서 STM32Nucleo 보드의 버튼을 누를 때 led가 켜지는 코드다.
int main()이하 부분은 관심대상에서 제외하고 그 위 부분에 초점을 맞추려고 한다.
아두이노에서 비슷하게 구현되고 STM32등에서 LED를 켤 때 자주 쓰이는 코드로
DigitalOut led(LED1);
이런 코드를 자주 볼 수 있다.
간단해보이지만 이 뒤에는 c++문법이 그대로 녹아있다.
DigitalOut led(LED1); 의 의미를 간단하게 설명하면,
"LED1번핀을 앞으로 led라고 부를것이고, Digital 출력으로 사용하겠다"고 선언하는 것이다.
C++문법상으로는,
"DigitalOut이라는 클래스에서 led라는 객체를 생성하고 LED1이라는 파라미터를 집어넣은 것"이다.
그러면 DigitalOut이라 단어 한 개 달랑 적어놓았다고 컴파일러는 얘가 클래슨지 뭔지 어떻게 디지털 출력인지 알고 사용하느냐?
일단 mbed.h 딱 하나 include 했으니 저기서부터 단서를 찾아봐야한다.
mbed.h 헤더의 내부 코드이다. 수많은 헤더를 다 읽어들이고 있는게 보인다.
그중에서 DigitalOut.h라는 헤더를 읽어들인게 보인다. 아마 여기서 DigitalOut이라는 클래스를 정의했을 것이다.
DigitalOut.h를 열어봤다.
DigitalOut이라는 클래스를 선언하고 있고, 생성자를 만들어서 pin을 파라미터로 받아들이는 것을 볼 수 있다.
그리고
gpio_init_out(&gpio, pin);
이라는 함수가 생성자 내부에 있으므로 객체를 생성하면 이 부분이 바로 실행된다.
gpio_init_out(&gpio, pin); 을 찾아보기 위해서 또 gpio_api.h 헤더를 열어봤다.
gpio_api.h에서 함수로 정의되고 있는 것을 알 수 있다.
여기서도 stdint.h, device.h 등등 계속 꼬리에서 꼬리를 물고 이어져있었다.
그래서 계속찾으면 끝이 없기때문에 이까지만 찾기로하고
다시 DigitalOut으로 돌아가면,
DigitalOut 클래스를 호출하면 gpio_init_out 이라는 출력을 initializing 하는 함수를 실행하게 된다는 사실을 알 수 있다.
(결국 gpio_init_out 함수가 해당 핀을 출력으로 만들어준다 정도로 이해하면 될 것 같다)
그래서 정리하면 원래 처음 코드인
DigitalOut led(LED1);
이 코드가 실행되는 순간,
mbed.h안의 DigitalOut.h를 열고, 그 안에 있는 DigitalOut이라는 클래스를 호출 한 다음, 생성자 안에 있던 gpio_init_out라는 함수를 실행시키는 방식으로 출력이 구현한다고 보면 될 것 같다.
'Keil µVision5' 카테고리의 다른 글
keil C++ 정리 - (2) (0) | 2020.08.05 |
---|---|
Keil No target connected 에러 (0) | 2020.08.04 |