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에 메시지를 보낼 수도 있습니다.
![](https://blog.kakaocdn.net/dn/bSiE92/btsBjQtBcTB/BKt2KWPLBW6yBH2vVcLMmk/img.png)
이 그림은 하드웨어 세마포어 알림을 사용하는 OpenAMP용 스니펫 코드가 있는 순서도를 보여줍니다.
![](https://blog.kakaocdn.net/dn/bT6f06/btsBgcrymAO/xsqjIr2pZzN9jNrgngwSZK/img.png)
다음 표에서는 위에 제시된 OpenAMP API와 기본 파일에 대해 설명합니다.
![](https://blog.kakaocdn.net/dn/EJsCN/btsBj7PyypL/f0IFHXp1WbY7rByJMZAIq1/img.png)
OpenAMP Linker
OpenAMP의 경우 공유 리소스 테이블과 공유 버퍼에 일부 메모리를 할당해야 합니다. 이는 아래 표에 제시된 구문을 사용하여 두 CPU의 링커 파일에서 수행할 수 있습니다.
![](https://blog.kakaocdn.net/dn/He9OZ/btsBgyuhOAX/xt9SBNUKEkgVRdP3BtSKjk/img.png)
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에 대해 설명합니다.
![](https://blog.kakaocdn.net/dn/cyUm4t/btsBip4BG9x/VdewgjxfuvO4j7Tj4NRgyK/img.png)
Using hardware semaphore
하드웨어 세마포어를 사용하여 CPU 간의 이벤트 전송을 구현하는 방법을 보여주는 기본 예제는 프로젝트 템플릿에 있습니다.
다음 그림은 하드웨어 세마포어를 사용한 동기화 메커니즘을 보여줍니다. 두 코어가 병렬로 부팅되도록 프로그래밍되면 CPU1이 측면에서 시스템 초기화를 완료했음을 CPU2가 알 수 있도록 템플릿 코드 내에서 동기화가 구현됩니다.
![](https://blog.kakaocdn.net/dn/bblmZA/btsBiPITAxS/uajmeXBMJjOh4CCs1oTuF0/img.png)
EXTI notification example
이 섹션에서는 EXTI를 사용하여 CPU 간의 이벤트 전송을 구현하는 방법을 설명합니다.
첫 번째 그림은 EXTI를 사용한 동기화 메커니즘을 보여주고 두 번째 그림은 EXTI 인터럽트 알림을 위한 스니펫 코드가 있는 순서도를 보여줍니다.
![](https://blog.kakaocdn.net/dn/bENNdK/btsBgvK1oMP/tH9AhflQiJggFIfQqR1zv1/img.png)
![](https://blog.kakaocdn.net/dn/oGsHY/btsBjRsuJC2/LJ2LluTVVb6bjGNIMDS9FK/img.png)
- END -
'▶ STM32 > Peripheral' 카테고리의 다른 글
STM32 에서 ADC Polling conversion 하는 방법(1) (0) | 2023.12.08 |
---|---|
STM32F7과 STM32H7 의 L1 캐시에 대해 (1) | 2023.12.03 |
STM32H7 Inter-processor communication (4) - Using STM32H7hardware resources (0) | 2023.12.03 |
STM32H7 Inter-processor communication (3) - FreeRTOS message buffer (0) | 2023.12.03 |
STM32H7 Inter-processor communication (2) - OpenAMP (1) | 2023.12.03 |