반응형
우리 프로젝트 내에는 Cortex-M4와 Cortex-M7이 있다. 두 Core는 각각 동작하며, 코드 데이터 영역을 따로 가지고 있다. 그렇다면 두 Core 간 데이터를 주고받기 위해서는 어떻게 해야 할까?
해답은 데이터 시트에 있다.
데이터 시트를 자세히 보면, D3 Domain의 SRAM 4를 Cortex-M4와 Cortex-M7이 공유하고 있다. 이 영역을 두 프로젝트에서 Linker Script를 수정하여 영역을 잡아 주면 해결 가능하다. 나는 해당 영역을 SHARED_RAM으로 이름을 지었다. 해당 영역을 Common Folder에다가 IPC 형태의 소통 창고를 만들 것이다. 바로 아래와 같이.
위와 같이 선언하고 코드를 구현하면 Build Analyzer를 통해서 실제로 할당 된것도 볼 수가 있다.
typedef struct{
uint8_t id;
uint8_t rx_new;
union{
uint32_t word;
uint8_t byte[4];
}data;
}typIpcMsg;
#define IPC_DATA __attribute__ ((section(".shared_bss")))
static IPC_DATA typIpcMsg vIpcMain_Message;
지금 프로젝트 내에 주고 받을 게 없으니 M7의 CPU Load를 보내고 M4가 그 값을 받아봅시다.
static IPC_DATA typIpcMsg vIpcMain_Message;
uint32_t IpcMain_Get_IpcMsg(uint8_t msg_num){
uint32_t return_data;
return_data = vIpcMain_Message.data.word;
return return_data;
}
void IpcMain_Set_IpcMsg(uint8_t msg_num, uint32_t data){
vIpcMain_Message.data.word = data;
}
#include "AppMon_M7.h"
static uint16_t vAppMon_CpuLoad_M7;
static uint32_t vAppMon_Cnt_M7;
void AppMon_Cal_CpuLoad_M7(void){
vAppMon_Cnt_M7++;
vAppMon_CpuLoad_M7 = (uint16_t)(PrjSch_Get_TotalExeTime_us() / 100U); // Tenths Place Value [Unit: 0.1]
IpcMain_Set_IpcMsg(0, (uint32_t)vAppMon_Cnt_M7);
}
#include "AppMon_M4.h"
static uint16_t vAppMon_CpuLoad_M4;
static uint32_t vAppMon_Cnt_M4;
void AppMon_Cal_CpuLoad_M4(void){
vAppMon_Cnt_M4 = IpcMain_Get_IpcMsg(0);
vAppMon_CpuLoad_M4 = (uint16_t)(PrjSch_Get_TotalExeTime_us() / 100U); // Tenths Place Value [Unit: 0.1]
}
uint16_t AppMon_Get_CpuLoad_M4(void){
uint16_t cpuload;
cpuload = vAppMon_CpuLoad_M4;
return cpuload;
}
보면 M7의 데이터(vAppMon_Cnt_M7)가 M4 데이터(vAppMon_Cnt_M4)로 자알 복사가 된 것을 볼 수가 있다.
오늘 개발 끝
Github 주소: https://github.com/DongjinJ/Whale_Mk1
반응형
'프로젝트 일지 > Whale Car' 카테고리의 다른 글
[Whale Car] Motor 제어 - H-Bridge & Encoder (0) | 2025.04.30 |
---|---|
[Whale Car] Motor 제어 - PWM (0) | 2025.03.05 |
[Whale Car] Schedule 이식 그리고 CPU Load (0) | 2024.10.21 |
[Whale Car] 1ms Timer의 늪 (5) | 2024.10.15 |
[Whale Car] STM32H745ZIQ 보드 연결 (0) | 2024.10.03 |