주요 내용으로 건너뛰기

디버깅

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

대상 디버깅

IAR Workbench, Keil uVision, 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 클래스 이름을 확인할 수 있습니다.