

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Espressif ESP32-DevKitC 및 ESP-WROVER-KIT 시작하기
<a name="getting_started_espressif"></a>

**중요**  <a name="deprecation-message"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

**참고**  
자체 Espressif IDF 프로젝트 내에 FreeRTOS 모듈식 라이브러리 및 데모를 통합하는 방법을 알아보려면 [eatured reference integration for ESP32-C3 platform](https://www.freertos.org/featured-freertos-iot-integration-targeting-an-espressif-esp32-c3-risc-v-mcu/)을 참조하세요.

이 자습서에 따라 ESP32-WROOM-32, ESP32-SOLO-1 또는 ESP-WROVER 모듈 및 ESP-WROVER-KIT-VB가 장착된 Espressif ESP32-DevKitC를 시작합니다. AWS 파트너 디바이스 카탈로그에서 파트너로부터 구매하려면 다음 링크를 사용합니다.
+ [ESP32-WROOM-32 DevKitC](https://devices.amazonaws.com/detail/a3G0L00000AANtjUAH/ESP32-DevKitC)
+ [ESP32-SOLO-1](https://devices.amazonaws.com/detail/a3G0h0000076lSMEAY)
+ [ ESP32-WROVER-KIT](https://devices.amazonaws.com/detail/a3G0L00000AANtlUAH/ESP-WROVER-KIT)

이러한 개발 보드 버전이 FreeRTOS에서 지원됩니다.

이러한 보드의 최신 버전에 대한 자세한 내용은 Espressif 웹 사이트에서 [ESP32-DevKitC](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/hw-reference/modules-and-boards.html#esp32-devkitc-v4) 또는 [ESP-WROVER-KIT v4.1](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/hw-reference/modules-and-boards.html#esp-wrover-kit-v4-1)를 참조하세요.

**참고**  
현재 ESP32-WROVER-KIT 및 ESP DevKitC용 FreeRTOS 포트는 SMP(대칭적 다중 처리) 기능을 지원하지 않습니다.

## 개요
<a name="getting_started_espressif-overview"></a>

이 자습서에서는 다음과 같은 단계를 안내합니다.

1. 보드를 호스트 시스템에 연결합니다.

1. 마이크로 컨트롤러 보드용 내장형 애플리케이션을 개발 및 디버깅하기 위한 소프트웨어를 호스트 시스템에 설치합니다.

1. FreeRTOS 데모 애플리케이션을 바이너리 이미지로 크로스 컴파일합니다.

1. 애플리케이션 바이너리 이미지를 보드에 로드한 후 애플리케이션을 실행합니다.

1. 모니터링 및 디버깅을 위해 직렬 연결로 보드에서 실행되는 애플리케이션과 상호 작용합니다.

## 사전 조건
<a name="setup-espressif-prereqs"></a>

Espressif 보드에서 FreeRTOS를 시작하기 전에 AWS 계정과 권한을 설정해야 합니다.

### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

를 시작하려면이 AWS필요합니다 AWS 계정. 생성에 대한 자세한 AWS 계정내용은 *AWS Account Management 참조 안내서*의 [시작하기 AWS 계정](https://docs.aws.amazon.com//accounts/latest/reference/getting-started.html)를 참조하세요.

액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요.
+ 의 사용자 및 그룹 AWS IAM Identity Center:

  권한 세트를 생성합니다. *AWS IAM Identity Center 사용자 안내서*에서 [권한 세트 생성](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)의 지침을 따릅니다.
+ ID 제공업체를 통해 IAM에서 관리되는 사용자:

  ID 페더레이션을 위한 역할을 생성합니다. *IAM 사용자 설명서*의 [Create a role for a third-party identity provider (federation)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)의 지침을 따릅니다.
+ IAM 사용자:
  + 사용자가 맡을 수 있는 역할을 생성합니다. *IAM 사용자 설명서*에서 [Create a role for an IAM user](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)의 지침을 따릅니다.
  + (권장되지 않음) 정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. *IAM 사용 설명서*에서 [사용자(콘솔)에 권한 추가](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)의 지침을 따릅니다.

## 시작하기
<a name="setup-espressif-idf42"></a>

**참고**  
이 자습서의 Linux 명령을 사용하려면 Bash 쉘을 사용해야 합니다.

1. **Espressif 하드웨어 설정.**
   + ESP32-DevKitC 개발 보드 하드웨어를 설정하는 방법에 대한 정보는 [ESP32-DevKitC V4 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/hw-reference/esp32/get-started-devkitc.html)를 참조하세요.
   + ESP-WROVER-KIT 개발 보드 하드웨어를 설정하는 방법에 대한 정보는 [ESP-WROVER-KIT V4.1 Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/hw-reference/esp32/get-started-wrover-kit.html)를 참조하세요.
**중요**  
Espressif 안내서의 **다음 단계** 섹션에 도달하면 여기서 멈추고 이 페이지의 지침으로 돌아갑니다.

1. [GitHub](https://github.com/aws/amazon-freertos)에서Amazon FreeRTOS를 다운로드합니다. (자세한 지침은 [README.md](https://github.com/aws/amazon-freertos/blob/main/README.md) 파일을 참조하세요.)

1. **개발 환경 설정**.

   보드와 통신하려면 도구 체인을 설치해야 합니다. Espressif는 보드용 소프트웨어를 개발할 수 있는 ESP-IDF를 제공합니다. ESP-IDF에는 자체 버전의 FreeRTOS 커널이 구성 요소로 통합되어 있으므로 Amazon FreeRTOS에는 FreeRTOS 커널이 제거된 사용자 지정 버전의 ESP-IDF v4.2가 포함되어 있습니다. 그러므로 컴파일할 때 파일이 중복되는 문제가 해결됩니다. Amazon FreeRTOS에 포함된 ESP-IDF v4.2의 사용자 지정 버전을 사용하려면 호스트 시스템의 운영 체제에 따라 아래 지침을 따릅니다.

   **Windows**

   1. ESP-IDF의 Windows용 [범용 온라인 설치 관리자](https://dl.espressif.com/dl/esp-idf/?idf=4.2)를 다운로드합니다.

   1. **범용 온라인 설치 관리자**를 실행합니다.

   1. **ESP-IDF 다운로드 또는 사용** 단계에 도달하면 **기존 ESP-IDF 디렉터리 사용**을 선택하고 **기존 ESP-IDF 디렉터리 선택**을 `{{freertos}}/vendors/espressif/esp-idf`로 설정합니다.

   1. 설치를 완료합니다.

   **macOS**

   1. [Standard Setup of Toolchain prerequisites (ESP-IDF v4.2) for macOS](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/get-started/macos-setup.html)의 지침을 따릅니다.
**중요**  
**다음 단계**의 ‘ESP-IDF 가져오기’ 지침에 도달하면 여기서 멈추고 이 페이지의 지침으로 돌아옵니다.

   1. 명령줄 창을 엽니다.

   1. FreeRTOS 다운로드 디렉터리로 이동한 후, 다음 스크립트를 실행하여 플랫폼에 해당하는 espressif 도구 체인을 다운로드하고 설치합니다.

      ```
      vendors/espressif/esp-idf/install.sh
      ```

   1. 다음 명령을 사용하여 터미널 경로에 ESP-IDF 도구 체인 도구를 추가합니다.

      ```
      source vendors/espressif/esp-idf/export.sh
      ```

   **Linux**

   1. [Standard Setup of Toolchain prerequisites (ESP-IDF v4.2) for Linux](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/get-started/linux-setup.html)의 지침을 따릅니다.
**중요**  
**다음 단계**의 ‘ESP-IDF 가져오기’ 지침에 도달하면 여기서 멈추고 이 페이지의 지침으로 돌아옵니다.

   1. 명령줄 창을 엽니다.

   1. FreeRTOS 다운로드 디렉터리로 이동한 후, 다음 스크립트를 실행하여 플랫폼에 해당하는 Espressif 도구 체인을 다운로드하고 설치합니다.

      ```
      vendors/espressif/esp-idf/install.sh
      ```

   1. 다음 명령을 사용하여 터미널 경로에 ESP-IDF 도구 체인 도구를 추가합니다.

      ```
      source vendors/espressif/esp-idf/export.sh
      ```

1. **직렬 연결 설정.**

   1. 호스트 시스템과 ESP32-DevKitC 사이에 직렬 연결을 설정하려면 CP210x USB to UART Bridge VCP 드라이버를 설치해야 합니다. [Silicon Labs](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)에서 이러한 드라이버를 다운로드할 수 있습니다.

      호스트 시스템과 ESP32-WROVER-KIT 사이에 직렬 연결을 설정하려면 FTDI 가상 COM 포트 드라이버를 설치해야 합니다. [FTDI](https://www.ftdichip.com/Drivers/VCP.htm)에서 이 드라이버를 다운로드할 수 있습니다.

   1. [Establish Serial Connection with ESP32](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/get-started/establish-serial-connection.html) 단계를 따릅니다.

   1. 직렬 연결을 설정한 후 보드의 연결을 위한 직렬 포트를 기록해 두십시오. 데모를 플래시하는 데 필요합니다.

### FreeRTOS 데모 애플리케이션 구성
<a name="configure-demos-espressif-idf42"></a>

이 자습서의 경우 FreeRTOS 구성 파일은 `{{freertos}}/vendors/espressif/boards/{{board-name}}/aws_demos/config_files/FreeRTOSConfig.h`에 있습니다. (예를 들어, `AFR_BOARD espressif.esp32_devkitc`를 선택하면 구성 파일은 `{{freertos}}/vendors/espressif/boards/esp32/aws_demos/config_files/FreeRTOSConfig.h`에 있습니다.) 

1. macOS 또는 Linux를 실행하는 경우 터미널 프롬프트를 엽니다. Windows를 실행 중인 경우 'ESP-IDF 4.x CMD' 앱(ESP-IDF 도구 체인을 설치할 때 이 옵션을 포함한 경우)을 열고, 그렇지 않으면 '명령 프롬프트' 앱을 엽니다.

1. Python3이 설치되어 있는지 확인하려면 다음을 실행합니다.

   ```
   python --version
   ```

   설치된 버전이 표시됩니다. Python 3.0.1 이상이 설치되어 있지 않으면 [Python](https://www.python.org/downloads/) 웹 사이트에서 설치할 수 있습니다.

1.  AWS IoT 명령을 실행하려면 AWS 명령줄 인터페이스(CLI)가 필요합니다. Windows를 실행하는 경우 `easy_install awscli` 명령을 사용하여 "Command" 또는 "ESP-IDF 4.x CMD" 앱에 AWS CLI를 설치합니다.

   macOS 또는 Linux를 실행하는 경우 [AWS CLI 설치를 참조하세요](https://docs.aws.amazon.com/cli/latest/userguide/installing.html).

1. 실행

   ```
   aws configure
   ```

   액세스 키 ID, 보안 AWS 액세스 키 및 기본 AWS 리전을 사용하여 AWS CLI를 구성합니다. 자세한 내용은 [AWS CLI 구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)을 참조하세요.

1. 다음 명령을 사용하여 AWS SDK for Python(boto3)을 설치합니다.
   + Windows에서는 'Command' 또는 'ESP-IDF 4.x CMD' 앱에서 다음을 실행합니다.

     ```
     pip install boto3 --user
     ```
**참고**  
자세한 내용은 [Boto3 설명서](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)를 참조하세요.
   + macOS 또는 Linux에서는 다음을 실행합니다.

     ```
     pip install tornado nose --user
     ```

     계속해서 다음을 실행합니다.

     ```
     pip install boto3 --user
     ```

   FreeRTOS에는 AWS IoT에 연결하기 위해 Espressif 보드를 더 쉽게 설정할 수 있게 해주는 `SetupAWS.py` 스크립트가 포함되어 있습니다. 스크립트를 구성하려면 `{{freertos}}/tools/aws_config_quick_start/configure.json`을 열고 다음 속성을 설정합니다.  
**`afr_source_dir`**  
컴퓨터에서 `{{freertos}}` 디렉터리의 전체 경로입니다. 이 경로를 지정하기 위해 슬래시를 사용하고 있는지 확인합니다.  
**`thing_name`**  
보드를 나타내는 AWS IoT 사물에 할당하려는 이름입니다.  
**`wifi_ssid`**  
Wi-Fi 네트워크의 SSID입니다.  
**`wifi_password`**  
Wi-Fi 네트워크의 암호입니다.  
**`wifi_security`**  
Wi-Fi 네트워크의 보안 유형입니다.  
유효한 보안 유형은 다음과 같습니다.  
   + `eWiFiSecurityOpen`(열림, 보안 없음)
   + `eWiFiSecurityWEP`(WEP 보안)
   + `eWiFiSecurityWPA`(WPA 보안)
   + `eWiFiSecurityWPA2`(WPA2 보안)

1. 구성 스크립트를 실행합니다.

   1. macOS 또는 Linux를 실행하는 경우 터미널 프롬프트를 엽니다. Windows를 실행 중인 경우 'Command' 또는 'ESP-IDF 4.x CMD' 앱을 엽니다.

   1. `{{freertos}}/tools/aws_config_quick_start` 디렉터리로 이동하여 다음을 실행합니다.

      ```
      python SetupAWS.py setup
      ```

       스크립트는 다음 작업을 수행합니다.
      + IoT 사물, 인증서 및 정책을 생성합니다.
      + 이 스크립트는 IoT 정책을 인증서에 연결하고 인증서를 AWS IoT 사물에 연결합니다.
      + `aws_clientcredential.h` 파일을 AWS IoT 엔드포인트, Wi-Fi SSID 및 보안 인증 정보로 채웁니다.
      + 인증서와 프라이빗 키에 형식을 지정하고 `aws_clientcredential_keys.h` 헤더 파일에 기록합니다.
**참고**  
인증서는 데모 용도로만 하드 코딩됩니다. 프로덕션 수준 애플리케이션은 이러한 파일을 보안 위치에 저장해야 합니다.

      `SetupAWS.py`에 대한 자세한 내용은 `{{freertos}}/tools/aws_config_quick_start` 디렉터리의 `README.md` 파일을 참조하세요.

### 클라우드에서 MQTT 메시지 모니터링
<a name="gsg-espressif-monitor-mqtt"></a>

FreeRTOS 데모 프로젝트를 실행하기 전에 AWS IoT 콘솔에서 MQTT 클라이언트를 설정하여 디바이스가 AWS 클라우드로 보내는 메시지를 모니터링할 수 있습니다.

**MQTT 클라이언트를 사용하여 AWS IoT MQTT 주제를 구독하려면**

1. [AWS IoT 콘솔](https://console.aws.amazon.com/iotv2/)로 이동합니다.

1. 탐색 창에서 **테스트**를 선택하고 **MQTT 테스트 클라이언트**를 선택합니다.

1. **구독 주제**에 `{{your-thing-name}}/example/topic`을 입력한 다음 **주제 구독**을 선택합니다.

데모 프로젝트가 디바이스에서 성공적으로 실행되면 ‘Hello World\!’가 구독한 주제로 여러 번 전송된 것을 볼 수 있습니다.

### idf.py 스크립트를 사용하여 FreeRTOS 데모 프로젝트 빌드, 플래시 및 실행
<a name="build-and-run-example-espressif-idf42"></a>

Espressif의 IDF 유틸리티(`idf.py`)를 사용하여 프로젝트를 빌드하고 바이너리를 디바이스에 플래시할 수 있습니다.

**참고**  
다음 예제와 같이 일부 설정에서는 `idf.py`에서 포트 옵션 `"-p port-name"`을 사용하여 올바른 포트를 지정해야 할 수도 있습니다.  

```
idf.py -p /dev/cu.usbserial-00101301B flash
```

**Windows, Linux 및 macOS에서 FreeRTOS 빌드 및 플래시(ESP-IDF v4.2)**

1. FreeRTOS 다운로드 디렉터리의 루트로 이동합니다.

1. 명령줄 창에서 다음 명령을 입력하여 ESP-IDF 도구를 터미널의 경로에 추가합니다.  
**Windows('Command' 앱)**  

   ```
   vendors\espressif\esp-idf\export.bat
   ```  
**Windows('ESP-IDF 4.x CMD' 앱)**  
(앱을 열었을 때 이미 완료되었습니다.)  
**Linux/macOS**  

   ```
   source vendors/espressif/esp-idf/export.sh
   ```

1. `build` 디렉터리에서 cmake를 구성하고 다음 명령을 사용하여 펌웨어 이미지를 빌드합니다.

   ```
   idf.py -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 build
   ```

   그러면 다음과 같은 결과가 표시됩니다.

   ```
      Running cmake in directory /path/to/hello_world/build
      Executing "cmake -G Ninja --warn-uninitialized /path/to/hello_world"...
      Warn about uninitialized values.
      -- Found Git: /usr/bin/git (found version "2.17.0")
      -- Building empty aws_iot component due to configuration
      -- Component names: ...
      -- Component paths: ...
   
      ... (more lines of build system output)
   
      [527/527] Generating hello-world.bin
      esptool.py v2.3.1
   
      Project build complete. To flash, run this command:
      ../../../components/esptool_py/esptool/esptool.py -p (PORT) -b 921600 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x10000 build/hello-world.bin  build 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin
      or run 'idf.py -p PORT flash'
   ```

   오류가 없는 경우 빌드는 펌웨어 바이너리 .bin 파일을 생성합니다.

1. 다음 명령을 사용하여 개발 보드의 플래시 메모리를 지웁니다.

   ```
   idf.py erase_flash
   ```

1. `idf.py` 스크립트를 사용하여 애플리케이션 바이너리를 보드에 플래시합니다.

   ```
   idf.py flash
   ```

1. 다음 명령을 사용하여 보드의 직렬 포트 출력을 모니터링합니다.

   ```
   idf.py monitor
   ```
**참고**  
다음 예제와 같이 이들 명령을 결합할 수 있습니다.  

   ```
   idf.py erase_flash flash monitor
   ```

   특정 호스트 시스템 설정의 경우 다음 예제와 같이 보드를 플래시할 때 포트를 지정해야 합니다.

   ```
   idf.py erase_flash flash monitor -p /dev/ttyUSB1
   ```

### CMake를 사용하여 FreeRTOS 빌드 및 플래시
<a name="flash-espressif-cmake-idf42"></a>

IDF SDK에서 제공하는 `idf.py` 스크립트를 사용하여 코드를 빌드하고 실행하는 방법 외에도 CMake를 사용하여 프로젝트를 빌드할 수도 있습니다. 현재는 Unix Makefile 또는 Ninja 빌드 시스템을 지원합니다.

**프로젝트를 빌드하고 플래시하려면**

1. 명령줄 창에서 FreeRTOS 다운로드 디렉터리의 루트로 이동합니다.

1. 다음 스크립트를 실행하여 ESP-IDF 도구를 쉘의 경로에 추가합니다.  
**Windows**  

   ```
   vendors\espressif\esp-idf\export.bat
   ```  
**Linux/macOS**  

   ```
   source vendors/espressif/esp-idf/export.sh
   ```

1. 다음 명령을 입력하여 빌드 파일을 생성합니다.  
**Unix Makefile 사용**  

   ```
   cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -S . -B ./YOUR_BUILD_DIRECTORY -DAFR_ENABLE_ALL_MODULES=1 -DAFR_ENABLE_TESTS=0
   ```  
**Ninja 사용**  

   ```
   cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -S . -B ./YOUR_BUILD_DIRECTORY -DAFR_ENABLE_ALL_MODULES=1 -DAFR_ENABLE_TESTS=0 -GNinja
   ```

1. 프로젝트를 빌드합니다.  
**Unix Makefile 사용**  

   ```
   make -C ./YOUR_BUILD_DIRECTORY -j8 
   ```  
**Ninja 사용**  

   ```
   ninja -C ./YOUR_BUILD_DIRECTORY -j8
   ```

1. 플래시를 지운 다음 보드를 플래시합니다.  
**Unix Makefile 사용**  

   ```
   make -C ./YOUR_BUILD_DIRECTORY erase_flash
   ```

   ```
   make -C ./YOUR_BUILD_DIRECTORY flash
   ```  
**Ninja 사용**  

   ```
   ninja -C ./YOUR_BUILD_DIRECTORY erase_flash
   ```

   ```
   ninja -C ./YOUR_BUILD_DIRECTORY flash
   ```

## Bluetooth Low-Energy 데모 실행
<a name="espressif-run-ble"></a>

FreeRTOS는 [블루투스 로우 에너지 라이브러리](freertos-ble-library.md) 연결을 지원합니다.

Bluetooth Low Energy에서 FreeRTOS 데모 프로젝트를 실행하려면 iOS 또는 Android 모바일 디바이스에서 FreeRTOS Bluetooth Low Energy Mobile SDK 데모 애플리케이션을 실행해야 합니다.

**FreeRTOS Bluetooth Low Energy Mobile SDK 데모 애플리케이션을 설정하려면**

1. [FreeRTOS 블루투스 디바이스용 모바일 SDK](freertos-ble-mobile.md)의 지침에 따라 모바일 플랫폼용 SDK를 다운로드하여 호스트 컴퓨터에 설치합니다.

1. [FreeRTOS 블루투스 로우 에너지 모바일 SDK 데모 애플리케이션](ble-demo.md#ble-sdk-app)의 지침에 따라 모바일 디바이스에서 데모 모바일 애플리케이션을 설정합니다.

보드에서 MQTT over Bluetooth Low Energy 데모를 실행하는 방법에 대한 자세한 내용은 [MQTT over 블루투스 로우 에너지](ble-demo.md#ble-demo-mqtt)를 참조하세요.

보드에서 Wi-Fi 프로비저닝 데모를 실행하는 방법에 대한 자세한 내용은 [Wi-Fi 프로비저닝](ble-demo.md#ble-demo-wifi)을 참조하세요.

## ESP32를 위한 자체 CMake 프로젝트에서 FreeRTOS 사용
<a name="getting_started_espressif_cmake_project"></a>

자체 CMake 프로젝트에서 FreeRTOS를 사용하려면 하위 디렉터리로 설정하고 애플리케이션과 함께 빌드할 수 있습니다. 먼저 [GitHub](https://github.com/aws/amazon-freertos)에서 FreeRTOS의 사본을 가져옵니다. 다음 명령을 사용하여 Git 하위 모듈로 설정할 수도 있습니다, 그러면 나중에 업데이트하기가 더 쉽습니다.

```
git submodule add -b release https://github.com/aws/amazon-freertos.git freertos
```

최신 버전이 릴리스된 경우 다음 명령을 사용하여 로컬 복사본을 업데이트할 수 있습니다.

```
# Pull the latest changes from the remote tracking branch.
git submodule update --remote -- freertos
```

```
# Commit the submodule change because it is pointing to a different revision now.
git add freertos
```

```
git commit -m "Update FreeRTOS to a new release"
```

프로젝트에 다음과 같은 디렉터리 구조가 있는 경우 

```
- freertos (the copy that you obtained from GitHub or the AWS IoT console)
- src
  - main.c (your application code)
- CMakeLists.txt
```

다음은 FreeRTOS와 함께 애플리케이션을 빌드하는 데 사용할 수 있는 최상위 `CMakeLists.txt` 파일의 예제입니다.

```
cmake_minimum_required(VERSION 3.13)

project(freertos_examples)

# Tell IDF build to link against this target.
set(IDF_EXECUTABLE_SRCS "<complete_path>/src/main.c")
set(IDF_PROJECT_EXECUTABLE my_app)

# Add FreeRTOS as a subdirectory. AFR_BOARD tells which board to target.
set(AFR_BOARD espressif.esp32_devkitc CACHE INTERNAL "")
add_subdirectory(freertos)

# Link against the mqtt library so that we can use it. Dependencies are transitively
# linked.
target_link_libraries(my_app PRIVATE AFR::core_mqtt)
```

프로젝트를 빌드하려면 다음 CMake 명령을 실행합니다. ESP32 컴파일러가 PATH 환경 변수에 있는지 확인하십시오.

```
cmake -S . -B build-directory -DCMAKE_TOOLCHAIN_FILE=freertos/tools/cmake/toolchains/xtensa-esp32.cmake -GNinja 
```

```
cmake --build build-directory 
```

애플리케이션을 보드에 플래시하려면 다음 명령을 실행합니다.

```
cmake --build build-directory --target flash 
```

### FreeRTOS의 구성 요소 사용
<a name="getting_started_espressif_cmake_project_components"></a>

CMake를 실행한 후에는 요약 출력에서 사용 가능한 모든 구성 요소를 찾을 수 있습니다. 다음 예제와 비슷합니다.

```
====================Configuration for FreeRTOS====================
  Version:                 202107.00
  Git version:             202107.00-g79ad6defb

Target microcontroller:
  vendor:                  Espressif
  board:                   ESP32-DevKitC
  description:             Development board produced by Espressif that comes in two
                           variants either with ESP-WROOM-32 or ESP32-WROVER module
  family:                  ESP32
  data ram size:           520KB
  program memory size:     4MB

Host platform:
  OS:                      Linux-4.15.0-66-generic
  Toolchain:               xtensa-esp32
  Toolchain path:          /opt/xtensa-esp32-elf
  CMake generator:         Ninja

FreeRTOS modules:
  Modules to build:        backoff_algorithm, common, common_io, core_http,
                           core_http_demo_dependencies, core_json, core_mqtt,
                           core_mqtt_agent, core_mqtt_agent_demo_dependencies,
                           core_mqtt_demo_dependencies, crypto, defender, dev_mode_key_
                           provisioning, device_defender, device_defender_demo_
                           dependencies, device_shadow, device_shadow_demo_dependencies,
                           freertos_cli_plus_uart, freertos_plus_cli, greengrass,
                           http_demo_helpers, https, jobs, jobs_demo_dependencies,
                           kernel, logging, mqtt, mqtt_agent_interface, mqtt_demo_
                           helpers, mqtt_subscription_manager, ota, ota_demo_
                           dependencies, ota_demo_version, pkcs11, pkcs11_helpers,
                           pkcs11_implementation, pkcs11_utils, platform, secure_sockets,
                           serializer, shadow, tls, transport_interface_secure_sockets,
                           wifi
  Enabled by user:         common_io, core_http_demo_dependencies, core_json,
                           core_mqtt_agent_demo_dependencies, core_mqtt_demo_
                           dependencies, defender, device_defender, device_defender_demo_
                           dependencies, device_shadow, device_shadow_demo_dependencies,
                           freertos_cli_plus_uart, freertos_plus_cli, greengrass, https,
                           jobs, jobs_demo_dependencies, logging, ota_demo_dependencies,
                           pkcs11, pkcs11_helpers, pkcs11_implementation, pkcs11_utils,
                           platform, secure_sockets, shadow, wifi
  Enabled by dependency:   backoff_algorithm, common, core_http, core_mqtt,
                           core_mqtt_agent, crypto, demo_base, dev_mode_key_provisioning,
                           freertos, http_demo_helpers, kernel, mqtt, mqtt_agent_
                           interface, mqtt_demo_helpers, mqtt_subscription_manager, ota,
                           ota_demo_version, pkcs11_mbedtls, serializer, tls,
                           transport_interface_secure_sockets, utils
  3rdparty dependencies:   jsmn, mbedtls, pkcs11, tinycbor
  Available demos:         demo_cli_uart, demo_core_http, demo_core_mqtt, demo_core_mqtt_
                           agent, demo_device_defender, demo_device_shadow,
                           demo_greengrass_connectivity, demo_jobs, demo_ota_core_http,
                           demo_ota_core_mqtt, demo_tcp
  Available tests:
=========================================================================
```

`Modules to build` 목록에서 모든 구성 요소를 참조할 수 있습니다. 애플리케이션에 연결하려면 이름 앞에 `AFR::` 네임스페이스를 추가합니다(예: `AFR::core_mqtt`, `AFR::ota`, 등).

### ESP-IDF를 사용하여 사용자 지정 구성 요소 추가
<a name="getting_started_espressif_cmake_project_espidf"></a>

ESP-IDF를 사용하는 동안 더 많은 구성 요소를 추가할 수 있습니다. 예를 들어, `example_component`라는 구성 요소를 추가하려는 경우 프로젝트는 다음과 같습니다.

```
- freertos
- components
  - example_component
    - include
      - example_component.h
    - src
      - example_component.c
    - CMakeLists.txt
- src
  - main.c
- CMakeLists.txt
```

다음은 구성 요소에 대한 `CMakeLists.txt` 파일 예제입니다.

```
add_library({{example_component}} {{src/example_component.c}})
target_include_directories({{example_component}} PUBLIC include)
```

그런 다음 최상위 `CMakeLists.txt` 파일에서 `add_subdirectory(freertos)` 바로 뒤에 다음 줄을 삽입하여 구성 요소를 추가합니다.

```
add_subdirectory({{component/example_component}}) 
```

그런 다음 구성 요소를 포함하도록 `target_link_libraries`를 수정합니다.

```
target_link_libraries(my_app PRIVATE AFR::core_mqtt PRIVATE {{example_component}}) 
```

이 구성 요소는 이제 기본적으로 애플리케이션 코드에 자동 연결됩니다. 이제 헤더 파일을 포함하고 구성 요소가 정의하는 함수를 직접 호출할 수 있습니다.

### FreeRTOS 구성 재정의
<a name="getting_started_espressif_cmake_project_override"></a>

현재 FreeRTOS 소스 트리 외부에서 구성을 재정의하기 위한 잘 정의된 접근 방식은 없습니다. 기본적으로 CMake는 `{{freertos}}/vendors/espressif/boards/esp32/aws_demos/config_files/` 및 `{{freertos}}/demos/include/` 디렉터리를 찾습니다. 그러나 해결 방법을 사용하여 컴파일러가 다른 디렉터리를 먼저 검색하도록 지시할 수 있습니다. 예를 들어, FreeRTOS 구성에 다른 폴더를 추가할 수 있습니다.

```
- freertos
- freertos-configs
  - aws_clientcredential.h
  - aws_clientcredential_keys.h
  - iot_mqtt_agent_config.h
  - iot_config.h
- components
- src
- CMakeLists.txt
```

`freertos-configs`의 파일은 `{{freertos}}/vendors/espressif/boards/esp32/aws_demos/config_files/` 및 `{{freertos}}/demos/include/` 디렉터리에서 복사됩니다. 그런 다음 최상위 `CMakeLists.txt` 파일에서 컴파일러가 이 디렉터리를 먼저 검색하도록 `add_subdirectory(freertos)` 앞에 이 줄을 추가합니다.

```
include_directories(BEFORE freertos-configs)
```

### ESP-IDF를 위한 자체 sdkconfig 제공
<a name="getting_started_espressif_providing_sdkconfig"></a>

자체 `sdkconfig.default`를 제공하려는 경우 명령줄에서 CMake 변수 `IDF_SDKCONFIG_DEFAULTS`를 설정할 수 있습니다.

```
cmake -S . -B build-directory -DIDF_SDKCONFIG_DEFAULTS=path_to_your_sdkconfig_defaults -DCMAKE_TOOLCHAIN_FILE=freertos/tools/cmake/toolchains/xtensa-esp32.cmake -GNinja 
```

자체 `sdkconfig.default` 파일에 대한 위치를 지정하지 않으면 FreeRTOS가 `{{freertos}}/vendors/espressif/boards/esp32/aws_demos/sdkconfig.defaults`에 위치한 기본 파일을 사용합니다.

자세한 내용은 Espressif *API Reference*의 [Project Configuration](https://docs.espressif.com/projects/esp-idf/en/v4.2-beta1/esp32s2/api-reference/kconfig.html)을 참조하세요. 성공적으로 컴파일한 후 문제가 발생하는 경우 해당 페이지의 [Deprecated options and their replacements](https://docs.espressif.com/projects/esp-idf/en/v4.2-beta1/esp32s2/api-reference/kconfig.html#deprecated-options-and-their-replacements) 섹션을 참조하세요.

### 요약
<a name="getting_started_espressif_cmake_project_summary"></a>

`example_component`라는 구성 요소가 있는 프로젝트에서 일부 구성을 재정의하려는 경우 여기에 최상위 `CMakeLists.txt` 파일의 전체 예는 다음과 같습니다.

```
cmake_minimum_required(VERSION 3.13)

project(freertos_examples)

set(IDF_PROJECT_EXECUTABLE my_app)
set(IDF_EXECUTABLE_SRCS "src/main.c")

# Tell IDF build to link against this target.
set(IDF_PROJECT_EXECUTABLE my_app)

# Add some extra components. IDF_EXTRA_COMPONENT_DIRS is a variable used by ESP-IDF
# to collect extra components.
get_filename_component(
    EXTRA_COMPONENT_DIRS
    "components/example_component" ABSOLUTE
)
list(APPEND IDF_EXTRA_COMPONENT_DIRS ${EXTRA_COMPONENT_DIRS})

# Override the configurations for FreeRTOS.
include_directories(BEFORE freertos-configs)

# Add FreeRTOS as a subdirectory. AFR_BOARD tells which board to target.
set(AFR_BOARD espressif.esp32_devkitc CACHE INTERNAL "")
add_subdirectory(freertos)

# Link against the mqtt library so that we can use it. Dependencies are transitively
# linked.
target_link_libraries(my_app PRIVATE AFR::core_mqtt)
```

## 문제 해결
<a name="getting_started_espressif_troubleshooting"></a>
+ macOS를 실행하는데 운영 체제에서 ESP-WROVER-KIT를 인식하지 못하면 D2XX 드라이버가 설치되어 있지 않은지 확인합니다. 이를 제거하려면 [macOS X용 FTDI 드라이버 설치 가이드](http://www.ftdichip.com/Support/Documents/AppNotes/AN_134_FTDI_Drivers_Installation_Guide_for_MAC_OSX.pdf)의 지침을 따르십시오.
+ ESP-IDF에서 제공하는 모니터 유틸리티(make 모니터를 사용하여 간접 호출)를 사용하면 주소를 디코딩할 수 있습니다. 이러한 이유로 이 유틸리티는 애플리케이션이 작동을 멈추는 경우 의미 있는 역추적을 얻는 데 도움이 될 수 있습니다. 자세한 내용은 Espressif 웹사이트의 [Automatic Address Decoding](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/api-guides/tools/idf-monitor.html#automatic-address-decoding)을 참조하세요.
+ 특수 JTAG 하드웨어를 사용할 필요 없이 gdb와 통신하기 위해 GDBstub를 활성화할 수도 있습니다. 자세한 내용은 Espressif 웹사이트의 [Launching GDB with GDBStub](https://docs.espressif.com/projects/esp-idf/en/release-v4.2/esp32/api-guides/tools/idf-monitor.html#launching-gdb-with-gdbstub)을 참조하세요.
+ JTAG 하드웨어 기반 디버깅이 필요한 경우 OpenOCD 기반 환경 설정에 대한 자세한 내용은 Espressif 웹 사이트의 [JTAG Debugging](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/index.html)을 참조하세요.
+ macOS에서 `pip`를 사용하여 `pyserial`을 설치할 수 없는 경우 [pyserial 웹 사이트](https://pypi.org/simple/pyserial)에서 다운로드합니다.
+ 보드가 연속적으로 재설정되는 경우 터미널에 다음 명령을 입력하여 플래시를 지워 봅니다.

  ```
  make erase_flash
  ```
+ `idf_monitor.py`를 실행할 때 오류가 나타나는 경우 Python 2.7을 사용합니다.
+ ESP-IDF의 필수 라이브러리는 FreeRTOS에 포함되어 있으므로 외부에서 다운로드할 필요가 없습니다. `IDF_PATH` 환경 변수가 설정된 경우 FreeRTOS를 빌드하기 전에 제거하는 것이 좋습니다.
+ Window에서 프로젝트를 빌드하려면 3-4분 정도 걸릴 수 있습니다. make 명령에서 `-j4` 스위치를 사용하여 빌드 시간을 줄일 수 있습니다.

  ```
  make flash monitor -j4
  ```
+ 디바이스에 연결하는 데 문제가 있는 경우 `aws_clientcredential.h` 파일을 AWS IoT열고 구성 변수가 파일에 올바르게 정의되어 있는지 확인합니다.는와 같아`clientcredentialMQTT_BROKER_ENDPOINT[]`야 합니다`1234567890123-ats.iot.us-east-1.amazonaws.com`.
+ [ESP32를 위한 자체 CMake 프로젝트에서 FreeRTOS 사용](#getting_started_espressif_cmake_project)의 단계를 따르고 링커에서 정의되지 않은 참조 오류가 표시되는 경우 일반적으로 종속 라이브러리 또는 데모가 누락되어 발생합니다. 이를 추가하려면 표준 CMake 함수 `target_link_libraries`를 사용하여 루트 디렉터리 아래의 `CMakeLists.txt` 파일을 업데이트합니다.
+ ESP-IDF v4.2는 *xtensa\\-esp32\\-elf\\-gcc 8\\.2\\.0\\.* 도구 체인 사용을 지원합니다. 이전 버전의 Xtensa 도구 체인을 사용하는 경우 필요한 버전을 다운로드하세요.
+ ESP-IDF v4.2에서 충족되지 않는 python 종속성 때문에 다음과 같은 오류 로그가 표시되는 경우

  ```
  The following Python requirements are not satisfied:
    click>=5.0
    pyserial>=3.0
    future>=0.15.2
    pyparsing>=2.0.3,<2.4.0
    pyelftools>=0.22
    gdbgui==0.13.2.0
    pygdbmi<=0.9.0.2
    reedsolo>=1.5.3,<=1.5.4
    bitstring>=3.1.6
    ecdsa>=0.16.0
    Please follow the instructions found in the "Set up the tools" section of ESP-IDF Getting Started Guide
  ```

  다음 Python 명령을 사용하여 플랫폼에 python 종속성을 설치합니다.

  ```
  root/vendors/espressif/esp-idf/requirements.txt
  ```

문제 해결에 대한 자세한 정보는 [시작하기 문제 해결](gsg-troubleshooting.md) 섹션을 참조하세요.

## 디버깅
<a name="getting_started_espressif_debugging"></a>

### Espressif ESP32-DevKitC 및 ESP-WROVER-KIT에서 코드 디버깅(ESP-IDF v4.2)
<a name="debugging-espressif-idf42"></a>

이 섹션에서는 ESP-IDF v4.2를 사용하여 Espressif 하드웨어를 디버깅하는 방법을 보여줍니다. JTAG - USB 케이블이 필요합니다. 여기서는 USB-MPSSE 케이블을 사용합니다(예: [FTDI C232HM-DDHSL-0](http://www.ftdichip.com/Products/Cables/USBMPSSE.htm)).

**ESP-DevKitC JTAG 설정**  
FTDI C232HM-DDHSL-0 케이블의 경우 다음은 ESP32 DevkitC에 대한 연결입니다.  

```
| C232HM-DDHSL-0 Wire Color | ESP32 GPIO Pin | JTAG Signal Name |
| ------------------------- | -------------- | ---------------- |
|  Brown (pin 5)            |  IO14          |  TMS             |
|  Yellow (pin 3)           |  IO12          |  TDI             |
|  Black (pin 10)           |  GND           |  GND             |
|  Orange (pin 2)           |  IO13          |  TCK             |
|  Green (pin 4)            |  IO15          |  TDO             |
```

**ESP-WROVER-KIT JTAG 설정**  
FTDI C232HM-DDHSL-0 케이블의 경우 다음은 ESP32-WROVER-KIT에 대한 연결입니다.  

```
| C232HM-DDHSL-0 Wire Color | ESP32 GPIO Pin | JTAG Signal Name |
| ------------------------- | -------------- | ---------------- |
|  Brown (pin 5)            |  IO14          |  TMS             |
|  Yellow (pin 3)           |  IO12          |  TDI             |
|  Orange (pin 2)           |  IO13          |  TCK             |
|  Green (pin 4)            |  IO15          |  TDO             |
```
이러한 테이블은 [ FTDI C232HM-DDHSL-0 데이터시트](https://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_C232HM_MPSSE_CABLE.pdf)에서 개발되었습니다. 자세한 내용은 데이터시트에서 ‘C232HM MPSSE Cable Connection and Mechanical Details’ 섹션을 참조하세요.  
ESP-WROVER-KIT에서 JTAG를 활성화하려면 TMS, TDO, TDI, TCK, and S\_TDI 핀의 점퍼를 다음과 같이 배치합니다.  

![점퍼 배치](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/JP8-jumpers.png)


**Windows에서의 디버깅(ESP-IDF v4.2)**  

**Windows에서 디버깅을 설정하려면**

1. [Espressif ESP32-DevKitC 및 ESP-WROVER-KIT에서 코드 디버깅(ESP-IDF v4.2)](#debugging-espressif-idf42)의 설명과 같이 FTDI C232HM-DDHSL-0의 USB 쪽을 컴퓨터 및 다른 쪽에 연결합니다. FTDI C232HM-DDHSL-0 디바이스가 **디바이스 관리자**의 **범용 직렬 버스 컨트롤러**에 나타날 것입니다.

1. 범용 직렬 버스 디바이스 목록에서 **C232HM-DDHSL-0** 디바이스를 마우스 오른쪽 버튼으로 클릭하고 **속성**을 선택합니다.
**참고**  
디바이스가 **USB 직렬 포트**로 나열될 수 있습니다.

   디바이스의 속성을 보려면, 속성 창에서 **세부 정보** 탭을 선택합니다. 디바이스가 나열되지 않는 경우 [FTDI C232HM-DDHSL-0용 Windows 드라이버](http://www.ftdichip.com/Drivers/D2XX.htm)를 설치합니다.

1. **세부 정보** 탭에서 **속성**을 선택한 후 **하드웨어 ID**를 선택합니다. **값** 필드에 다음과 같이 표시되어야 합니다.

   ```
   FTDIBUS\COMPORT&VID_0403&PID_6014
   ```

   이 예에서 공급업체 ID는 0403이고 제품 ID는 6014입니다.

   이러한 ID가 `projects/espressif/esp32/make/aws_demos/esp32_devkitj_v1.cfg`의 ID와 일치하는지 확인합니다. 이 ID는 공급업체 ID 및 제품 ID 뒤에 `ftdi_vid_pid`로 시작하는 줄에서 지정합니다.

   ```
   ftdi_vid_pid 0x0403 0x6014
   ```

1. [Windows용 OpenOCD](https://github.com/espressif/openocd-esp32/releases)를 다운로드합니다.

1. `C:\`에 파일의 압축을 풀고 `C:\openocd-esp32\bin`을 시스템 경로에 추가합니다.

1. OpenOCD에는 libusb가 필요하며, 이 프로그램은 Windows에서 기본적으로 설치되지 않습니다. libusb를 설치하려면

   1. [zadig.exe](https://zadig.akeo.ie)를 다운로드합니다.

   1. `zadig.exe`를 실행합니다. **Options(옵션)** 메뉴에서 **List All Devices(모든 디바이스 나열)**를 선택합니다.

   1. 드롭다운 메뉴에서 **C232HM-DDHSL-0**을 선택합니다.

   1. 녹색 화살표 오른쪽의 대상 드라이버 필드에서 **WinUSB**를 선택합니다.

   1. 대상 드라이버 필드 아래의 목록에서 화살표를 선택한 후 **드라이버 설치**를 선택합니다. **Replace Driver(드라이버 바꾸기)**를 선택합니다.

1. 명령 프롬프트를 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동하여 다음 명령을 실행합니다.

   ```
   idf.py openocd
   ```

   이 명령 프롬프트를 열어 둡니다.

1. 새 명령 프롬프트를 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동하여 다음을 실행합니다.

   ```
   idf.py flash monitor
   ```

1. 또 다른 명령 프롬프트를 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동한 다음 보드에서 데모가 실행되기 시작할 때까지 기다립니다. 데모가 시작되면 다음을 실행합니다.

   ```
   idf.py gdb
   ```

   프로그램이 `main` 기능에서 중지해야 합니다.
**참고**  
ESP32는 최대 2개의 중단점을 지원합니다.

**macOS에서의 디버깅(ESP-IDF v4.2)**  

1. [macOS용 FTDI 드라이버](http://www.ftdichip.com/Drivers/VCP.htm)를 다운로드합니다.

1. [OpenOCD](https://github.com/espressif/openocd-esp32/releases)를 다운로드합니다.

1. 다운로드한 .tar 파일의 압축을 풀고 `.bash_profile`에서 경로를 `OCD_INSTALL_DIR/openocd-esp32/bin`으로 설정합니다.

1. 다음 명령을 사용하여 `libusb`를 macOS에 설치합니다.

   ```
   brew install libusb
   ```

1. 다음 명령을 사용하여 직렬 포트 드라이버를 언로드합니다.

   ```
   sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
   ```

1. 다음 명령을 사용하여 직렬 포트 드라이버를 언로드합니다.

   ```
   sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
   ```

1. macOS 버전 10.9 이상을 실행하는 경우 다음 명령을 사용하여Apple의 FTDI 드라이버를 언로드합니다.

   ```
   sudo kextunload -b com.apple.driver.AppleUSBFTDI
   ```

1. 다음 명령을 사용하여 FTDI 케이블의 제품 ID와 공급업체 ID를 가져옵니다. 연결된 USB 디바이스가 나열됩니다.

   ```
   system_profiler SPUSBDataType
   ```

   `system_profiler`의 출력은 다음과 같습니다.

   ```
      DEVICE:
   
      Product ID: product-ID
      Vendor ID: vendor-ID (Future Technology Devices International Limited)
   ```

1. `projects/espressif/esp32/make/aws_demos/esp32_devkitj_v1.cfg` 파일을 엽니다. 디바이스의 공급업체 ID 및 제품 ID는 `ftdi_vid_pid`로 시작하는 줄에서 지정합니다. 이전 단계에서 출력한 `system_profiler`의 ID와 일치하도록 ID를 변경합니다.

1. 터미널 창을 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동한 후 다음 명령을 사용하여 OpenOCD를 실행합니다.

   ```
   idf.py openocd
   ```

   이 터미널 창을 열어 둡니다.

1. 새 터미널을 열고 다음 명령을 사용하여 FTDI 직렬 포트 드라이버를 로드합니다.

   ```
   sudo kextload -b com.FTDI.driver.FTDIUSBSerialDriver
   ```

1. FreeRTOS 다운로드 디렉터리의 루트로 이동하여 다음을 실행합니다.

   ```
   idf.py flash monitor
   ```

1. 또 다른 터미널을 새로 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동하여 다음을 실행합니다.

   ```
   idf.py gdb
   ```

   프로그램이 `main`에서 중지해야 합니다.

**Linux에서의 디버깅(ESP-IDF v4.2)**  

1. [OpenOCD](https://github.com/espressif/openocd-esp32/releases)를 다운로드합니다. tarball의 압축을 풀고 readme 파일의 설치 지침을 따릅니다.

1. 다음 명령을 사용하여 libusb를 Linux에 설치합니다.

   ```
   sudo apt-get install libusb-1.0
   ```

1. 터미널을 열고 **ls -l /dev/ttyUSB\***를 입력하여 컴퓨터에 연결된 모든 USB 디바이스를 나열합니다. 이 단계는 보드의 USB 포트가 운영 체제에서 인식되는지 확인하는 데 도움이 됩니다. 그러면 다음과 같은 결과가 표시됩니다.

   ```
      $ls -l /dev/ttyUSB*
      crw-rw----    1    root    dialout    188,    0    Jul    10    19:04    /dev/ttyUSB0
      crw-rw----    1    root    dialout    188,    1    Jul    10    19:04    /dev/ttyUSB1
   ```

1. 로그오프했다가 다시 로그인하고 전원을 껐다가 다시 켜서 보드에 변경 사항을 적용합니다. 터미널 프롬프트에서 USB 디바이스를 나열합니다. 그룹 소유자가 `dialout`을 `plugdev`로 변경했는지 확인합니다.

   ```
      $ls -l /dev/ttyUSB*
      crw-rw----    1    root    plugdev    188,    0    Jul    10    19:04    /dev/ttyUSB0
      crw-rw----    1    root    plugdev    188,    1    Jul    10    19:04    /dev/ttyUSB1
   ```

   더 낮은 숫자의 `/dev/ttyUSBn` 인터페이스가 JTAG 통신에 사용됩니다. 다른 인터페이스는 ESP32의 직렬 포트(UART)로 라우팅되며 코드를 ESP32의 플래시 메모리에 업로드하는 데 사용됩니다.

1. 터미널 창에서 FreeRTOS 다운로드 디렉터리의 루트로 이동하고 다음 명령을 사용하여 OpenOCD를 실행합니다.

   ```
   idf.py openocd 
   ```

1. 또 다른 터미널을 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동하여 다음 명령을 실행합니다.

   ```
   idf.py flash monitor 
   ```

1. 또 다른 터미널을 열고 FreeRTOS 다운로드 디렉터리의 루트로 이동하여 다음 명령을 실행합니다.

   ```
   idf.py gdb
   ```

   프로그램이 `main()`에서 중지되어야 합니다.