Part Number:TMS320C6678
你好,多核多镜像问题;分为以下步骤:
1,核0运行 将核1的程序按照mxp格式将各个段挑选出来按照重定位到ddr的运行地址空间;
2,boot magic addr地址填入核1的程序入口地址;
3,进行软复位寄存器配置;并给核1发送ipc中断;在线挂仿真器调试,核0无法唤起核1执行;
调试过程:
将核0核1设置为一组,核0上载核0的.out,核1上载核1的.out;运行核0,核0发送ipc中断后,没有唤起核1运行;
因为核1程序中有ddr 0x90000000 写11 ,ipc中断后,没有看到ddr 0x90000000 值的变化 ;
基本配置:
核1的magic地址核IPc中断按照下面的定义填入
// CorePac0-7 IPC 触发寄存器(IPCGRx)
#define IPCGR_0_REGS (*((volatile unsigned int *)(0x02620240)))
#define IPCGR_1_REGS (*((volatile unsigned int *)(0x02620244)))
#define IPCGR_2_REGS (*((volatile unsigned int *)(0x02620248)))
#define IPCGR_3_REGS (*((volatile unsigned int *)(0x0262024C)))
#define IPCGR_4_REGS (*((volatile unsigned int *)(0x02620250)))
#define IPCGR_5_REGS (*((volatile unsigned int *)(0x02620254)))
#define IPCGR_6_REGS (*((volatile unsigned int *)(0x02620258)))
#define IPCGR_7_REGS (*((volatile unsigned int *)(0x0262025C)))
// 核0~核7 魔术地址(L2地址后4字节)
#define CORE_0_MAGIC_ADDR (*((volatile unsigned int *)(0X1087FFFC)))
#define CORE_1_MAGIC_ADDR (*((volatile unsigned int *)(0X1187FFFC)))
#define CORE_2_MAGIC_ADDR (*((volatile unsigned int *)(0X1287FFFC)))
#define CORE_3_MAGIC_ADDR (*((volatile unsigned int *)(0X1387FFFC)))
#define CORE_4_MAGIC_ADDR (*((volatile unsigned int *)(0X1487FFFC)))
#define CORE_5_MAGIC_ADDR (*((volatile unsigned int *)(0X1587FFFC)))
#define CORE_6_MAGIC_ADDR (*((volatile unsigned int *)(0X1687FFFC)))
#define CORE_7_MAGIC_ADDR (*((volatile unsigned int *)(0X1787FFFC)))
// 寄存器锁
#define KICK0 (*((volatile unsigned int *)(0x02620038)))
#define KICK1 (*((volatile unsigned int *)(0x0262003C)))
#define KICK0_UNLOCK (0x83E70B13)
#define KICK1_UNLOCK (0x95A4F1E0)
#define KICK_LOCK (0x1)
Shine:
请问MXP格式是什么格式?用哪个工具生成的?
用仿真器跟踪一下,核0有正确加载核1代码吗?
,
feifei zhang:
mxp就是各个段的size,运行时目的地址,整个程序的入口地址
,
feifei zhang:
上面的问题已经解决:
还有一个问题,就是6678通过寄存器可以对单个内核软复位吗
6678手册中有个CPU local reset
比如,通过核0程序中独立的寄存器复位核1 这个寄存器要如何设置
因为没找到手册中单独对某一个核复位的配置方法
谢谢
,
feifei zhang:
这个软复位是复位寄存器RSTCTRL和RSTCFG这两个寄存器在那个核配置,就对那个核复位吗
,
Shine:
可以通过配置MDCTL[Y].LRSTZ来复位。请参考下面的PSC文档。2.2.3 Local Resethttps://www.ti.com/lit/ug/sprugv4c/sprugv4c.pdf
,
feifei zhang:
我按照你的方法将 MDCTL[16].LRSTZ=0
然后核1就一直处于in reset
怎么再次唤醒核1呀
MDCTL[16].LRSTZ=1也是无法唤醒核1
好像一直处于in reset状态了
,
Shine:
请问是用核0去唤醒核1的吗?
,
feifei zhang:
是的,仿真器配的这个寄存器是在in reset
唤醒后是runing 寄存器读出来状态也对,可是就跑不起来核1
、而且再次对核1复位,核0也挂了
,
feifei zhang:
寄存器是这样配的
本地复位核1
=0x1000
唤醒核1
=0x303
仿真器确实看到核1处于runing了
可是核1就是没跑起来.而且再次复位核1,核0也挂了
,
Shine:
请查看一下MDSTATy寄存器位LRST是不是为1了?
另外,我看到文档里"Execution of code previously in L2 begins execution"这句话,请问core1的代码时从L2开始执行的吗?
,
feifei zhang:
这个我也注意到了,我是在ddr执行的