자습서: 실시간 지원 애플리케이션 빌드

이 자습서에서는 Azure Sphere 디바이스에서 실시간 코어에 대한 샘플 애플리케이션을 빌드하는 방법을 보여 줍니다. 실시간 지원 애플리케이션에 대한 기본 정보는 Azure Sphere 애플리케이션 개요 를 참조하세요.

이 자습서에서는 다음 방법을 알아봅니다.

  • 샘플 애플리케이션 다운로드
  • GNU Arm 도구 체인 설치
  • 출력을 표시하도록 하드웨어 설정
  • 개발 및 디버깅 사용
  • 터미널 에뮬레이터를 시작하여 출력 보기
  • 실시간 지원 애플리케이션 빌드, 실행 및 디버그

중요

이러한 지침에서는 Seeed Studios의 MT3620 개발 키트와 같은 MT3620 RDB(참조 보드 디자인) 하드웨어를 따르는 하드웨어를 사용하고 있다고 가정합니다. 다른 Azure Sphere 하드웨어를 사용하는 경우 제조업체의 설명서를 참조하여 UART가 노출되었는지 여부와 액세스 방법을 확인합니다. 출력을 다르게 표시하고 다른 UART를 사용하도록 app_manifest.json 파일의 샘플 코드 및 Uarts 필드를 업데이트하도록 하드웨어를 설정해야 할 수 있습니다.

필수 구성 요소

  • Windows용 또는 Linux CMake 및 Ninja를 설치합니다.
  • Windows 또는 Linux Visual Studio Code 설치합니다.
  • Windows용 또는 Linux CMake 및 Ninja를 설치합니다.

샘플 애플리케이션 다운로드

다음과 같이 HelloWorld 애플리케이션을 다운로드할 수 있습니다.

  1. 브라우저에서 Microsoft 샘플 브라우저를 가리킵니다.
  2. Search 상자에 "Azure Sphere"를 입력합니다.
  3. 검색 결과에서 Azure Sphere - 헬로 월드 선택합니다.
  4. ZIP 다운로드를 선택합니다.
  5. 다운로드한 파일을 열고 로컬 디렉터리로 추출합니다.

GNU Arm Embedded Toolchain 설치

Arm 개발자 웹 사이트에서 GNU Arm Embedded Toolchain을 다운로드하여 설치할 수 있습니다. 또는 vcpkg 아티팩트 를 사용하여 개발 환경을 자동으로 설치하고 구성할 수 있습니다.

  • Visual Studio 2022: Visual Studio 2022를 사용하는 경우 Arm 개발자 웹 사이트에서 GNU Arm Embedded Toolchain(arm-none-eabi)을 설치합니다.
  • Visual Studio 2019: Visual Studio 2019의 Visual Studio용 azure-sphere 확장과 함께 도구 체인이 자동으로 설치됩니다. Visual Studio 2019를 사용하는 경우 출력을 표시하도록 하드웨어 설정을 진행합니다. 그러나 GNU Arm Embedded Toolchain을 수동으로 설치한 경우 Visual Studio에서 설치한 버전을 사용합니다.

도구 체인을 설치하려면 Arm 개발자 웹 사이트에서 ARM Cortex-M4 프로세서용 컴파일러가 포함된 GNU Arm Embedded Toolchain(arm-none-eabi)을 찾습니다. 지침에 따라 OS 플랫폼용 컴파일러를 다운로드하고 설치합니다.

기본적으로 Visual Studio Code 도구 체인을 검색하고 설치한 버전을 찾아야 합니다. 도구 체인과 관련된 빌드 문제가 발생하는 경우 다음과 같이 경로를 입력합니다.

  1. 파일>기본 설정>설정>확장명Azure Sphere를 > 선택합니다.
  2. Azure Sphere: Arm Gnu 경로 설정에 GNU Arm Embedded Toolchain 설치 경로를 입력합니다.

도구 체인을 설치하려면 Arm 개발자 웹 사이트에서 ARM Cortex-M4 프로세서용 컴파일러가 포함된 GNU Arm Embedded Toolchain(arm-none-eabi)을 찾습니다. 지침에 따라 OS 플랫폼용 컴파일러를 다운로드하고 설치합니다.

출력을 표시하도록 하드웨어 설정

현재 각 실시간 코어는 TX 전용 UART를 지원합니다. RTApps는 이 UART를 사용하여 디바이스에서 로그 출력을 보낼 수 있습니다. 애플리케이션 개발 및 디버깅 중에는 일반적으로 출력을 읽고 표시하는 방법이 필요합니다. HelloWorld_RTApp_MT3620_BareMetal 샘플은 애플리케이션이 UART에 쓸 수 있는 방법을 보여줍니다.

FTDI Friend와 같은 USB-직렬 어댑터를 사용하여 실시간 코어의 UART를 컴퓨터의 USB 포트에 연결합니다. 또한 출력을 표시하려면 115200-8-N-1 터미널 설정(115200 bps, 8비트, 패리티 비트 없음, 1스톱 비트)을 사용하여 직렬 연결을 설정하려면 터미널 에뮬레이터 가 필요합니다.

RTApp의 출력을 표시하도록 하드웨어를 설정하려면 다음 단계를 수행합니다. 핀 위치를 확인하려면 하드웨어 제조업체의 설명서를 참조해야 합니다. Seeed Studios의 MT3620 개발 키트와 같은 MT3620 RDB(참조 보드 디자인) 하드웨어를 따르는 하드웨어를 사용하는 경우 RDB 인터페이스 헤더 를 살펴보면 핀 위치를 확인하는 데 도움이 될 수 있습니다.

  1. USB-직렬 어댑터의 GND를 개발 키트의 GND에 연결합니다. MT3620 RDB 하드웨어에서 GND는 헤더 3, 핀 2입니다.
  2. USB-직렬 어댑터의 RX를 개발 키트의 IOM4-0 TX에 연결합니다. MT3620 RDB 하드웨어에서 IOM4-0 TX는 헤더 3, 핀 6입니다.
  3. USB-직렬 어댑터를 개발 컴퓨터의 무료 USB 포트에 연결하고 직렬 디바이스가 연결된 포트를 결정합니다. Windows에서 장치 관리자 시작하고컨테이너별 디바이스보기를> 선택하고 'USB UART'를 찾습니다. 예를 들어 FT232R USB UART는 FTDI Friend 어댑터를 나타냅니다.
  4. 터미널 에뮬레이터 프로그램을 시작하고 115200-8-N-1 터미널을 어댑터에서 사용하는 COM 포트로 엽니다. 포트 및 속도를 지정하는 방법을 알아보려면 터미널 에뮬레이터에 대한 설명서를 참조하세요.

출력을 표시하도록 하드웨어 설정

현재 각 실시간 코어는 TX 전용 UART를 지원합니다. RTApps는 이 UART를 사용하여 디바이스에서 로그 출력을 보낼 수 있습니다. 애플리케이션 개발 및 디버깅 중에는 일반적으로 출력을 읽고 표시하는 방법이 필요합니다. HelloWorld_RTApp_MT3620_BareMetal 샘플은 애플리케이션이 UART에 쓸 수 있는 방법을 보여줍니다.

FTDI Friend와 같은 USB-직렬 어댑터를 사용하여 실시간 코어의 UART를 컴퓨터의 USB 포트에 연결합니다. 또한 출력을 표시하려면 115200-8-N-1 터미널 설정(115200 bps, 8비트, 패리티 비트 없음, 1스톱 비트)을 사용하여 직렬 연결을 설정하려면 터미널 에뮬레이터 가 필요합니다.

RTApp의 출력을 표시하도록 하드웨어를 설정하려면 다음 단계를 수행합니다. 핀 위치를 확인하려면 하드웨어 제조업체의 설명서를 참조해야 합니다. Seeed Studios의 MT3620 개발 키트와 같은 MT3620 RDB(참조 보드 디자인) 하드웨어를 따르는 하드웨어를 사용하는 경우 RDB 인터페이스 헤더 를 살펴보면 핀 위치를 확인하는 데 도움이 될 수 있습니다.

  1. USB-직렬 어댑터의 GND를 개발 키트의 GND에 연결합니다. MT3620 RDB 하드웨어에서 GND는 헤더 3, 핀 2입니다.

  2. USB-직렬 어댑터의 RX를 개발 키트의 IOM4-0 TX에 연결합니다. MT3620 RDB 하드웨어에서 IOM4-0 TX는 헤더 3, 핀 6입니다.

  3. USB-직렬 어댑터를 개발 컴퓨터의 무료 USB 포트에 연결하고 직렬 디바이스가 연결된 포트를 결정합니다.

    • Windows에서 장치 관리자 시작하고컨테이너별 디바이스보기를> 선택하고 'USB UART'를 찾습니다. 예를 들어 FT232R USB UART는 FTDI Friend 어댑터를 나타냅니다.

    • Linux에서 다음 명령을 입력합니다.

      dmesg | grep ttyUSB
      

      포트 이름은 ttyUSBn이어야 합니다. 여기서 n 은 포트 번호를 나타냅니다. dmesg 명령에 여러 USB 포트가 나열되면 일반적으로 연결된 것으로 보고된 마지막 포트에 연결된 포트입니다. 예를 들어 다음에서는 ttyUSB4를 사용합니다.

    ~$ dmesg | grep ttyUSB
    [  144.564350] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB0
    [  144.564768] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB1
    [  144.565118] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB2
    [  144.565593] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB3
    [  144.570429] usb 1-1.1.3: FTDI USB Serial Device converter now attached to ttyUSB4
    [  254.171871] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1
    
  4. 터미널 에뮬레이터 프로그램을 시작하고 115200-8-N-1 터미널을 어댑터에서 사용하는 COM 포트로 엽니다. 포트 및 속도를 지정하는 방법을 알아보려면 터미널 에뮬레이터에 대한 설명서를 참조하세요.

개발 및 디버깅 사용

Azure Sphere 디바이스에서 샘플 애플리케이션을 빌드하거나 새 애플리케이션을 개발하려면 먼저 개발 및 디버깅을 사용하도록 설정해야 합니다. 기본적으로 Azure Sphere 디바이스는 "잠김"입니다. 즉, 개발 중인 애플리케이션이 PC에서 로드되는 것을 허용하지 않으며 애플리케이션의 디버깅을 허용하지 않습니다. 디버깅을 위해 디바이스를 준비하면 이 제한이 제거되고 디버깅에 필요한 소프트웨어가 로드되고 디바이스 기능이 잠금 해제됩니다 .

실시간 코어를 디버그하려면 az sphere device enable-development 명령을 사용합니다. 이 명령은 디버깅을 위해 PC의 애플리케이션을 허용하도록 디바이스를 구성하고 클라우드 애플리케이션 업데이트를 허용하지 않는 개발 디바이스 그룹에 디바이스를 할당합니다. 애플리케이션 개발 및 디버깅 중에는 클라우드 애플리케이션 업데이트가 개발 중인 애플리케이션을 덮어쓰지 않도록 디바이스를 이 그룹에 남겨 두어야 합니다.

Windows에서는 디버깅 서버와 각 코어 유형에 필요한 드라이버를 디바이스에 로드하는 매개 변수를 추가 --enable-rt-core-debugging 해야 합니다.

  1. 아직 로그인하지 않은 경우 Azure Sphere에 로그인합니다.

    az login
    
  2. 관리자 권한으로 PowerShell 또는 Windows 명령 프롬프트를 사용하여 명령줄 인터페이스를 엽니다. 매개 변수는 --enable-rt-core-debugging 디버거용 USB 드라이버를 설치하기 때문에 관리자 권한이 필요합니다.

  3. 다음 명령을 입력합니다.

    az sphere device enable-development --enable-rt-core-debugging  --catalog <CatalogName>  --resource-group <ResourceGroupName>
    
  4. 관리자 권한이 더 이상 필요하지 않으므로 명령이 완료된 후 창을 닫습니다. 모범 사례로 항상 작업을 수행할 수 있는 가장 낮은 권한을 사용해야 합니다.

az sphere device enable-development 명령이 실패하는 경우 도움말은 Azure Sphere 문제 해결을 참조하세요.

Visual Studio를 사용하여 HelloWorld RTApp 애플리케이션 빌드 및 실행

  1. Visual Studio를 시작합니다. 로컬 폴더 열기를 선택하고 다운로드한 Azure_Sphere___Hello_World.zip 파일을 추출한 폴더로 이동한 다음, HelloWorld_RTApp_MT3620_Baremetal 폴더를 선택합니다.

  2. MT3620 RDB를 사용하지 않는 경우 app_manifest.json 파일 과 샘플 코드를 업데이트하여 올바른 UART(예: ISU1)를 지정합니다.

  3. CMake 생성이 자동으로 시작되지 않으면 CMakeLists.txt 파일을 선택합니다.

  4. Visual Studio 출력 창에서 CMake 출력은 메시지 CMake generation started.CMake generation finished.를 표시해야 합니다.

  5. 빌드 모두 빌드>를 선택합니다. 메뉴가 없으면 솔루션 탐색기 열고 CMakeLists.txt 파일을 마우스 오른쪽 단추로 클릭하고 빌드를 선택합니다. HelloWorld_RTApp_MT3620_Baremetal 애플리케이션의 출력 위치가 출력 창에 표시됩니다.

  6. 시작 항목 선택 메뉴에서 HelloWorld_RTApp_MT3620_Baremetal(RTCore)를 선택합니다.

  7. F5 키를 눌러 애플리케이션을 배포합니다.

  8. 연결된 터미널 에뮬레이터는 HelloWorld_RTApp_MT3620_Baremetal 프로그램의 출력을 표시해야 합니다. 프로그램은 1초 간격으로 다음 단어를 보냅니다.

    Tick

    Tock

  9. 디버거를 사용하여 중단점을 설정하고, 변수를 검사하고, 다른 디버깅 작업을 시도합니다.

Visual Studio Code 사용하여 HelloWorld RTApp 애플리케이션 빌드 및 실행

  1. Visual Studio Code 다운로드한 Azure_Sphere___Hello_World.zip 파일을 추출한 폴더에서 HelloWorld_RTApp_MT3620_BareMetal 폴더를 엽니다. 키트를 선택하라는 메시지가 표시되면 키트 사용 안 을 선택합니다.

  2. MT3620 RDB 하드웨어를 사용하지 않는 경우 app_manifest.json 파일 과 샘플 코드를 업데이트하여 올바른 UART(예: ISU1)를 지정합니다.

  3. F5 키를 눌러 디버거를 시작합니다. 프로젝트가 이전에 빌드되지 않았거나 파일이 변경되고 다시 빌드가 필요한 경우 디버깅이 시작되기 전에 Visual Studio Code 프로젝트를 빌드합니다.

  4. Azure Sphere 출력 창에 "이미지 배포..."가 표시되어야 합니다. 그 뒤에 SDK 및 컴파일러의 경로가 잇따릅니다.

  5. 연결된 터미널 에뮬레이터는 HelloWorld_RTApp_MT3620_Baremetal 프로그램의 출력을 표시해야 합니다. 프로그램은 1초 간격으로 다음 단어를 보냅니다.

    Tick

    Tock

  6. Visual Studio Code 디버깅 기능을 사용하여 중단점을 설정하고, 변수를 검사하고, 다른 디버깅 작업을 시도합니다.

문제 해결

OpenOCD가 연결되기 전에 애플리케이션이 실행을 시작할 수 있습니다. 따라서 코드 초기에 설정된 중단점이 누락될 수 있습니다. 이에 대한 간단한 해결 방법은 OpenOCD가 연결될 때까지 앱 시작을 지연하는 것입니다.

  1. 애플리케이션 진입점 RTCoreMain의 시작 부분에 다음 코드를 삽입합니다. 이렇게 하면 변수 ftrue로 설정될 때까지 애플리케이션이 루프에 while 들어가고 유지됩니다.

     volatile bool f = false;
     while (!f) {
        // empty.
     }
    
  2. F5 키를 눌러 디버깅(F5)으로 앱을 시작한 다음 실행에 침입합니다.

  3. 로컬 디버그 창에서 값을 f 0에서 1로 변경합니다.

  4. 평소와 같이 코드를 단계별로 실행합니다.

샘플 빌드

  1. PowerShell, Windows 명령 프롬프트 또는 Linux 명령 셸을 사용하여 명령줄 인터페이스를 엽니다. 프로젝트 빌드 디렉터리로 이동합니다.

  2. 프로젝트 빌드 디렉터리의 명령 프롬프트에서 다음 매개 변수를 사용하여 CMake를 실행합니다.

    cmake --preset <preset-name> <source-path>
    
    • --preset <preset-name>

      CMakePresets.json 정의된 빌드 구성 사전 설정 이름입니다.

    • --build <cmake-path>

      CMake 캐시를 포함하는 이진 디렉터리입니다. 예를 들어 Azure Sphere 샘플에서 CMake를 실행하는 경우 빌드 명령은 입니다 cmake --build out/ARM-Debug.

    • <source-path>

      샘플 애플리케이션에 대한 원본 파일이 포함된 디렉터리의 경로입니다. 이 예제에서 Azure Sphere 샘플 리포지토리는 AzSphere라는 디렉터리에 다운로드되었습니다.

      CMake 매개 변수는 공백으로 구분됩니다. 줄 연속 문자(Windows 명령줄의 경우^ , Linux 명령줄의 경우 \ 또는 PowerShell의 경우 ')는 가독성을 위해 사용할 수 있지만 필수는 아닙니다.

    다음 예제에서는 RTApp에 대한 CMake 명령을 보여 줍니다. 표시된 경우 파일 경로를> 시스템의 GNU Arm Embedded 도구 체인에 대한 설치 경로로 바꿉 <있습니다.

    Windows 명령 프롬프트

    cmake ^
    --preset "ARM-Debug" ^
    "C:\AzSphere\azure-sphere-samples\Samples\HelloWorld\HelloWorld_RTApp_MT3620_BareMetal"
    

    Windows PowerShell

    cmake `
    --preset "ARM-Debug" `
    "C:\AzSphere\azure-sphere-samples\Samples\HelloWorld\HelloWorld_RTApp_MT3620_BareMetal"
    
  3. Ninja를 실행하여 애플리케이션을 빌드하고 이미지 패키지 파일을 만듭니다.

    ninja -C out/ARM-Debug
    

    Ninja는 결과 애플리케이션 및 .imagepackage 파일을 지정된 디렉터리에 배치합니다.

    다음 명령을 사용하여 CMake를 통해 Ninja를 호출할 수도 있습니다.

    cmake --build out/<binary-dir>
    

    CMake 캐시를 포함하는 이진 디렉터리로 설정합니다 <binary-dir> . 예를 들어 Azure Sphere 샘플에서 CMake를 실행하는 경우 빌드 명령은 입니다 cmake --build out/ARM-Debug.

특히 CMake 명령을 변경한 후 문제를 해결할 때 전체 빌드를 삭제하고 다시 시도합니다.

샘플 실행

  1. 디바이스에 이미 배포된 애플리케이션을 삭제합니다.

    az sphere device sideload delete
    
  2. 프로젝트 디렉터리의 명령 프롬프트에서 ninja가 만든 이미지 패키지를 로드합니다.

    az sphere device sideload deploy --image-package <path-to-imagepackage>
    

    애플리케이션이 로드된 직후에 실행되기 시작합니다. 연결된 터미널 에뮬레이터에 다음이 표시됩니다.

    Tick
    
    Tock
    
    Tick
    .
    .
    .
    
  3. 이미지의 구성 요소 ID를 가져옵니다.

    az sphere image-package show --image-package <path-to-imagepackage>
    

    명령은 이미지 패키지에 대한 모든 메타데이터를 반환합니다. 애플리케이션의 구성 요소 ID는 애플리케이션 이미지 형식의 ID 섹션에 표시됩니다. 예를 들어:

    ...
      "Identity": {
        "ComponentId": "<component-id>",
        "ImageId": "<image-id>",
        "ImageType": "Application"
      },
    ...
    

    다음 명령을 사용하여 애플리케이션의 상태 중지, 시작 및 가져올 수 있습니다.

    az sphere device app stop --component-id <component id>
    
    az sphere device app start --component-id <component id>
    
    az sphere device app show-status --component-id <component id>
    

샘플 디버그

  1. 실행 중인 애플리케이션을 중지합니다.

    az sphere device app stop --component-id <component id>
    
  2. 디버깅을 위해 애플리케이션을 다시 시작합니다.

    az sphere device app start --debug-mode true  --component-id <component id>
    

    이 명령은 애플리케이션이 실행 중인 코어를 반환합니다.

    <component id>
    App state   : running
    Core        : Real-time 0
    
  3. 애플리케이션이 빌드된 sysroot에 대한 Openocd 폴더로 이동합니다. sysroots는 Azure Sphere SDK 설치 폴더에 설치됩니다. 예를 들어 Windows에서 폴더는 기본적으로 Linux/opt/azurespheresdk/Sysroots/*sysroot*/tools/sysroots/x86_64-pokysdk-linux의 에 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Sysroots\*sysroot*\tools\openocd 설치됩니다.

  4. 다음 예제와 같이 를 실행 openocd 합니다. 이 예제에서는 앱이 코어 0에서 실행되고 있다고 가정합니다. 앱이 코어 1에서 실행되는 경우 "targets io0"을 "targets io1"로 바꿉니다.

    openocd -f mt3620-rdb-ftdi.cfg -f mt3620-io0.cfg -c "gdb_memory_map disable" -c "gdb_breakpoint_override hard" -c init -c "targets io0" -c halt -c "targets"
    
  5. 애플리케이션 .out 파일이 포함된 폴더로 이동하고 GNU Arm Embedded 도구 체인의 일부인 를 시작 arm-none-eabi-gdb합니다.

    Windows 명령 프롬프트

    "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" HelloWorld_RTApp_MT3620_BareMetal.out
    

    Windows PowerShell

    & "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" HelloWorld_RTApp_MT3620_BareMetal.out
    
  6. OpenOCD 서버는 :4444에 GDB 서버 인터페이스를 제공합니다. 디버깅 대상을 설정합니다.

    target remote :4444

  7. 이제 gdb 명령을 실행할 수 있습니다.

  8. 연결된 터미널 에뮬레이터는 애플리케이션의 출력을 표시해야 합니다.

파트너 앱 사용

Azure Sphere 디바이스에 애플리케이션을 로드하는 경우 Azure Sphere 배포 도구는 기본적으로 모든 기존 애플리케이션을 삭제합니다. 서로 통신하는 애플리케이션을 개발할 때 이런 일이 발생하지 않도록 하려면 애플리케이션을 파트너로 표시해야 합니다. 애플리케이션 중 하나를 배포하는 경우 해당 파트너는 삭제되지 않습니다. 자세한 내용은 애플리케이션을 파트너로 표시 를 참조하세요.

다음 단계