我用AM572X EVM 来测试IPC的hello例子,根据如下网址:http://processors.wiki.ti.com/index.php/Running_IPC_Examples_on_DRA7xx/AM572x
我建立了CCS工程"DSP1"并生成了DSP1.out文件,此时我加载该DSP1.out到DSP1核上,加载IPC包中的hello_dsp2.xe66到DSP2核上,此时我成功连接了两个核。
然而,我对工程"DSP1"稍作修改成工程"DSP2",此时仅仅是改了peer 从“DSP2”到“DSP1”,并加载DSP2.out到DSP2核上,此时却无法连接。
所以问题是什么呢?对单个工程来说,应该证明我程序没有问题,我想是不是因为CCS调试时的地址问题,因为CCS连接到DSP1核DSP2核时的起始地址都是0x00800000。我加载DSP1.out和DSP2.out分别到DSP1核和DSP2核上时,程序和数据都是从0x800000上开始的,而加载例程的hello_dsp1.xe66和hello_dsp2.xe66时却能正确映射到8C00_0000和8D00_0000,因为这样所以我单个工程结合例子能够成功吗?如果是这样,我该怎么修改程序使我的程序链接到正确的位置?
下面是我的DSP2.C的代码,DSP1.c的代码只是差别在了peer从DSP1改成了DSP2而已。
/*
* ======== HelloDsp2.c ========
* Platform: DRA7XX_bios_elf
*/
/* package header files */
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/Diags.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/Log.h>
#include <xdc/runtime/System.h>
#include <ti/ipc/Ipc.h>
#include <ti/ipc/MessageQ.h>
#include <ti/ipc/MultiProc.h>
#include <ti/ipc/SharedRegion.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
/* local header files */
#include "../SysCfg.h"
/* private functions */
Void App_taskFxn(UArg arg0, UArg arg1);
/* define application role */
#define Role_READER 1
#define Role_WRITER 2
Int role = Role_READER; /* role of this processor */
String peer = "DSP1"; /* name of peer processor */
/*
* ======== main ========
*/
int main(int argc, char *argv[])
{
Error_Block eb;
Task_Params taskParams;
Log_print0(Diags_ENTRY, "main: –>");
/* create main thread (interrupts not enabled in main on BIOS) */
Task_Params_init(&taskParams);
taskParams.instance->name = "App_taskFxn";
taskParams.arg0 = (UArg)argc;
taskParams.arg1 = (UArg)argv;
taskParams.stackSize = 0x1000;
Error_init(&eb);
Task_create(App_taskFxn, &taskParams, &eb);
if (Error_check(&eb)) {
System_abort("main: failed to create application thread");
}
/* start scheduler, this never returns */
BIOS_start();
/* should never get here */
Log_print0(Diags_EXIT, "main: <–");
return (0);
}
/*
* ======== App_taskFxn ========
*/
Void App_taskFxn(UArg arg0, UArg arg1)
{
Int status;
UInt16 remoteProcId;
Log_print0(Diags_ENTRY, "App_taskFxn: –>");
/*
* initialize the ipc layer
*/
status = Ipc_start();
if (status < 0) {
System_abort("Ipc_start failed\n");
}
remoteProcId = MultiProc_getId(peer);
do {
status = Ipc_attach(remoteProcId);
} while ((status < 0) && (status == Ipc_E_NOTREADY));
}
Denny%20Yang99373:
可以对比一下原始的DSP2程序和修改后的DSP2程序。
可能某些接口用法不对