2.8 Remote Processor Messaging
2.8.1 Introduction
Arm Cortex®-A 시리즈 프로세서와 Arm Cortex-M 시리즈 프로세서를 사용하여 설계된 최신 멀티코어 아키텍처를 통해 산업용 애플리케이션은 탄소 소비(footprint)를 줄이면서 더 큰 전력 효율성을 달성할 수 있다. 이것은 성능의 저하 없이 전력 소비를 줄여 준다.
전통적으로 동종(homogeneous) SoC는 모든 메모리를 컨트롤하는 단일 운영 체제(OS : Operating System)를 실행한다. OS나 하이퍼바이저(hypervisor)는 시스템 활용을 극대화하려고 사용 가능한 core 사이의 작업 관리를 처리한다. 이러한 시스템을 SMP(Symmetric MultiProcessing)라 한다.
이기종 멀티 코어 칩(heterogeneous multicore chip)은 서로 다른 프로세스 core로 서로 다른 명령 세트와 서로 다른 OS를 실행한다. 각 프로세스 core는 필요에 따라 특정 작업을 처리한다. 이런 시스템을 AMP(Asymmetric MultiProcessing)라고 한다. SMP와 AMP 시스템의 차이점을 이해한다면, 동종(homogeneous) 멀티코어 SoC는 AMP 시스템이 될 수 있지만 이기종(heterogeneous) 멀티코어 SoC는 SMP 시스템이 될 수 없다는 사실을 이해할 수 있다.
사용 가능한 core에 작업을 분산하기 위해서는 소프트웨어를 다시 작성해야 하기 때문에 멀티코어 아키텍처는 시스템 설계에 새로운 도전을 가져온다. 추가적으로, 리소스 경합을 피하고 core 사이에 데이터 공간을 효율적으로 공유하기 위해서 모든 주변 리소스를 적절하게 할당해야 한다. 또한 멀티코어 SoC는 서로 다른 프로세스 코어에서 실행되는 작업 사이에 안정적인 통신과 동기화를 위한 메커니즘을 필요로 한다.
RPMsg는 virtio-based 메세징 버스이다. 이것은 시스템에서 커널 드라이버가 사용 가능한 원격 프로세서와 통신할 수 있도록 한다. 차례로 드라이버는 필요한 경우 적절한 사용자 영역에 인터페이스를 노출할 수 있다. 모든 RPMsg 디바이스는 원격 프로세스의 통신 채널(따라서 RPMsg 디바이스를 채널이라 함)이다. 채널은 텍스트 이름으로 식별되고 로컬("source") RPMsg 주소와 원격 ("destination") RPMsg 주소가 있다. 자세한 내용은 www.kernel.org/doc/Documentation/rpmsg.txt를 참조한다.
다음 그림과 같이 메세지는 양방향 연결이 없는 통신 채널을 통해 끝점 간에 전달된다.
2.8.2 Features
- 짧은 대기 시간(latency)과 낮은 오버헤드 작업을 위해 설계되었으며, Linux RPMsg 프레임워크와 호환
- CPU와 메모리 리소스가 제한되는 임베디드 환경에 최적화
- 데이터 변환이나 메세지 헤더 없이 공유 메모리를 사용하여 구현
- 클라이언트-서버 방법론(methodology)을 사용한 애플리케인션 통신
- RPMsg 채널의 동적 할당
2.8.3 Source Code
RPMsg 드라이버 소프트웨어는 drivers/rpmsg에 있다.
Table 20. RPMsg Source
File | Description |
drivers/rpmsg/virtio_rpmsg_bus.c | 공통 코드 |
drivers/rpmsg/imx-rpmsg.c | i.MX platform-related code (플랫폼 관련 코드) |
drivers/rpmsg/imx-rpmsg-pingpong.c | i.MX RPMsg ping-pong tests (핑퐁 테스트) |
drivers/rpmsg/imx-rpmsg-tty.c | i.MX RPMsg TTY 드라이버 |
2.8.4 Menu Configuration Options
menu configuration에서 다음 모듈을 활성화한다 :
- Device Drivers > IMX RPMSG pingpong driver -- loadable modules only
- Device Drivers > IMX RPMSG tty driver -- loadable modules only
2.8.5 Running i.MX RPMsg Test Programs
i.MX RPMsg 테스트 프로그램을 실행하려면 다음 작업을 수행한다 :
- 적당한 Cortex-M4 프로세서 RTOS와 Linux 이미지가 사용되는지 확인한다.
i.MX 7Dual 플랫폼을 예를 들면 :
- rpmsg_pingpong_sdk_7dsdb.bin -> i.MX 7Dual SDB 보드에서 사용되는 ping-pong 테스트
- rpmsg_str_echo_sdk_7dsdb.bin -> i.MX 7Dual SDB 보드에서 사용되는 tty 문자열 에코 테스트
- rpmsg_pingpong_sdk_7dval.bin -> i.MX 7Dual 12x12 LPDDR3 Arm2 보드에서 사용되는 ping-pong 테스트
- rpmsg_str_echo_sdk_7dval.bin -> i.MX 7Dual 12x12 LPDDR3 Arm2 보드에서 사용되는 tty 문자열 에코 테스트
- Cortex-M4 프로세서 RTOS 이미지를 로드하고, U-Boot에서 시작한다.
TFTP 서버나 U-Boot에서 부팅가능한 SD 카드로 Cortex-M4 프로세서 RTOS 이미지를 로드한다.
- TFTP 서버에서 Cortex-M4 프로세서 RTOS 이미지를 로드한다. 예를 들어,
- U-Boot에서 부팅하고 중지
- 다음 명령을 사용하여 TFTP에서 응답한 Cortext-M4 프로세서 RTOS 이미지로 부팅한다.
dhcp 0x7e0000 10.192.242.53:rpmsg_pingpong_sdk_7dval.bin; bootaux 0x7e0000
- SD 카드에서 Cortex-M4 프로세서 RTOS 이미지를 로드한다. 예를 들어,
- MFGtools로 부팅가능한 SD 카드를 만든다. 그런 다음 VFAT 파일 시스템으로 포맷된 첫 번째 파티션에 Cortex-M4 프로세서 RTOS 파일을 복사한다.
- U-Boot의 기본 Cortex-M4 프로세서 RTOS 이름을 변경한다.
setenv m4image '<The name of the M4/RTOS image>';save
- Cortex-M4 프로세서에서 사용하는 boot args(부트 인수)를 설정한다.
setenv run_m4_tcm 'if run loadm4image; then cp.b ${loadaddr} 0x7e0000 0x8000; bootaux 0x7e0000; fi'; save
- "run run_m4_tcm"를 추가하여 원래의 bootcmd를 수정한다.
setenv bootcmd "run run_m4_tcm; <original contents of the bootcmd>"; save
주의
Cortex-M4 프로세서 RTOS 이미지가 실행 중일 때 "uart_from_osc"는 i.MX 6SoloX에 필수적이다. 따라서 U-Boot의 mmcargs는 i.MX 6SoloX에서 수정되어야 한다.
setenv mmcargs 'setenv bootargs console=${console},${baudrate} root=$ {mmcroot}, uart_from_osc';save
- TFTP 서버에서 Cortex-M4 프로세서 RTOS 이미지를 로드한다. 예를 들어,
- RPMsg 테스트 프로그램 실행
- imx_rpmsg_pingpong.ko와 imx_rpmsg_tty.ko가 빌드되어 있는지 확인한다.
- imx_rpmsg_pingpong.ko나 imx_rpmsg_tty.ko를 사용하여 테스트 프로그램을 실행한다.
주의
동시에 다른 테스트 프로그램을 실행하면 안된다. - 다음 명령을 실행해서 RPMsg TTY 테스트를 시작할 때 RPMsg TTY 수신 프로그램이 백엔드에서 실행되고 있는지 확인한다.
/unit_tests/mxc_mcc_tty_test.out /dev/ttyRPMSG30 115200 R 100 1000 &
Linux OS에서의 로그 :
insmod imx_rpmsg_tty.ko imx_rpmsg_tty rpmsg0: new channel: 0x400 -> 0x1! Install rpmsg tty driver! echo deadbeaf > /dev/ttyRPMSG30 imx_rpmsg_tty rpmsg0: msg(<- src 0x1) deadbeaf len 8
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - System - Sensors (0) | 2022.06.20 |
---|---|
i.MX Linux Reference Manual - System - Thermal (0) | 2022.06.17 |
i.MX Linux Reference Manual - System - Pulse-Width Modulator (PWM) (0) | 2022.06.16 |
i.MX Linux Reference Manual - System - OProfile (0) | 2022.06.15 |
i.MX Linux Reference Manual - System - Power Management (0) | 2022.06.10 |