STM32H7 Inter-processor communication (5) - STM32CubeH7 examples

STM32CubeH7 패키지에는 OpenAMP 및 FreeRTOS™ 메시지 버퍼를 사용한 프로세서 간 통신을 포함하여 듀얼 코어 애플리케이션을 위한 몇 가지 예가 포함되어 있습니다. 다음 섹션에서는 OpenAMP 및 FreeRTOS™를 사용하는 몇 가지 예와 하드웨어 세마포어를 사용하는 기타 예를 설명합니다.

OpenAMP

다음 그림은 CPU1을 마스터로, CPU2를 슬레이브로 정의한 예를 보여줍니다. 시스템 초기화 후 두 CPU 모두 OpenAMP 프레임워크 초기화를 담당하는 MX_OPENAMP_Init() 함수를 실행합니다. CPU2(슬레이브)는 엔드포인트 생성을 담당하며 이는 OPENAMP_create_endpoint() API를 사용하여 수행됩니다.

엔드포인트가 생성되자마자 마스터 CPU(CPU1)는 링크를 사용할 수 있다는 알림을 받습니다. 이 알림은 MX_OPENAMP_Init() 함수에 매개변수로 전달된 콜백을 통해 수행됩니다. 마스터 CPU는 끝점 바인딩을 완료할 준비가 되었습니다.

성공적으로 바인딩된 후 마스터 CPU는 OPENAMP_send() 함수를 사용하여 첫 번째 데이터를 보냅니다. 결과적으로 슬레이브 측에 알림이 발생합니다. 슬레이브 rpmsg_recv_callback()이 실행되고 데이터가 CPU2 측에서 실행 중인 애플리케이션으로 복사됩니다. . CPU2는 OPENAMP_send() 함수를 사용하여 마스터 CPU에 메시지를 보낼 수도 있습니다.

이 그림은 하드웨어 세마포어 알림을 사용하는 OpenAMP용 스니펫 코드가 있는 순서도를 보여줍니다.

다음 표에서는 위에 제시된 OpenAMP API와 기본 파일에 대해 설명합니다.

OpenAMP Linker

OpenAMP의 경우 공유 리소스 테이블과 공유 버퍼에 일부 메모리를 할당해야 합니다. 이는 아래 표에 제시된 구문을 사용하여 두 CPU의 링커 파일에서 수행할 수 있습니다.

FreeRTOS message buffer

이 예는 FreeRTOS™ 메시지 버퍼를 사용하여 한 코어에서 다른 코어로 데이터를 전달하는 방법을 보여줍니다. 각 코어에는 고유한 FreeRTOS™ 인스턴스가 있습니다.

가정:

  • 데이터를 보내는 코어는 코어 1이라고 하는 Cortex®-M7입니다.
  • 데이터를 받는 코어는 코어 2라고 하는 Cortex®-M4입니다.

예시:

1. prvCore1Task()에 의해 구현된 작업은 코어 1에서 실행됩니다. prvCore2Tasks()에 의해 구현된 작업의 두 인스턴스는 코어 2에서 실행됩니다.

2. prvCore1Task()는 메시지 버퍼를 통해 채널당 하나의 메시지 버퍼인 prvCore2Tasks()의 두 인스턴스에 메시지를 보냅니다.

3. 세 번째 메시지 버퍼는 코어 1이 작성한 메시지 버퍼의 핸들을 코어 1에 의해 트리거되지만 코어 2에서 실행되는 인터럽트 서비스 루틴으로 전달하는 데 사용됩니다.

4. 메시지 버퍼를 통한 코어 투 코어 통신은 메시지 버퍼가 공유 메모리 내에서 두 코어 모두에 알려진 주소에 있어야 합니다. 다음 표에서는 FreeRTOS 메시지 버퍼 API에 대해 설명합니다.

Using hardware semaphore

하드웨어 세마포어를 사용하여 CPU 간의 이벤트 전송을 구현하는 방법을 보여주는 기본 예제는 프로젝트 템플릿에 있습니다.

다음 그림은 하드웨어 세마포어를 사용한 동기화 메커니즘을 보여줍니다. 두 코어가 병렬로 부팅되도록 프로그래밍되면 CPU1이 측면에서 시스템 초기화를 완료했음을 CPU2가 알 수 있도록 템플릿 코드 내에서 동기화가 구현됩니다.

EXTI notification example

이 섹션에서는 EXTI를 사용하여 CPU 간의 이벤트 전송을 구현하는 방법을 설명합니다.

첫 번째 그림은 EXTI를 사용한 동기화 메커니즘을 보여주고 두 번째 그림은 EXTI 인터럽트 알림을 위한 스니펫 코드가 있는 순서도를 보여줍니다.

- END -