本帖最后由 zyz0926 于 2025-2-24 17:01 编辑
#申请原创# 双核数据交互方式包括两种:
1.通过IPC外设的固定寄存器来实现基础数据交互
2.通过固定内存地址存放,来实现基础数据交互
方案1的实现形式,各官方手册SDK有完整的例程可以参考,这里不做介绍,其弊端主要为寄存器数量较少,无法实现大型工程下的数据交互问题。
通过固定内存地址的存放,具体实现方法如下(以双核伺服方案的编码器数据交互为案例说明):
步骤为:
1.在CPU1的工程内定义一块独立的RAM内存区域,具体在SCT文件里定义
SCT文件的打开路径为:keil5界面下的options for target->Linker->Edit
在SCT文件内,如图定义RW6的内存区域,
#define __RW6_BASE 0x20000000
#define __RW6_SIZE 0x00000100
在该区域内,不要添加.ANY (+RW +ZI),只定义一个内存块dtcm.instruction RW_DTCM1 __RW6_BASE __RW6_SIZE { ; DTCM data 双核数据交互
.ANY (dtcm.instruction)
}
2.定义一个结构体,起始地址从RW6的起始地址开始
// 声明固定地址
__attribute__((section("dtcm.instruction")))
volatile struct IPCDATA_REGS* const ipcdataregs = (struct IPCDATA_REGS*)0x20000000;
3.定义结构体内部的数据说明
// 定义结构体,并使用 __attribute__ 指定地址
struct IPCDATA_REGS{
int32 encoder_pos_abs;
int32 posifdbenc_abs;
int32 posifdbenc;
int32 EncBrkLineCnt;
int32 encerrcnt;
} ;
#define IPCDATA_REGS_DEFAULTS { 0, 0, 0,0 , 0\
}
extern volatile struct IPCDATA_REGS* const ipcdataregs;
4.在CPU1的PWM中断内完成编码器的数据通讯后,就可以把数据传给该结构体变量
5.在CPU0的PWM中断内读取该地址数据,就可以实现把编码器数据传给CPU0核
p->encoder pos abs=(*(uint32 t *)0xA1100000);
posifdbenc abs=(*(uint32 t*)0xA1100004); //absolute posi
posifdbenc=(*(uint32 t*)0xA1100008);//incremental posi
这里说明一下,该芯片的特殊机制导致,CPU1的0x20000000,CPU0要从0xA1100000去读取,实际是一一对应的。
6.实际仿真数据
这样,我们仿真整个工程时,通过CPU0的工程,就可以在MEMORY的界面下,观测到实际的编码器角度数据,此时电机的编码器数据为0x458905,编码器的位数为23位,对应就可以计算出角度。
注意:双核芯片的RAM不可共享,数据不可直接调用。
|