2.8 Remote Processor Messaging
2.8.1 Introduction
Arm Cortex-A 시리즈 프로세서와 ArmCortex-M 시리즈 프로세서를 사용하여 디자인된 최신 멀티 코어 아키텍처로, 산업용 애플리케이션은 탄소 발자국을 줄이면서 더 큰 전력 효율성을 달성할 수 있다. 이는 성능 저하 없이 전력 소비를 줄이는 것이다.
동종(homogeneous)의 SoC는 전통적으로 모든 메모리를 컨트롤하는 단일 운영 체제(OS)를 실행한다. OS나 하이퍼바이저는 시스템 활용을 극대화하기 위해 사용 가능한 코어 사이의 작업 관리를 처리한다. 이러한 시스템을 SMP(Symmetric MultiProcessing)이라고 한다.
서로 다른 프로세서 코어가 있는 이기종(heterogeneous) 멀티코어 칩은 서로 다른 인스트럭션(instruction) 세트와 서로 다른 OS를 실행한다. 각 프로세싱 코어는 필요에 따라 특정 작업을 처리한다. 이러한 시스템을 AMP(Asymmetric MultiProcessing)이라고 한다. SMP와 AMP 시스템의 차이점을 이해하려면, 동종 멀티코어 SoC는 AMP 시스템이 될 수 있지만 이기종 멀티코어 SoC는 SMP 시스템이 될 수 없다는 것을 알아야 한다.
멀티코어 아키텍처는 사용 가능한 코어에 작업을 분산하기 위해 소프트웨어를 다시 작성해야 하기 때문에 시스템 디자인에 새로운 도전 과제를 안겨 준다. 또한, 리소스 경합을 피하고 코어 간에 데이터 공간을 효울적으로 공유하려면 모든 주변 기기 리소스를 적절하게 할당해야 한다. 멀티코어 SoC는 서로 다른 프로세싱 코어에서 실행되는 작업 사이의 안정적인 통신과 동기화를 위한 메커니즘도 필요하다.
RPMsg는 커널 드라이버가 시스템에서 사용 가능한 원격 프로세서와 통신할 수 있도록 하는 virtio 기반 메세징 버스이다. 결국 드라이버는 필요한 경우 사용자 공간에 적절한 인터페이스를 노출할 수 있다. 모든 RPMsg 디바이스는 원격 프로세서와 통신 채널이다(그래서 RPMsg 디바이스를 채널이라고 한다). 채널은 텍스트 이름으로 식별되며 local ("source") RPMsg 주소와 remote ("destination") RPMsg 주소가 있다. 자세한 내용은 www.kernel.org/doc/Documentation/rpmsg.txt를 참조한다.
다음 그림과 같이 메세지는 연결이 없는 양방향 통신 채널을 통해 엔드포인트 사이에 전달된다.
2.8.2 Features
- 낮은 레이턴시와 낮은 오버헤드 작업을 위해 디자인되었으며, Linux RPMsg 프레임워크와 호환된다.
- CPU와 메모리 리소스가 제한된 임베디드 환경에 최적화되어 있다.
- 데이터 변환이나 메시지 헤더 없이 공유 메모리를 사용하여 구현한다.
- 클라이언트-서버 방법론을 사용한 애플리케이션 통신.
- 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 플랫폼 관련 코드 |
drivers/rpmsg/imx_rpmsg_pingpong.c | i.MX RPMsg 핑퐁 테스트 |
drivers/rpmsg/imx_rpmsg_tty.c | i.MX RPMsg TTY 드라이버 |
2.8.4 Menu Configuration Options
메뉴 구성에서 다음 모듈을 활성화한다:
- 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 보드에서 사용되는 핑퐁 테스트
- rpmsg_str_echo_sdk_7dsdb.bin -> i.MX 7Dual SDB 보드에서 사용되는 tty 문자열 에코 테스트
- rpmsg_pingpong_sdk_7dval.bin -> i.MX 7Dual 12x12 LPDDR3 Arm2 보드에서 사용되는 핑퐁 테스트
- 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 이미지를 로드한다.
- TFPT 서버에서 Cortex-M4 프로세서 RTOS 이미지를 로드한다. 예를 들어,
- U-Boot로 부팅하고 중지한다.
- 다음 커맨드를 사용하여 대응하는 Cortex-M4 프로세서 RTOS 이미지를 TFTP하여 부팅한다.
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
“uart_from_osc”는 Cortex-M4 프로세서 RTOS 이미지가 실행 중일때, i.MX 6SoloX에서 반드시 요구된다. 따라서 i.MX 6SoloX에서 U-Boot의 mmcargs를 수정되어야 한다.
setenv mmcargs 'setenv bootargs console=${console}, ${baudrate} root=${mmcroot}, uart_from_osc';save
- TFPT 서버에서 Cortex-M4 프로세서 RTOS 이미지를 로드한다. 예를 들어,
- RPMsg 테스트 프로그램을 실행한다.
- imx_rpmsg_pingpong.ko와 imx_rpmsg_tty.ko가 빌드되었는지 확인한다.
- insmod imx_rpmsg_pingpong.ko나 insmod 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 (IMXLXRM) - System - Sensors (0) | 2022.11.15 |
---|---|
i.MX Linux Reference Manual (IMXLXRM) - System - Thermal (0) | 2022.11.15 |
i.MX Linux Reference Manual (IMXLXRM) - System - Pulse-Width Modulator (PWM) (0) | 2022.11.14 |
i.MX Linux Reference Manual (IMXLXRM) - System - OProfile (0) | 2022.11.10 |
i.MX Linux Reference Manual (IMXLXRM) - System - Power Management (0) | 2022.11.04 |