← 과제 목록

[과제] 3주차) ThorVG 활용사례 조사 강윤석

@DaengDo
  • #과제

openVela

openVela는 샤오미가 개발한 임베디드용 경량 운영체제이다. 구체적으로는 NuttX라는 자원이 제한된 임베디드 시스템을 위해 개발된 오픈소스 커널 기반이다.

NuttX는 리눅스 코드를 갖다 쓰지 않고 처음부터 새로 만든 커널이다. 다만 POSIX와 ANSI 표준을 지키고 있기 때문에 유사 소형 리눅스 느낌으로 사용할 수 있다.

openVela는 여러 저장소와 선택형 구성요소를 묶어 하나의 펌웨어를 만드는 OS 플랫폼으로 깃허브 저장소를 들어가면 굉장히 많은 레포들이 나열되어 있다.

openVela 소스 창고
- LVGL
- ThorVG
- Bluetooth
- Wi-Fi
- 파일시스템
- 여러 라이브러리
- ...(하드웨어 개발자 대회 한다고 저장소 뿔어나서 더 정신없음...)
...

이 선택형 구성 요소를 잘 버무려서 실제 제품 펌웨어에 필요한 기능과 라이브러리만 포함시킬 수 있는 것이다.

특히나 이 목록에 ‘ThorVG’와 내부적으로 ThorVG를 사용하는 ‘LVGL’이 포함되어 있는 점이 이번 조사의 계기가 된다.

(참고로 LVGL에 ThorVG가 어떻게 통합되어 있는지는 다른 멘티분이 작성한 글이 있다.)

나는 openVela에서 ThorVG가 어떻게 관리되고 있고, 어떤 설정을 활성화해야 펌웨어의 일부로 빌드되는지 살펴보았다.

Repo

openvela는 여러 Git 저장소를 하나의 소스 트리로 구성하기 위해 repo를 사용한다. repo는 모노레포나 깃 서브모듈과는 다르게 서로 다른 독립적인 여러 프로젝트들을 동시에 관리하기 위해 만든 도구다. 구글이 수백개의 안드로이드 저장소를 관리하기 위해 만들었다고 한다.

repo는 manifest를 통해 관리되는데 간단히 예시는 이렇게 된다.

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote name="origin" fetch="https://github.com/myteam/" />
    <default remote="origin" revision="main" />

    <project name="app-core" path="src/core" />
    <project name="app-ui" path="src/ui" />
</manifest>

위 manifest 예제는 myteam 밑에 있는 app-coresrc/core경로에, app-uisrc/ui 경로에 채크아웃하라는 뜻이다.

openVela는 repo의 manifest를 사용해 펌웨어 제작에 사용할 수 있는 부품을 목록화 한다.

<project path="external/thorvg/thorvg" name="external_thorvg"/>

repo 설정을 보면 openvela.xml에서 ThorVG를 외부 라이브러리로 제공하고 있다.

  • open-vela/external/thorvg
    • openvela용 Kconfig와 빌드 설정 관리
    • ThorVG를 펌웨어에 어떻게 포함할지 결정
  • open-vela/external_thorvg
    • 실제 ThorVG 소스 코드 관리
    • openvela 에서 가져와 관리하는 저장소 (repo로 갖고오는 실제 소스)

Kconfig

Kconfig는 리눅스 커널에서 시작된 이 커널/펌웨어에 어떤 기능을 넣을지를 정의하고 선택하게 해주는 빌드 설정 도구다.

앞서 openVela는 NuttX 라는 경량 os 기반이라고 했는데, repo로 프로젝트를 땡겨온 후 nuttx/.config 파일을 보면 Kconfig 옵션들을 볼 수 있다.

# CONFIG_LIB_THORVG is not set
CONFIG_LIB_THORVG=y

Kconfig에 비활성화되어 있다면 위처럼 적혀있고, 반대로 활성화되어 있다면 아래처럼 =y로 켜저있다.

external/thorvg 경로에도 Kconfig 파일이 있는데

menuconfig LIB_THORVG
	tristate "Enable ThorVG"
	default n

ThorVG는 기본값이 비활성화 되어 있는 것을 볼 수 있다.

만약 커널에 ThorVG 옵션을 포함시키려면 주석을 풀고 CONFIG_LIB_THORVG=y로 설정하기보다는 kconfig-tweak --file nuttx/.config --enable CONFIG_LIB_THORVG 명령어를 쓰는 것이 안전하다고 한다.

빌드

블루투스나 와이파이 같은 모든 기능을 제외하고 파일 시스템과 같은 기본 옵션만 켜저있는 상태에

#include <nuttx/config.h>
#include <stdio.h>
#include <thorvg_capi.h>

int main(int argc, FAR char *argv[])
{
  Tvg_Result result = tvg_engine_init(TVG_ENGINE_SW, 0);
  printf("ThorVG engine init result: %d (%s)\n",
         result, result == TVG_RESULT_SUCCESS ? "SUCCESS" : "FAIL");
  tvg_engine_term(TVG_ENGINE_SW);
  return 0;
}

ThorVG만 포함시켜 기본 제공되는 Hello 라는 앱에 간단히 로그를 찍어서 리눅스 호스트에서 돌아가는 일반 실행 파일로 빌드해봤다.

image

커널에 포함이 되어서 정상 호출된 것을 확인할 수 있었다.

마무리

openVela 운영체제에 포함되는 라이브러리로 ThorVG가 어떻게 관리되고 있는지 살펴보았다.

여러 선택형 구성요소를 조합해 제품별 펌웨어를 만드는 openVela의 구조를 잘 보여주는 사례라고 생각한다.

댓글

Discussion 원문