TouchGFX AL Development Introduction
TouchGFX 애플리케이션의 TouchGFX Abstraction Layer(AL, 추상화 계층) 는 보드 브링업 단계에서 개발된 보드 초기화 코드와 TouchGFX Engine 사이에 위치한 소프트웨어 구성 요소입니다. 주요 임무는 TouchGFX Engine을 기반 하드웨어와 운영 체제에 연결하는 것입니다. 이를 위해 TouchGFX Engine에서 통합된 방식으로 처리할 수 있도록 기반 하드웨어와 OS의 세부 사항을 추상화합니다.
AL은 HAL(Hardware Abstraction Layer) 과 OSAL(Operating System Abstraction Layer) 이라는 두 가지 부분으로 이루어져 있습니다.
이 섹션에서는 AL의 원칙 및 책임, 그리고 이것이 TouchGFX Engine과 상호 작용하는 방식을 전반적으로 소개합니다. 특정 하드웨어에서 이것이 실현되는 방식에 대한 자세한 내용은 다음 섹션에 설명되어 있습니다.
📄️ Abstraction Layer Architecture
📄️ Generator User Guide
🗃️ Scenarios
6개의 항목
AL(Abstraction Layer) 의 책임
"기본 개념" 장의 메인 루프 섹션에 설명되어 있듯이, TouchGFX Engine에는 세 가지 기본 단계를 수행하는 메인 루프가 있습니다.
- 입력(터치 좌표, 버튼) 수집
- 장면 모델 업데이트
- 프레임 버퍼로 장면 모델 렌더링
여기 나온 세 가지 단계는 TouchGFX Engine의 주된 책임인 애플리케이션의 현재 상태를 반영하도록 프레임 버퍼를 업데이트하는 작업을 수행합니다.
디스플레이에 프레임 버퍼 데이터를 실제 전송하는 것을 비롯해 외부 입력을 수집하는 작업을 TouchGFX Engine이 직접 처리하는 대신에 TouchGFX AL에 위임합니다.
메인 루프는 시간 경과에 따라 프레임 버퍼(들) 를 지속적으로 업데이트합니다. 디스플레이에 모든 프레임을 올바르게 전송하여 표시하기 위해서는 이러한 프로세스가 실제 업데이트 주기와 디스플레이의 준비 상태에 맞게 동기화되어야 합니다. 동기화가 이루어지지 않으면 메인 루프가 계속해서 업데이트되면서 전송 전에 프레임 버퍼(들) 가 덮어 쓰기될 수 있습니다. 이러한 동기화는 TouchGFX AL의 책임입니다.
또한 TouchGFX AL은 프레임 버퍼 메모리 영역과 이에 대한 액세스를 제어하는 책임도 맡고 있습니다. 따라서 프레임 버퍼의 모든 액세스는 TouchGFX AL을 통해 이루어집니다.
자세히 살펴보자면 TouchGFX AL의 책임은 다음과 같습니다:
책임 | 설명 |
---|---|
TouchGFX Engine 메인 루프를 디스플레이 전송과 동기화 | 가용 프레임 버퍼에서 차기 프레임이 계산 및 렌더링될 때 TouchGFX Engine의 메인 루프는 중단되어야합니다. 그래야만 디스플레이에 전송되기 전에 새롭게 어셈블링된 프레임 버퍼를 덮어 쓰는 일이 발생하지 않습니다. |
터치 및 물리적 버튼 이벤트 보고 | 터치 이벤트의 발생 여부와 이에 해당하는 좌표를 샘플링합니다. 물리적 버튼 또는 유사 버튼의 활성화 여부를 샘플링합니다. 이러한 이벤트를 TouchGFX Engine에 보고합니다. 다른 외부 이벤트는 다른 메커니즘을 통해 TouchGFX 애플리케이션에 전달된다는 사실에 유의하십시오. 이에 대한 자세한 내용은 백엔드 통신관련 섹션에서 확인하십시오. |
프레임 버퍼 액세스 동기화 | 프레임 버퍼 메모리는 TouchGFX AL의 책임입니다. 메인 루프 스레드나 DMA처럼 다른 관련 동작들이 액세스할 수 있으므로 TouchGFX AL은 이러한 메모리를 보호할 수 있는 방법을 제공해야 합니다. |
차기 가용 프레임 버퍼 영역 보고 | TouchGFX AL은 현재 프레임 버퍼에서 다음에 업데이트가 가능한 부분을 답해줄 수 있어야 합니다. 표준인 2개 프레임 버퍼 설정에서는 항상 전체 프레임 버퍼를 사용할 수 있는데, 하나의 전체 프레임 버퍼는 렌더링을 전담하도록 하고, 다른 하나는 디스플레이에 대한 전송을 전담하도록 하기 때문입니다. 단일 또는 부분 프레임 버퍼 설정에서는 이러한 작업이 더 복잡해집니다. |
렌더링 작업 수행 | TouchGFX Engine 메인 루프는 장면 모델을 렌더링하면서 TouchGFX AL에게 해당하는 부분을 렌더링하도록 요청합니다. 특정 TouchGFX AL 애플리케이션에서는 기반 하드웨어를 사용해 그래픽 기본 요소들을 렌더링합니다. 한 예로 Chrom-ART 그래픽 가속기가 장착된 MCU에서 비트맵을 렌더링하는 경우를 들 수 있습니다. TouchGFX에는 모든 가용 플랫폼에 최적화된 렌더링 방법이 내장되어 있기 때문에 사용자 지정을 할 필요가 없습니다. |
디스플레이에 대한 프레임 버퍼 전송 처리 | TouchGFX Engine은 TouchGFX AL에 프레임 버퍼에서 전송이 필요한 부분을 알립니다. 그러면 TouchGFX AL은 이러한 전송을 개시하여 결국에는 물리적 디스플레이에 픽셀이 위치하도록 해야 합니다. |
TouchGFX AL은 자체 스레드 또는 이와 유사한 것을 갖추지 않은 수동적인 소프트웨어 모듈이므로 TouchGFX Engine 메인 루프에서 호출된 특정 후크(함수) 또는 인터럽트를 통해 동작을 수행해야합니다.
사용 가능한 후크 및 인터럽트 세트는 아래와 같습니다.
기반 하드웨어와 OS에서 TouchGFX AL의 책임이 수행되도록 이러한 후크를 구현하는 것은 TouchGFX AL 개발자의 몫입니다. 이러한 책임을 지원하기 위해 다른 방법이 필요한 경우, TouchGFX AL 개발자는 특정 지점을 활성화하도록 인터럽트를 설정할 수 있습니다. LTDC 수직 동기화 인터럽트와 하드웨어 타이머가 바로 이러한 예입니다. I1: Display ready 인터럽트는 수직 동기화 인터럽트의 예입니다. 이러한 인터럽트의 설정은 Al 개발의 일환으로 여겨진다는 점에 유의하십시오.
설정 예: LTDC가 장착된 MCU를 갖춘 2개의 프레임 버퍼
일반적인 방법은 LTDC를 장착한 MCU를 갖춘 2개의 프레임 버퍼를 설정하는 것입니다. 이러한 설정에서 각 후크에 대한 TouchGFX AL의 동작은 흔히 다음과 같이 이루어집니다.
디스플레이가 새로운 프레임을 수신할 준비가 될 때마다 I1이 실행될 수 있도록 TouchGFX AL이 LTDC VSYNC 인터럽트에 반응하게 설정합니다. 이 방법은 디스플레이에 메인 루프를 동기화하는 데 사용됩니다.
후크 및 인터럽트 | 조치 |
---|---|
I1: 디스플레이 레디 | 이 작업을 트리거하도록 LTDC VSYNC 인터럽트를 설정합니다. 메인 루프의 잠금을 해제하고 이전 프레임에서 준비된 프레임 버퍼의 전송을 개시합니다. |
H1: 터치 및 물리적 버튼 이벤트를 보고합니다. | 터치 이벤트 또는 물리적 버튼 클릭 시 정보를 반환합니다. |
H2: 차기 가용 프레임 버퍼 영역을 가져옵니다. | 이중 버퍼 설정을 사용하면 현재 디스플레이에 전송되고 있지 않은 프레임 버퍼의 전체 영역이 반환됩니다. |
H3: 렌더링 작업 수행 | MCU의 기능에 따라 다릅니다. 하드웨어에서 지원되는 렌더링 작업과 나머지 부분에 대한 소프트웨어 폴백(fallback) 을 수행합니다. |
H4: 전체 영역 렌더링 | 수행할 조치가 없습니다. |
H5: 렌더링 완료 | 메인 루프를 차단합니다. |
이 설정은 다음과 같은 실행 흐름을 제공합니다.
이 흐름도는 이러한 설정에 대한 TouchGFX AL의 전반적인 설계를 설명합니다. 아래 섹션에는 Al을 구현하는 방법이 자세히 소개되어 있습니다.