14.1.1.3. 시뮬레이터#

두 개의 TARGET 값은 하드웨어를 연결하지 않고 호스트의 시뮬레이터 안에서 실행되는 펌웨어를 빌드합니다. 이들은 펌웨어를 어디서나 실행하고 테스트할 수 있도록 존재합니다.

TARGET

코어

NPU

시뮬레이터

MPS2_AN500

Cortex-M7

None

QEMU

MPS3_AN547

Cortex-M55

Ethos-U55 (256 MACs)

Arm FVP – Corstone SSE-300

MPS2_AN500은 NPU가 없는 기본 Cortex-M7 타깃입니다. 이는 QEMU에서 실행되며, 시작이 빠르고 플랫폼 독립적인 코드와 테스트 스위트를 가볍게 실행하는 방법입니다.

MPS3_AN547은 Ethos-U55 NPU가 있는 Cortex-M55로, Arm의 Fast Models – Corstone SSE-300 레퍼런스 서브시스템을 모델링하는 FVP에서 실행됩니다. 이는 시뮬레이션에서 NPU와 ML 모델 경로를 실행하기 위한 타깃입니다.

둘 다 ROM 파일시스템과 충분한 RAM(그리고 M55의 NPU)을 제공하므로, 비전 및 ML 스크립트가 수정 없이 실행됩니다.

실제 센서는 없지만 csi 모듈은 여전히 가상 센서에 대해 동작합니다 – csi.CSI.snapshot()은 라이브 장면이 아닌 합성된 애니메이션 테스트 패턴(그레이스케일에서는 스크롤하는 체커보드, RGB565에서는 그라데이션)을 반환합니다. 실제 이미지 콘텐츠를 처리하려면 대신 파일에서 로드하십시오. ROM 파일시스템의 픽스처에서 가져온 image.Image, 또는 녹화된 프레임을 위한 image.ImageIO 스트림을 사용합니다.

14.1.1.3.1. 빌드 및 실행#

각 시뮬레이터는 직접 설치하는 호스트 도구입니다. 다른 타깃과 마찬가지로 타깃을 빌드한 다음(펌웨어 빌드하기 참조), 일치하는 시뮬레이터에서 run 합니다 – run은 ROMFS 이미지를 빌드하고 펌웨어를 부팅한 후, 연결할 수 있는 직렬 연결과 함께 실행 상태로 둡니다.

14.1.1.3.1.1. MPS2_AN500 (QEMU)#

QEMU는 대부분의 패키지 관리자에 Arm 시스템 에뮬레이터로 제공됩니다:

  • Linux (Debian / Ubuntu) – apt로 설치합니다:

    sudo apt install qemu-system-arm
    
  • macOS – Homebrew로 설치합니다:

    brew install qemu
    

그런 다음 타깃을 빌드하고 실행합니다:

make -j$(nproc) TARGET=MPS2_AN500
make TARGET=MPS2_AN500 run

14.1.1.3.1.2. MPS3_AN547 (Arm FVP)#

FVP는 Corstone SSE-300을 위한 Arm의 Fixed Virtual Platform으로, Arm Virtual Hardware 의 일부로 제공됩니다. 이는 Linux 에서만 사용할 수 있습니다 – Mac에서는 대신 위의 QEMU 타깃을 사용하십시오.

번들을 다운로드하고 압축을 푼 다음, 그 bin/ 디렉터리를 PATH에 추가합니다:

wget https://artifacts.tools.arm.com/avh/11.31.28/avh-linux-x86_11.31_28_Linux64.tar.gz
mkdir -p ~/fvp
tar --strip-components=1 -xzf avh-linux-x86_11.31_28_Linux64.tar.gz -C ~/fvp
export PATH="$HOME/fvp/bin:$PATH"

FVP는 실행될 때 LD_LIBRARY_PATH에 SDK의 Python 라이브러리도 필요합니다. 저장소 루트에서 셸당 한 번 내보내십시오 – SDK_VERSION을 읽으면 저장소가 고정된 SDK를 업데이트할 때도 정확하게 유지됩니다:

export LD_LIBRARY_PATH="$HOME/openmv-sdk-$(cat SDK_VERSION)/python/lib:$LD_LIBRARY_PATH"

그런 다음 타깃을 빌드하고 실행합니다:

make -j$(nproc) TARGET=MPS3_AN547
make TARGET=MPS3_AN547 run

14.1.1.3.2. 테스트 스위트 실행#

단위 테스트는 scripts/unittest/tests/에 있으며, 그 픽스처 이미지와 데이터는 scripts/unittest/data/에 있습니다. 이들은 mpremote 로 실행되며, scripts/unittest/를 실행 중인 시뮬레이터에 마운트하고 그 run.py를 실행합니다.

시뮬레이터 링크는 기본 mpremote로는 느리므로, 직렬 패치가 적용된 저장소에 번들된 사본을 사용하십시오(한 번만 적용):

patch -N -p1 -d lib/micropython < tools/mpremote-qemu-serial.patch

QEMU에서 MPS2_AN500의 경우, 타깃을 시작하십시오 – 직렬 포트가 위치한 의사 터미널을 출력합니다(예: /dev/pts/5):

make TARGET=MPS2_AN500 run

그런 다음 다른 셸에서, 패치된 mpremote를 해당 장치로 가리킵니다:

python3 lib/micropython/tools/mpremote/mpremote.py connect /dev/pts/5 \
    mount scripts/unittest/ run scripts/unittest/run.py

FVP에서 MPS3_AN547의 경우, 직렬 포트는 대신 포트 5555의 텔넷 소켓입니다:

make TARGET=MPS3_AN547 run
python3 lib/micropython/tools/mpremote/mpremote.py connect socket://localhost:5555 \
    mount scripts/unittest/ run scripts/unittest/run.py

run.py는 모든 테스트를 검색하고 실행하며, 테스트별로 타이밍과 함께 PASSED / FAILED 줄을 출력하고 마지막에 요약을 출력합니다.

14.1.1.3.3. 테스트 추가하기#

테스트는 자동으로 검색됩니다. 하나를 추가하려면, 테스트가 통과할 때 True를, 실패할 때 False를 반환하는 unittest(data_path, temp_path) 함수를 정의하는 파일을 scripts/unittest/tests/에 넣으십시오:

# scripts/unittest/tests/circles.py
def unittest(data_path, temp_path):
    import image

    img = image.Image(data_path + "/shapes.ppm", copy_to_fb=True)
    circles = img.find_circles(threshold=5000, x_margin=30, y_margin=30, r_margin=30)
    return len(circles) == 1 and circles[0][0:] == (118, 56, 22, 5856)

data_pathtemp_path 인자는 스위트가 실행되는 동안 시뮬레이터가 보는 두 파일시스템을 가리킵니다:

경로

기반

/remote

mpremote 연결을 통해 실시간으로 마운트된 호스트의 scripts/unittest/ 디렉터리. run.py와 그것이 검색하는 tests/가 여기에 있으므로, 테스트를 추가하거나 편집하면 재빌드 없이 다음 실행에 반영됩니다. temp_path는 장치에서 /remote/temp이며, 이는 호스트의 scripts/unittest/temp/입니다 – 파일을 생성하는 테스트를 위한 쓰기 가능한 스크래치 디렉터리입니다.

/rom

romfs_config.json에서 펌웨어 이미지에 빌드된 보드의 읽기 전용 ROM 파일시스템: 테스트 픽스처(scripts/unittest/data/에서 가져옴)와 번들된 ML 모델. data_path/rom입니다 – 픽스처에는 data_path + "/<file>"로 접근합니다.

따라서 새 테스트 는 재빌드가 필요 없지만, 새 픽스처 는 필요합니다: ROM 이미지는 개별 데이터 파일이 아니라 romfs_config.json을 기준으로 키가 지정되므로, 보드의 romfs_config.json을 터치(또는 make TARGET=<TARGET> clean)하여 재빌드를 강제하고 다시 실행하십시오.

예상 값은 테스트 내에 인라인으로 어서트되므로, 유지 관리할 별도의 예상 출력 파일이 없습니다. 런타임에 테스트를 건너뛰려면 – 예를 들어 시뮬레이터가 모델링하지 않는 하드웨어가 필요할 때 – 메시지에 "SKIPPED"를 포함하는 예외를 발생시키십시오.