주요 내용으로 건너뛰기

디버깅

TouchGFX 애플리케이션은 TouchGFX Designer와 TouchGFX Generator에서 생성되어 개발자가 작성하는 C++ 파일들로 이루어지기 때문에 다른 어떤 C++ 애플리케이션으로도 디버깅이 가능합니다.

대상 디버깅

IAR Workbench, Keil μVision, STM32CubeIDE 같은 IDE를 사용하는 경우 해당 IDE에서 제공하는 메커니즘을 사용하면 쉽게 대상을 디버깅할 수 있습니다. TouchGFX Generator에서, 혹은 TouchGFX Board Setup에서 직접 생성된 TouchGFX 프로젝트는 선택한 도구 체인을 사용해 언제든지 디버깅할 수 있습니다.

보드 브링 업 코드와 TouchGFX AL은 대상 보드에서만 실행되기 때문에 디버깅도 대상 보드에서 수행해야 합니다. 애플리케이션에서 UI 부분은 대상에서, 혹은 시뮬레이터를 사용해 디버깅할 수 있습니다. 대상에서는 일반적으로 애니메이션 속도, 업데이트 주기, 응답성과 같은 성능 문제를 디버깅합니다. 그 밖에 다른 UI 문제도 디버깅할 수 있지만 시뮬레이터를 사용해 디버깅하는 편이 대체로 더 빠릅니다.

시뮬레이터 디버깅

애니메이션 위치 변경, 전환, 요소 업데이트, 프로그램 로직 등 UI 관련 문제에 대한 디버깅은 대체로 매번 보드를 플래싱하는 것보다 시뮬레이터를 사용해 테스트 및 디버깅하는 편이 훨씬 더 효율적입니다.

TouchGFX 애플리케이션은 기본적으로 Visual Studio를 지원하기 때문에 여기에 필요한 프로젝트 파일을 제공하고 유지 관리합니다. Visual Studio를 사용하면 시뮬레이터를 디버그 모드로 실행하여 IDE의 디버그 기능을 모두 이용할 수 있습니다.

시뮬레이터를 사용해 디버그할 경우 Visual Studio 외에 다른 IDE도 사용할 수 있습니다. GCC로 애플리케이션을 컴파일할 수 있기 때문에 다른 IDE를 사용한다면 GCC를 설정하여 GCC에서 컴파일된 프로젝트를 디버깅할 가능성이 매우 높습니다. 단, 이 경우에는 IDE를 직접 구성해야 합니다.

Visual Studio의 디버깅 작업

DebugPrinter 사용

DebugPrinter 클래스는 텍스트 영역이나 기타 위젯을 스크린에 추가하지 않고도 디버그 메시지를 디스플레이에 손쉽게 출력할 수 있는 방법으로, 예를 들어 백엔드에서 수신되는 이벤트나 FPS 또는 렌더링 시간과 같은 측정 값을 표시하는 데 사용할 수 있습니다.

DebugPrinter를 사용하려면 먼저 인스턴스를 할당하여 Application 클래스로 전달해야 합니다. 예를 들어 FrontendApplication 생성자에서 이를 수행할 수 있습니다.

단, 디버그 프린터가 프레임 버퍼 형식과 호환되어야 합니다. 아래 표는 사용 가능한 클래스 이름이 나와 있습니다. 여기서는 16bpp 디버그 프린터(LCD16bpp와 호환 가능)를 gui/src/common/FrontendApplication.cpp에 추가했습니다.

#include <gui/common/FrontendApplication.hpp>
#include <touchgfx/lcd/LCD16DebugPrinter.hpp>

LCD16DebugPrinter lcd16DebugPrinter; // Global object

FrontendApplication::FrontendApplication(Model& m, FrontendHeap& heap)
: FrontendApplicationBase(m, heap)
{
lcd16DebugPrinter.setPosition(0, 0, 240, 40);
lcd16DebugPrinter.setScale(2);
lcd16DebugPrinter.setColor(0x00); //black
Application::setDebugPrinter(&lcd16DebugPrinter);
}

여기서는 왼쪽 상단 240 x 40 픽셀에 쓰기가 가능하도록 DebugPrinter를 구성했습니다. 이제 애플리케이션에서 다음을 사용해 문자열을 인쇄할 수 있습니다.

#include <stdio.h>

char debugStringBuffer[30];
void updateDebugString()
{
static int count = 0;
count++;
snprintf(debugStringBuffer, sizeof(debugStringBuffer), "tick: %d", count);
Application::getDebugPrinter()->setString(debugStringBuffer);
Application::invalidateDebugRegion();
}

애플리케이션에서 DebugPrinter::setString 메서드를 한 번 이상 호출할 필요가 없습니다. 그러나 버퍼의 내용을 변경했을 때는 invalidateDebugRegion을 호출하십시오. 그러면 DebugPrinter가 새 내용을 그리게 됩니다. DebugPrinter가 다루는 영역의 일반 위젯이 다시 그려지면 DebugPrinter도 다시 그리기 작업을 하게 됩니다.

Note
문자는 ASCII 32(공백)부터 ASCII 126('~')까지 사용할 수 있습니다.

DebugPrinter 사용

DebugPrinter 클래스

DebugPrinter 인스턴스가 사용할 LCD 클래스와 호환되어야 합니다. 다음 표는 DebugPrinter 클래스 이름 목록입니다.

LCD 클래스DebugPrinter 클래스
LCD1bppLCD1DebugPrinter
LCD2bppLCD2DebugPrinter
LCD4bppLCD4DebugPrinter
LCD8bpp_ARGB2222LCD8ARGB2222DebugPrinter
LCD8bpp_ABGR2222LCD8ABGR2222DebugPrinter
LCD8bpp_RGBA2222LCD8RGBA2222DebugPrinter
LCD8bpp_BGRA2222LCD8BGRA2222DebugPrinter
LCD16bppLCD16DebugPrinter
LCD16bppSerialFlashLCD16DebugPrinter
LCD24bppLCD24DebugPrinter
LCD32bppLCD32DebugPrinter

DebugPrinter 클래스는 사용 중인 LCD 클래스와 일치하는 것을 사용하십시오.

시뮬레이터 프로젝트의 경우, generated/simulator/src/mainBase.cpp에 LCD 인스턴스가 생성됩니다. 대상 프로젝트의 경우, TouchGFX/target/generated/TouchGFXConfiguration.cpp에 인스턴스가 생성됩니다.

TouchGFX/target/generated/TouchGFXConfiguration.cpp
...
static LCD16bpp display;
...

이 파일을 검사해 LCD 클래스 이름을 확인할 수 있습니다.